scarlet_queen_replenisher/
from_top.rs

1use std::rc::Rc;
2
3use scarlet_queen_core::each_individual::{
4    EachCrateIndividual, Individual, ReplenisherIndividualTrait,
5};
6
7pub struct FromTopReplenisherIndividual<T, const N: usize, const R: usize>
8where
9    T: Clone,
10{
11    individual: Rc<Individual<T>>,
12}
13
14impl<T, const N: usize, const R: usize> EachCrateIndividual
15    for FromTopReplenisherIndividual<T, N, R>
16where
17    T: Clone,
18{
19    type Item = T;
20
21    fn new(individual: &std::rc::Rc<scarlet_queen_core::each_individual::Individual<T>>) -> Self {
22        FromTopReplenisherIndividual {
23            individual: Rc::clone(individual),
24        }
25    }
26
27    fn get_individual(&self) -> &Individual<T> {
28        &self.individual
29    }
30}
31
32impl<T, const N: usize, const R: usize> ReplenisherIndividualTrait<N, R>
33    for FromTopReplenisherIndividual<T, N, R>
34where
35    T: Clone,
36{
37    fn replenish<'a, U>(group: U) -> Vec<T>
38    where
39        U: IntoIterator<Item = &'a Self>,
40        Self: 'a,
41    {
42        let group: Vec<T> = group
43            .into_iter()
44            .map(|v| v.get_value().clone())
45            .collect::<Vec<T>>();
46        group.into_iter().cycle().take(N - R).collect::<Vec<T>>()
47    }
48}