autour_core/dfa/implem/
run.rs1use std::collections::HashSet;
18use maplit::hashset;
19
20use crate::traits::letter::AutLetter;
21use crate::traits::run::AutRunnable;
22use crate::dfa::dfa::AutDFA;
23use crate::traits::error::AutError;
24
25
26impl<Letter: AutLetter> AutRunnable<Letter> for AutDFA<Letter> {
27 fn runs_trace(&self, trace : &[Letter]) -> Result<bool,AutError<Letter>> {
28 let mut current_state = self.initial;
29 for letter in trace {
30 match self.transitions[current_state].get(letter) {
31 None => {
32 return Ok(false);
33 },
34 Some(target_state) => {
35 current_state = *target_state;
36 }
37 }
38 }
39 Ok(self.finals.contains(¤t_state))
41 }
42
43 fn run_transition(&self,
44 active_states: &HashSet<usize>,
45 letter: &Letter) -> Result<HashSet<usize>,AutError<Letter>> {
46 if active_states.len() != 1 {
47 return Err(AutError::Other(format!("dfa has at most one active state and not {:?}", active_states)));
48 }
49 let init_state = *active_states.iter().next().unwrap();
50 match self.transitions[init_state].get(letter) {
51 None => {
52 Ok(hashset!{})
53 },
54 Some(target_state) => {
55 Ok(hashset!{*target_state})
56 }
57 }
58 }
59}