use crate::{automaton_state::new_shared_concrete_state, simple_impl::simple_state::{KeyProvidingData, SharedSimpleState, SimpleStateImplementation}};
use super::definer::SeriesDefiner;
pub struct SeriesBuilder<'a, K, Id: Copy, D: KeyProvidingData<K>, E> {
root: SharedSimpleState<'a, K, Id, D, E>,
definer: SeriesDefiner<'a, K, Id, D, E>,
}
impl <'a, K, Id: Copy, D: KeyProvidingData<K>, E> SeriesBuilder<'a, K, Id, D, E> {
pub fn new_without_default_action(root: SimpleStateImplementation<'a, K, Id, D, E>) -> SeriesBuilder<'a, K, Id, D, E> {
let root_shared = new_shared_concrete_state(root);
SeriesBuilder {
definer: SeriesDefiner::new_without_default_action(&root_shared),
root: root_shared,
}
}
pub fn new<FDExec: Fn(&mut D, &K) -> Result<(), E> + 'a>(root: SimpleStateImplementation<'a, K, Id, D, E>, default_execution_function: FDExec) -> SeriesBuilder<'a, K, Id, D, E> {
let root_shared = new_shared_concrete_state(root);
SeriesBuilder {
definer: SeriesDefiner::new(&root_shared, default_execution_function),
root: root_shared,
}
}
pub fn next_state<M>(mut self, matcher: M, next_state: SimpleStateImplementation<'a, K, Id, D, E>) -> SeriesBuilder<'a, K, Id, D, E>
where M: 'a + Fn(&K) -> bool
{
let next_state_shared = new_shared_concrete_state(next_state);
self.definer = self.definer.next_state(matcher, &next_state_shared);
self
}
pub fn next_state_external<M>(mut self, matcher: M, next_state: &SharedSimpleState<'a, K, Id, D, E>) -> SeriesBuilder<'a, K, Id, D, E>
where M: 'a + Fn(&K) -> bool
{
self.definer = self.definer.next_state(matcher, next_state);
self
}
pub fn build(self) -> SharedSimpleState<'a, K, Id, D, E> {
self.root
}
}