use super::{Valid, gene::Gene};
pub trait Chromosome: Valid {
type Gene: Gene;
fn as_slice(&self) -> &[Self::Gene];
fn as_mut_slice(&mut self) -> &mut [Self::Gene];
fn get(&self, index: usize) -> &Self::Gene {
&self.as_slice()[index]
}
fn get_mut(&mut self, index: usize) -> &mut Self::Gene {
&mut self.as_mut_slice()[index]
}
fn set(&mut self, index: usize, gene: Self::Gene) {
self.as_mut_slice()[index] = gene;
}
fn len(&self) -> usize {
self.as_slice().len()
}
fn iter(&self) -> impl Iterator<Item = &Self::Gene> {
self.as_slice().iter()
}
fn iter_mut(&mut self) -> impl Iterator<Item = &mut Self::Gene> {
self.as_mut_slice().iter_mut()
}
fn zip_mut<'a>(
&'a mut self,
other: &'a mut Self,
) -> impl Iterator<Item = (&'a mut Self::Gene, &'a mut Self::Gene)> {
self.iter_mut().zip(other.iter_mut())
}
}