use crate::IndexedClimber;
pub struct Dfs<C: IndexedClimber> {
climber: C,
stack: Vec<C::Index>,
}
impl<C: IndexedClimber> Dfs<C> {
pub fn new(climber: C) -> Self {
let index = climber.index();
Self {
climber,
stack: vec![index],
}
}
}
impl<C: IndexedClimber> Iterator for Dfs<C> {
type Item = C::Item;
fn next(&mut self) -> Option<Self::Item> {
let index = self.stack.pop()?;
let item = self.climber.go_to(&index)?;
self.stack.extend(self.climber.child_indices().rev());
Some(item)
}
}