scarlet_queen_replenisher/
from_top.rs1use 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}