scarlet_queen_replenisher/
tournament.rs

1use 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}