use super::types::TransitionFunction;
use crate::sequence_part::types::AliveElementsPart;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WithoutInitialElements;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WithInitialElements(usize);
impl WithInitialElements {
pub fn new(initial_elements_len: usize) -> Self {
Self(initial_elements_len)
}
pub fn len(&self) -> usize {
self.0
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WithoutTransitionFunction;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WithTransitionFunction<T, I>(TransitionFunction<T, I>);
impl<T, I> WithTransitionFunction<T, I> {
pub(super) fn new(trans_func: TransitionFunction<T, I>) -> Self {
Self(trans_func)
}
pub(super) fn transition_function(&self) -> TransitionFunction<T, I> {
self.0
}
pub(super) fn run(
&self,
alive_elements_part: AliveElementsPart<'_, T, I>,
current_element_index: usize,
) -> T {
(self.transition_function())(alive_elements_part, current_element_index)
}
}