diff --git a/src/flow/binary.rs b/src/flow/binary.rs index 9c8918e..2c7378c 100644 --- a/src/flow/binary.rs +++ b/src/flow/binary.rs @@ -51,24 +51,23 @@ pub trait BinaryTreesMutable<'a>: BinaryTrees<'a> { ::bind(self.clone().join_key(tl, key, tr), move |n| self.tree_of(n)) } - fn join(&self, tl: Self::Tree, tr: Self::Tree) -> BTWrap<'a, Self, Self::Tree> { + fn join(self, tl: Self::Tree, tr: Self::Tree) -> BTWrap<'a, Self, Self::Tree> { let Some(rl) = self.refer(&tl) else { return ::pure(tr) }; let Some(rr) = self.refer(&tr) else { return ::pure(tl) }; - let ctx = self.clone(); Self::T::bind2(self.resolve(&rl), self.resolve(&rr), move |nl, nr| { - let (tll, tlr, kl) = ctx.split(&nl); - let (trl, trr, kr) = ctx.split(&nr); - let ft = ctx.join(tlr, trl); + let (tll, tlr, kl) = self.split(&nl); + let (trl, trr, kr) = self.split(&nr); + let ft = self.clone().join(tlr, trl); let ft = { - let ctx = ctx.clone(); + let ctx = self.clone(); ::bind(ft, move |t| ctx.join_key_tree(tll, kl, t)) }; let ft = { - let ctx = ctx.clone(); + let ctx = self.clone(); ::bind(ft, move |t| ctx.join_key_tree(t, kr, trr)) }; ft @@ -124,6 +123,12 @@ pub trait BinaryTreesMutable<'a>: BinaryTrees<'a> { fn add_tree(self, tree: Self::Tree, key: KeyRc<'a, Self>) -> BTWrap<'a, Self, Self::Tree> { ::bind(self.clone().add(tree, key), move |n| self.tree_of(n)) } + + fn remove(self, tree: Self::Tree, key: KeyRc<'a, Self>) -> BTWrap<'a, Self, Self::Tree> { + ::bind(self.clone().split_key(tree, key.clone()), |(tl, tr)| { + self.join(tl, tr) + }) + } } pub trait BinaryTreesAvl<'a>: BinaryTrees<'a> {