pub mod definer;
pub mod builder;
#[macro_export]
macro_rules! series {
($iter:expr, $root:ident, $matcher_gen:ident, $id_gen:expr) => {
$crate::series!($iter, $root, $matcher_gen, $id_gen, |_,_| {Result::Ok(())})
};
($iter:expr, $root:ident, $matcher_gen:ident, $id_gen:expr, $default_exec:expr) => {
$crate::series!($iter, $root, $matcher_gen, $id_gen, |_,_| {Result::Ok(())}, |_,_| {Result::Ok(())})
};
($iter:expr, $root:ident, $matcher_gen:ident, $id_gen:expr, $default_exec:expr, $inter_state_exec:expr) => {
{
let mut defined_states = Vec::new();
let mut definer = $crate::simple_impl::series::definer::SeriesDefiner::new(&$root, $default_exec);
for x in $iter.enumerate() {
let state = $crate::automaton_state::new_shared_concrete_state(SimpleStateImplementation::new(($id_gen)(x.0, x.1)));
definer = definer.next_state_exec(($matcher_gen)(x.1), &state, $inter_state_exec);
defined_states.push(state);
}
defined_states
}
};
}
#[cfg(test)]
mod tests {
use std::{cell::RefCell, rc::Rc};
use crate::{automaton::Automaton, automaton_state::new_shared_concrete_state, simple_impl::simple_state::{SimpleInterStateConnection, SimpleStateImplementation}, test_commons::{enumerated_char_matcher, MatchListCopiedTestData}};
#[test]
fn series_from_string() -> () {
let mut automaton = Automaton::new({
let root: Rc<RefCell<SimpleStateImplementation<'_, (usize, char), u8, MatchListCopiedTestData<char>, String>>> = new_shared_concrete_state(SimpleStateImplementation::new(0));
let a2: Rc<RefCell<SimpleStateImplementation<'_, (usize, char), u8, MatchListCopiedTestData<char>, String>>> = new_shared_concrete_state(SimpleStateImplementation::new(4));
let defined_states = series!(
"abb".chars(),
root,
enumerated_char_matcher,
|i, _| i as u8);
assert_eq!(defined_states.len(), 3);
defined_states.get(2).unwrap().borrow_mut().register_connection(SimpleInterStateConnection::new(enumerated_char_matcher('a'), |data, k| {
data.set_match(k.0);
Result::Ok(())
}, &a2));
defined_states.get(2).unwrap().borrow_mut().register_connection(SimpleInterStateConnection::new_no_action(enumerated_char_matcher('a'), defined_states.get(0).unwrap()));
a2.borrow_mut().register_connection(SimpleInterStateConnection::new_no_action_always_matched(&root));
root.borrow_mut().register_connection(SimpleInterStateConnection::new_no_action_always_matched(&root));
root
});
let mut data = MatchListCopiedTestData::new("aaabbaba".chars().collect());
let automaton_result = automaton.run(&mut data);
assert!(automaton_result.is_empty_iter());
assert_eq!(data.matches().len(), 1);
assert_eq!(*data.matches().get(0).unwrap(), 5);
}
}