use crate::arc::Arc;
use crate::fst_traits::CoreFst;
use crate::StateId;
use failure::Fallible;
pub trait StateIterator<'a> {
type Iter: Iterator<Item = StateId>;
fn states_iter(&'a self) -> Self::Iter;
}
pub trait ArcIterator<'a>: CoreFst
where
Self::W: 'a,
{
type Iter: Iterator<Item = &'a Arc<Self::W>> + Clone;
fn arcs_iter(&'a self, state_id: StateId) -> Fallible<Self::Iter>;
unsafe fn arcs_iter_unchecked(&'a self, state_id: StateId) -> Self::Iter;
}
pub trait FstIterator: CoreFst {
type StateIndex: Copy;
type ArcIndex: Copy;
type ArcIter: Iterator<Item = Self::ArcIndex> + Clone;
type StateIter: Iterator<Item = Self::StateIndex> + Clone;
fn states_index_iter(&self) -> Self::StateIter;
fn arcs_index_iter(&self, state: Self::StateIndex) -> Fallible<Self::ArcIter>;
fn get_state_id(&self, state_idx: Self::StateIndex) -> Fallible<StateId>;
fn get_arc<'a>(
&'a self,
state: Self::StateIndex,
arc: Self::ArcIndex,
) -> Fallible<&'a Arc<Self::W>>;
}
pub trait FstIteratorMut: FstIterator {
fn modify_arc<F>(
&mut self,
state: Self::StateIndex,
arc: Self::ArcIndex,
modify: F,
) -> Fallible<()>
where
F: Fn(&mut Arc<Self::W>) -> Fallible<()>;
}