use crate::prelude::{Entry, Path, Tree};
use super::{depth::Traversal, TraversalNode};
pub struct Combine<I, R, N, B, const BOUND: bool>
where
R: Deref<Target = Tree<N, B>>,
{
iter: I,
other: Entry<R, N, B, BOUND>,
}
impl<I, R, N, B, const BOUND: bool> Combine<I, R, N, B, BOUND>
where
I: Iterator,
R: Deref<Target = Tree<N, B>>,
{
pub fn new(iter: I, other: Entry<R, N, B, BOUND>) -> Combine<I, R, N, B, BOUND> {
Combine { iter, other }
}
}
impl<I, NI, R, N, B, const BOUND: bool> Iterator for Combine<I, R, N, B, BOUND>
where
I: Iterator<Item = Traversal<NI, B>>,
R: Deref<Target = Tree<N, B>>,
B: Clone,
{
type Item = TraversalNode<(Option<N1>, Option<N2>), B>;
fn next(&mut self) -> Option<Self::Item> {
todo!();
if let Some(last) = self.children.last_mut() {
if let Some((branch, node_idx)) = last.next() {
let node = &self.tree.nodes[*node_idx];
self.children.push(node.children.iter());
Some(Traversal::Step {
up: std::mem::replace(&mut self.up, 0),
branch,
data: T::target(self.tree, *node_idx),
})
} else {
self.children.pop();
self.up += 1;
self.next()
}
} else if let Some(root) = self.root.take() {
let node = &self.tree.nodes[root];
self.children.push(node.children.iter());
Some(Traversal::Start(T::target(self.tree, root)))
} else {
None
}
}
}