use crate::common::*;
use crate::individual::*;
use crate::population::*;
use crate::random::*;
pub trait GeneticOperator: std::fmt::Debug + Clone {}
impl<T: std::fmt::Debug + Clone> GeneticOperator for T {}
pub trait SelectionOperator: GeneticOperator {
fn select_from<'a, G, R>(&self, population: &'a Population<G>, rng: &mut R) -> Vec<Member<'a, G>>
where
G: Genome,
R: Rng + Sized;
}
pub trait VariationOperator<G>: GeneticOperator
where
G: Genome,
{
fn breed_from<R: Rng + Sized>(&self, parents: &[Member<G>], rng: &mut R) -> Vec<G>;
}
pub trait ReplacementOperator: GeneticOperator {
fn remove_from<G: Genome, R: Rng + Sized>(&self, n: usize, population: &mut Population<G>, rng: &mut R);
}
pub mod replacement;
pub mod selection;
pub mod variation;