summaryrefslogtreecommitdiffstats
path: root/src/ntree.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ntree.rs')
-rw-r--r--src/ntree.rs81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/ntree.rs b/src/ntree.rs
new file mode 100644
index 0000000..26c241c
--- /dev/null
+++ b/src/ntree.rs
@@ -0,0 +1,81 @@
+
+#[derive(Clone)]
+pub struct NTreeNode<T>
+{
+ value: T,
+ children: Vec<NTreeNode<T>>
+
+}
+
+#[derive(Default, Clone)]
+pub struct NTree<T>
+{
+ root: Option<NTreeNode<T>>
+}
+
+impl<T> NTree<T>
+{
+ 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<T>)
+ {
+ self.root = Some(node);
+ }
+
+ pub fn root(&self) -> &Option<NTreeNode<T>> { &self.root }
+ pub fn root_mut(&mut self) -> &mut Option<NTreeNode<T>> { &mut self.root }
+}
+
+impl<T> NTreeNode<T>
+{
+ 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<T>] { &self.children.as_slice() }
+
+ pub fn as_tree(self)
+ -> NTree<T>
+ {
+ 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<T>)
+ {
+ self.children.push(subtree);
+ }
+
+ pub fn insert_tree(
+ &mut self,
+ subtree: NTree<T>)
+ {
+ match subtree.root {
+ Some(subtree_root) => self.insert_node(subtree_root),
+ None => { panic!("Tried to put null subtree") }
+ }
+ }
+}