use super::transition::Transition;
use crate::letter::Letter;
use std::fmt;
#[derive(Clone, Debug)]
pub struct State {
pub name: String,
pub transitions: Vec<Transition>,
}
impl State {
pub fn new(name: String) -> Self {
State {
name,
transitions: Vec::new(),
}
}
pub fn add_transition(&mut self, transition: Transition) {
self.transitions.push(transition);
}
pub fn get_transition(&self, input_letter: &Letter) -> Option<&Transition> {
self.transitions
.iter()
.find(|t| t.input_letter == *input_letter)
}
pub fn visit(&self, input_letter: &Letter) -> Option<(&Letter, &State)> {
for transition in &self.transitions {
if &transition.input_letter == input_letter {
return Some((&transition.output_letter, &transition.output_state));
}
}
None
}
}
impl PartialEq for State {
fn eq(&self, other: &Self) -> bool {
self.name == other.name
}
}
impl Eq for State {}
impl fmt::Display for State {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.name)
}
}