use crate::finite::automaton::FiniteAutomaton;
use crate::finite::nondeterministic::NonDeterministicFiniteAutomaton;
use crate::general::DeterministicAutomaton;
pub trait DeterministicFiniteAutomaton: DeterministicAutomaton + FiniteAutomaton {
type CorrespondingNFA: NonDeterministicFiniteAutomaton<State = Self::State, Input = Self::Input, CorrespondingDFA = Self>;
fn to_nfa(&self) -> Self::CorrespondingNFA;
fn minimize(&self) -> Self;
fn complete(&self) -> Self;
fn to_nfa_all(automata: impl IntoIterator<Item = Self>) -> impl IntoIterator<Item = Self::CorrespondingNFA>
where Self: Sized
{
automata.into_iter().map(|a| a.to_nfa())
}
}