///|
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))
}