// R-tree iteration helpers (iter + drain).
///|
/// Lazy depth-first iterator over every leaf entry's value reachable from
/// `node`.
fn[T] node_iter_values(node : Node[T]) -> Iter[T] {
match node {
Leaf(_, entries) => entries.iter().map(fn(e) { e.value })
Internal(_, children) =>
children.iter().flat_map(fn(c) { node_iter_values(c) })
}
}
///|
/// Lazy iterator over every stored value, in arbitrary (depth-first tree)
/// order.
pub fn[T] RTree::iter(self : RTree[T]) -> Iter[T] {
match self.root {
None => Iter::empty()
Some(root) => node_iter_values(root)
}
}
///|
/// Removes and returns every stored value, leaving the tree empty.
pub fn[T] RTree::drain(self : RTree[T]) -> Array[T] {
let result = self.iter().collect()
self.root = None
self.size = 0
result
}