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