BinaryTreesMutable::remove

This commit is contained in:
AF 2023-05-30 00:47:36 +00:00
parent b1a19cc9f5
commit 5858fbd897

View File

@ -51,24 +51,23 @@ pub trait BinaryTreesMutable<'a>: BinaryTrees<'a> {
<Self::T as Monad>::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 <Self::T as Pure>::pure(tr)
};
let Some(rr) = self.refer(&tr) else {
return <Self::T as Pure>::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();
<Self::T as Monad>::bind(ft, move |t| ctx.join_key_tree(tll, kl, t))
};
let ft = {
let ctx = ctx.clone();
let ctx = self.clone();
<Self::T as Monad>::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> {
<Self::T as Monad>::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> {
<Self::T as Monad>::bind(self.clone().split_key(tree, key.clone()), |(tl, tr)| {
self.join(tl, tr)
})
}
}
pub trait BinaryTreesAvl<'a>: BinaryTrees<'a> {