diff --git a/Cargo.toml b/Cargo.toml index 0b84ff3..5b60835 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "im_ternary_tree" -version = "0.0.2-a1" +version = "0.0.2-a2" edition = "2021" authors = ["jiyinyiyong "] license = "MIT" diff --git a/src/lib.rs b/src/lib.rs index 490e7fa..a8e074a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -164,7 +164,7 @@ where match self { Empty => { if idx == 0 { - Ok(TernaryTreeList::Tree(TernaryTree::Leaf(item))) + Ok(TernaryTreeList::Tree(TernaryTree::Leaf(Arc::new(item)))) } else { Err(String::from("inserting into empty, but index is not 0")) } @@ -199,7 +199,7 @@ where } pub fn prepend(&self, item: T, disable_balancing: bool) -> Self { match self { - Empty => TernaryTreeList::Tree(TernaryTree::Leaf(item)), + Empty => TernaryTreeList::Tree(TernaryTree::Leaf(Arc::new(item))), Tree(t) => TernaryTreeList::Tree(t.prepend(item, disable_balancing)), } } @@ -208,13 +208,13 @@ where } pub fn append(&self, item: T, disable_balancing: bool) -> Self { match self { - Empty => TernaryTreeList::Tree(TernaryTree::Leaf(item)), + Empty => TernaryTreeList::Tree(TernaryTree::Leaf(Arc::new(item))), Tree(t) => TernaryTreeList::Tree(t.append(item, disable_balancing)), } } pub fn push_right(&self, item: T) -> Self { match self { - Empty => TernaryTreeList::Tree(TernaryTree::Leaf(item)), + Empty => TernaryTreeList::Tree(TernaryTree::Leaf(Arc::new(item))), Tree(t) => TernaryTreeList::Tree(t.push_right(item)), } } diff --git a/src/slice.rs b/src/slice.rs index 784438c..88b7f56 100644 --- a/src/slice.rs +++ b/src/slice.rs @@ -1,5 +1,6 @@ use std::fmt::{Debug, Display}; use std::hash::Hash; +use std::sync::Arc; use crate::tree::*; use crate::TernaryTreeList; @@ -16,7 +17,7 @@ where } else { let mut ys: Vec> = Vec::with_capacity(xs.len()); for x in &xs { - ys.push(Leaf(x.to_owned())) + ys.push(Leaf(Arc::new(x.to_owned()))) } TernaryTreeList::Tree(TernaryTree::rebuild_list(xs.len(), 0, &ys)) @@ -34,7 +35,7 @@ where } else { let mut ys: Vec> = Vec::with_capacity(xs.len()); for x in xs { - ys.push(Leaf(x.to_owned())) + ys.push(Leaf(Arc::new(x.to_owned()))) } TernaryTreeList::Tree(TernaryTree::rebuild_list(xs.len(), 0, &ys)) @@ -53,7 +54,7 @@ where } else { let mut ys: Vec> = Vec::with_capacity(xs.len()); for x in xs { - ys.push(Leaf(x.to_owned())) + ys.push(Leaf(Arc::new(x.to_owned()))) } TernaryTreeList::Tree(TernaryTree::rebuild_list(xs.len(), 0, &ys)) diff --git a/src/tree.rs b/src/tree.rs index 270c1f0..ee963f8 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -11,7 +11,7 @@ use crate::util::{divide_ternary_sizes, rough_int_pow}; #[derive(Clone, Debug)] pub enum TernaryTree { - Leaf(T), + Leaf(Arc), Branch2 { size: usize, depth: u16, @@ -175,7 +175,7 @@ where pub fn index_of(&self, item: &T) -> Option { match self { Leaf(value) => { - if item == value { + if item == &**value { Some(0) } else { None @@ -283,7 +283,7 @@ where match tree_parent { Leaf(value) => { if idx == 0 { - return Some(value.to_owned()); + return Some((*value).to_owned()); } else { println!("[warning] Cannot get from leaf with index {}", idx); return None; @@ -355,7 +355,7 @@ where match self { Leaf { .. } => { if idx == 0 { - Ok(Leaf(item)) + Ok(Leaf(Arc::new(item))) } else { Err(format!("Cannot assoc leaf into index {}", idx)) } @@ -567,13 +567,13 @@ where depth: 1, size: 2, left: Arc::new(self.to_owned()), - middle: Arc::new(Leaf(item)), + middle: Arc::new(Leaf(Arc::new(item))), }) } else { Ok(Branch2 { depth: 1, size: 2, - left: Arc::new(Leaf(item)), + left: Arc::new(Leaf(Arc::new(item))), middle: Arc::new(self.to_owned()), }) } @@ -589,13 +589,13 @@ where size: 2, depth: 1, left: left.to_owned(), - middle: Arc::new(Leaf(item)), + middle: Arc::new(Leaf(Arc::new(item))), }); } else { return Ok(Branch2 { size: 2, depth: 1, - left: Arc::new(Leaf(item)), + left: Arc::new(Leaf(Arc::new(item))), middle: left.to_owned(), }); } @@ -608,7 +608,7 @@ where size: 3, depth: 1, left: left.to_owned(), - middle: Arc::new(Leaf(item)), + middle: Arc::new(Leaf(Arc::new(item))), right: middle.to_owned(), }); } @@ -618,7 +618,7 @@ where depth: 1, left: left.to_owned(), middle: middle.to_owned(), - right: Arc::new(Leaf(item)), + right: Arc::new(Leaf(Arc::new(item))), }); } else { return Err(String::from("cannot insert after position 2 since only 2 elements here")); @@ -627,7 +627,7 @@ where return Ok(Branch3 { size: 3, depth: 1, - left: Arc::new(Leaf(item)), + left: Arc::new(Leaf(Arc::new(item))), middle: left.to_owned(), right: middle.to_owned(), }); @@ -636,7 +636,7 @@ where size: 3, depth: 1, left: left.to_owned(), - middle: Arc::new(Leaf(item)), + middle: Arc::new(Leaf(Arc::new(item))), right: middle.to_owned(), }); } else { @@ -654,7 +654,7 @@ where return Ok(Branch3 { size: *size + 1, depth: *depth, - left: Arc::new(Leaf(item)), + left: Arc::new(Leaf(Arc::new(item))), middle: left.to_owned(), right: middle.to_owned(), }); @@ -666,7 +666,7 @@ where depth: *depth, left: left.to_owned(), middle: middle.to_owned(), - right: Arc::new(Leaf(item)), + right: Arc::new(Leaf(Arc::new(item))), }); } @@ -704,13 +704,13 @@ where size: 2, depth: 1, left: left.to_owned(), - middle: Arc::new(Leaf(item)), + middle: Arc::new(Leaf(Arc::new(item))), }); } else { return Ok(Branch2 { size: 2, depth: 1, - left: Arc::new(Leaf(item)), + left: Arc::new(Leaf(Arc::new(item))), middle: left.to_owned(), }); } @@ -723,7 +723,7 @@ where size: 3, depth: 1, left: left.to_owned(), - middle: Arc::new(Leaf(item)), + middle: Arc::new(Leaf(Arc::new(item))), right: middle.to_owned(), }); } @@ -733,7 +733,7 @@ where depth: 1, left: left.to_owned(), middle: middle.to_owned(), - right: Arc::new(Leaf(item)), + right: Arc::new(Leaf(Arc::new(item))), }); } else { return Err(String::from("cannot insert after position 2 since only 2 elements here")); @@ -742,7 +742,7 @@ where return Ok(Branch3 { size: 3, depth: 1, - left: Arc::new(Leaf(item)), + left: Arc::new(Leaf(Arc::new(item))), middle: left.to_owned(), right: middle.to_owned(), }); @@ -751,7 +751,7 @@ where size: 3, depth: 1, left: left.to_owned(), - middle: Arc::new(Leaf(item)), + middle: Arc::new(Leaf(Arc::new(item))), right: middle.to_owned(), }); } else { @@ -769,7 +769,7 @@ where return Ok(Branch2 { size: *size + 1, depth: depth + 1, - left: Arc::new(Leaf(item)), + left: Arc::new(Leaf(Arc::new(item))), middle: Arc::new(self.to_owned()), }); } @@ -779,7 +779,7 @@ where size: *size + 1, depth: depth + 1, left: Arc::new(self.to_owned()), - middle: Arc::new(Leaf(item)), + middle: Arc::new(Leaf(Arc::new(item))), }); } @@ -789,7 +789,7 @@ where depth: depth.to_owned(), left: left.to_owned(), middle: middle.to_owned(), - right: Arc::new(Leaf(item)), + right: Arc::new(Leaf(Arc::new(item))), }); } @@ -797,7 +797,7 @@ where return Ok(Branch3 { size: *size + 1, depth: depth.to_owned(), - left: Arc::new(Leaf(item)), + left: Arc::new(Leaf(Arc::new(item))), middle: left.to_owned(), right: middle.to_owned(), }); @@ -874,7 +874,7 @@ where } pub fn prepend(&self, item: T, disable_balancing: bool) -> Self { if self.is_empty() { - return Leaf(item); + return Leaf(Arc::new(item)); } let mut result = match self.insert(0, item, false) { @@ -895,7 +895,7 @@ where } pub fn append(&self, item: T, disable_balancing: bool) -> Self { if self.is_empty() { - return Leaf(item); + return Leaf(Arc::new(item)); } let mut result = match self.insert(self.len() - 1, item, true) { Ok(v) => v, @@ -1016,7 +1016,7 @@ where pub fn push_right(&self, item: T) -> Self { // start with 2 so its left child branch has capability of only 3^1 - self.push_right_iter(Leaf(item), FingerMark::Main(2)) + self.push_right_iter(Leaf(Arc::new(item)), FingerMark::Main(2)) } pub fn drop_left(&self) -> Self { @@ -1353,7 +1353,7 @@ where } pub fn map(&self, f: Arc V>) -> TernaryTree { match self { - Leaf(value) => Leaf(f(value)), + Leaf(value) => Leaf(Arc::new(f(value))), Branch2 { left, middle, size, depth } => Branch2 { size: *size, depth: *depth,