use super::Codec;
use crate::{BitChromosome, Chromosome, Gene, Genotype};
use std::sync::Arc;
#[derive(Clone)]
pub struct SubSetCodec<T> {
items: Arc<[Arc<T>]>,
}
impl<T> SubSetCodec<T> {
pub fn new(items: Vec<T>) -> Self {
SubSetCodec {
items: items.into_iter().map(Arc::new).collect(),
}
}
}
impl<T> Codec<BitChromosome, Vec<Arc<T>>> for SubSetCodec<T> {
fn encode(&self) -> Genotype<BitChromosome> {
Genotype::new(vec![BitChromosome::new(self.items.len())])
}
fn decode(&self, genotype: &Genotype<BitChromosome>) -> Vec<Arc<T>> {
let mut result = Vec::new();
for (i, gene) in genotype.iter().next().unwrap().iter().enumerate() {
if *gene.allele() {
result.push(Arc::clone(&self.items[i]));
}
}
result
}
}