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