use crate::{Chromosome, Codec, Genotype};
use std::sync::Arc;
#[derive(Default, Clone)]
pub struct FnCodec<C: Chromosome, T> {
encoder: Option<Arc<dyn Fn() -> Genotype<C>>>,
decoder: Option<Arc<dyn Fn(&Genotype<C>) -> T>>,
}
impl<C: Chromosome, T> FnCodec<C, T> {
pub fn new() -> Self {
FnCodec {
encoder: None,
decoder: None,
}
}
pub fn with_encoder<F>(mut self, encoder: F) -> Self
where
F: Fn() -> Genotype<C> + 'static,
{
self.encoder = Some(Arc::new(encoder));
self
}
pub fn with_decoder<F>(mut self, decoder: F) -> Self
where
F: Fn(&Genotype<C>) -> T + 'static,
{
self.decoder = Some(Arc::new(decoder));
self
}
}
impl<C: Chromosome, T> Codec<C, T> for FnCodec<C, T> {
fn encode(&self) -> Genotype<C> {
match &self.encoder {
Some(encoder) => encoder(),
None => panic!("Encoder function is not set"),
}
}
fn decode(&self, genotype: &Genotype<C>) -> T {
match &self.decoder {
Some(decoder) => decoder(genotype),
None => panic!("Decoder function is not set"),
}
}
}