use sim_kernel::Ref;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum BacktrackStep {
Choice(Ref),
Failed,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Backtracker {
alternatives: Vec<Ref>,
index: usize,
}
impl Backtracker {
pub fn new(alternatives: Vec<Ref>) -> Self {
Self {
alternatives,
index: 0,
}
}
pub fn choose(&mut self) -> BacktrackStep {
let Some(choice) = self.alternatives.get(self.index).cloned() else {
return BacktrackStep::Failed;
};
self.index += 1;
BacktrackStep::Choice(choice)
}
pub fn fail(&mut self) -> BacktrackStep {
self.choose()
}
}