use std::iter::FusedIterator;
use crate::node::TreeNode;
use super::functional::dfs_reach;
pub struct DepthFirstTraversal<N> {
state: Box<dyn FusedIterator<Item = N>>,
}
impl<C, N> DepthFirstTraversal<N>
where
C: Copy + Ord + 'static,
N: TreeNode<Cost = C> + 'static,
{
pub fn new(root_node: N) -> Self {
let state = dfs_reach(root_node, |n: &N| n.generate_child_nodes());
Self {
state: Box::new(state),
}
}
}
impl<N> Iterator for DepthFirstTraversal<N> {
type Item = N;
fn next(&mut self) -> Option<Self::Item> {
self.state.next()
}
}
impl<N> FusedIterator for DepthFirstTraversal<N> {}