pub mod bp;
pub(crate) mod mmt;
pub trait Tree {
type NodeHandle;
fn root(&self) -> Option<Self::NodeHandle>;
fn parent(&self, node: Self::NodeHandle) -> Option<Self::NodeHandle>;
fn first_child(&self, node: Self::NodeHandle) -> Option<Self::NodeHandle>;
fn next_sibling(&self, node: Self::NodeHandle) -> Option<Self::NodeHandle>;
fn previous_sibling(&self, node: Self::NodeHandle) -> Option<Self::NodeHandle>;
fn last_child(&self, node: Self::NodeHandle) -> Option<Self::NodeHandle>;
fn node_index(&self, node: Self::NodeHandle) -> usize;
fn node_handle(&self, index: usize) -> Self::NodeHandle;
fn is_leaf(&self, node: Self::NodeHandle) -> bool;
fn depth(&self, node: Self::NodeHandle) -> u64;
fn size(&self) -> usize;
fn is_empty(&self) -> bool {
self.size() == 0
}
}
pub trait SubtreeSize: Tree {
fn subtree_size(&self, node: Self::NodeHandle) -> Option<usize>;
}
pub trait IsAncestor: Tree {
fn is_ancestor(&self, ancestor: Self::NodeHandle, descendant: Self::NodeHandle)
-> Option<bool>;
}
pub trait LevelTree: Tree {
fn level_ancestor(&self, node: Self::NodeHandle, level: u64) -> Option<Self::NodeHandle>;
fn level_next(&self, node: Self::NodeHandle) -> Option<Self::NodeHandle>;
fn level_prev(&self, node: Self::NodeHandle) -> Option<Self::NodeHandle>;
fn level_leftmost(&self, level: u64) -> Option<Self::NodeHandle>;
fn level_rightmost(&self, level: u64) -> Option<Self::NodeHandle>;
}
pub trait TreeBuilder {
type Tree;
fn enter_node(&mut self);
fn leave_node(&mut self);
fn build(self) -> Result<Self::Tree, i64>;
}