rust_lstar/automata/
state.rs1use super::transition::Transition;
2use crate::letter::Letter;
3use std::fmt;
4
5#[derive(Clone, Debug)]
7pub struct State {
8 pub name: String,
10 pub transitions: Vec<Transition>,
12}
13
14impl State {
15 pub fn new(name: String) -> Self {
17 State {
18 name,
19 transitions: Vec::new(),
20 }
21 }
22
23 pub fn add_transition(&mut self, transition: Transition) {
25 self.transitions.push(transition);
26 }
27
28 pub fn get_transition(&self, input_letter: &Letter) -> Option<&Transition> {
30 self.transitions
31 .iter()
32 .find(|t| t.input_letter == *input_letter)
33 }
34
35 pub fn visit(&self, input_letter: &Letter) -> Option<(&Letter, &State)> {
40 for transition in &self.transitions {
41 if &transition.input_letter == input_letter {
42 return Some((&transition.output_letter, &transition.output_state));
43 }
44 }
45 None
46 }
47}
48
49impl PartialEq for State {
50 fn eq(&self, other: &Self) -> bool {
51 self.name == other.name
52 }
53}
54
55impl Eq for State {}
56
57impl fmt::Display for State {
58 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
59 write!(f, "{}", self.name)
60 }
61}