diff options
author | Zhongheng Liu <z.liu@outlook.com.gr> | 2025-01-16 22:05:52 +0200 |
---|---|---|
committer | Zhongheng Liu <z.liu@outlook.com.gr> | 2025-01-16 22:05:52 +0200 |
commit | b462df2f3a294711bd47a26b2bc93397318d738a (patch) | |
tree | b1c9f8315c0b0fba0ae6dc939ad80301b228caa4 | |
parent | 30f6761973259fd710f865740d154c472266c682 (diff) | |
download | rpn-parse-rs-b462df2f3a294711bd47a26b2bc93397318d738a.tar.gz rpn-parse-rs-b462df2f3a294711bd47a26b2bc93397318d738a.tar.bz2 rpn-parse-rs-b462df2f3a294711bd47a26b2bc93397318d738a.zip |
feat(rpntree): move typedefs to dir
Created new binary tree structure to store any arbitrary datatype T with
Copy trait.
Init module declarations for separation of concerns.
-rw-r--r-- | src/rpntree/types.rs | 1 | ||||
-rw-r--r-- | src/rpntree/types/tree.rs | 79 |
2 files changed, 80 insertions, 0 deletions
diff --git a/src/rpntree/types.rs b/src/rpntree/types.rs new file mode 100644 index 0000000..87821cc --- /dev/null +++ b/src/rpntree/types.rs @@ -0,0 +1 @@ +pub mod tree; diff --git a/src/rpntree/types/tree.rs b/src/rpntree/types/tree.rs new file mode 100644 index 0000000..1ea7016 --- /dev/null +++ b/src/rpntree/types/tree.rs @@ -0,0 +1,79 @@ +use std::fmt::Display; +pub struct Tree<T: Copy> { + pub root_node: TreeNode<T>, +} +impl<T: Copy> Tree<T> { + pub fn reduce<R>(&self, reducer: fn(Option<R>, T, Option<R>) -> R) -> R { + self.root_node.reduce(reducer) + } + pub fn new(root_val: T) -> Tree<T> { + Tree::<T> { + root_node: TreeNode::<T> { + value: root_val, + left: None, + right: None, + }, + } + } +} +impl<T: Display + Copy> Display for Tree<T> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.root_node) + } +} +pub struct TreeNode<T: Copy> { + pub value: T, + pub left: Option<Box<TreeNode<T>>>, + pub right: Option<Box<TreeNode<T>>>, +} +impl<T: Copy + Display> Display for TreeNode<T> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}{}{}", + match &self.left { + Some(v) => format!("({})<-", v.to_string()), + None => "".to_string(), + }, + format!("({})", self.value), + match &self.right { + Some(v) => format!("->({})", v.to_string()), + None => "".to_string(), + } + ) + } +} +impl<T: Copy> TreeNode<T> { + pub fn new(v: T) -> TreeNode<T> { + TreeNode { + value: v, + left: None, + right: None, + } + } + pub fn reduce<R>(&self, reducer: fn(Option<R>, T, Option<R>) -> R) -> R { + let left_val = match &self.left { + Some(node) => Some(node.reduce(reducer)), + None => None, + }; + let right_val = match &self.right { + Some(node) => Some(node.reduce(reducer)), + None => None, + }; + reducer(left_val, self.value, right_val) + } + pub fn insert_left(&mut self, value: T) { + self.left = Some(Box::new(TreeNode { + value, + left: None, + right: None, + })); + } + pub fn insert_right(&mut self, value: T) { + self.right = Some(Box::new(TreeNode { + value, + left: None, + right: None, + })); + } +} |