#[derive(Clone)] pub struct NTreeNode { value: T, children: Vec> } #[derive(Default, Clone)] pub struct NTree { root: Option> } impl NTree { pub fn set_root_val( &mut self, val: T) { self.root = Some(NTreeNode { value: val, children: vec![] }); } pub fn set_root( &mut self, node: NTreeNode) { self.root = Some(node); } pub fn root(&self) -> &Option> { &self.root } pub fn root_mut(&mut self) -> &mut Option> { &mut self.root } } impl NTreeNode { pub fn new(val: T) -> Self { Self { value: val, children: vec![] } } pub fn value(&self) -> &T { &self.value } pub fn value_mut(&mut self) -> &mut T { &mut self.value } pub fn children(&self) -> &[NTreeNode] { &self.children.as_slice() } pub fn as_tree(self) -> NTree { NTree { root: Some(self) } } pub fn insert_value( &mut self, val: T) { self.children.push(NTreeNode { value: val, children: vec![] }); } pub fn insert_node( &mut self, subtree: NTreeNode) { self.children.push(subtree); } pub fn insert_tree( &mut self, subtree: NTree) { match subtree.root { Some(subtree_root) => self.insert_node(subtree_root), None => { panic!("Tried to put null subtree") } } } }