///|
priv struct InorderIterator[N](Array[Tree[N]])
///|
fn[N] InorderIterator::new(root : T[N]) -> InorderIterator[N] {
let iter = InorderIterator([])
iter..move_left(root)
iter
}
///|
fn[N] InorderIterator::move_left(
self : InorderIterator[N],
node : T[N],
) -> Unit {
loop node {
Empty => ()
Node(left~, ..) as curr => {
self.0.push(curr)
continue left
}
}
}
///|
fn[N] InorderIterator::next(self : InorderIterator[N]) -> (N, N)? {
guard self.0.pop() is Some(curr) else { return None }
guard curr is Node(min~, max~, right~, ..)
self.move_left(right)
Some((min, max))
}