diff --git a/src/flow/binary.rs b/src/flow/binary.rs index b6d722d..31a15fb 100644 --- a/src/flow/binary.rs +++ b/src/flow/binary.rs @@ -1,4 +1,5 @@ pub mod avl; +pub mod balancing; pub mod bounds; use crate::flow::comparator::*; @@ -24,10 +25,13 @@ pub trait BinaryTrees<'a>: FunctorContext<'a, T = Self::_Tm> + Clone { fn comparator(&self) -> &Self::Comparator; fn split(&self, node: &Self::Node) -> Split<'a, Self>; - fn tree_of(&self, node: Self::Node) -> BTWrap<'a, Self, Self::Tree>; fn resolve(&self, reference: &Self::Reference) -> BTWrap<'a, Self, Self::Node>; fn equal(&self, rl: &Self::Reference, rr: &Self::Reference) -> bool; fn refer(&self, tree: &Self::Tree) -> Option; +} + +pub trait BinaryTreesTreeOf<'a>: BinaryTrees<'a> { + fn tree_of(&self, node: Self::Node) -> BTWrap<'a, Self, Self::Tree>; fn tree_bind(self, fnode: BTWrap<'a, Self, Self::Node>) -> BTWrap<'a, Self, Self::Tree> { Self::bind(fnode, move |node| self.tree_of(node)) @@ -44,7 +48,7 @@ pub trait BinaryTreesEmpty<'a>: BinaryTrees<'a> { ) -> BTWrap<'a, Self, KeySplit<'a, Self>>; } -pub trait BinaryTreesMutable<'a>: BinaryTreesEmpty<'a> { +pub trait BinaryTreesMutable<'a>: BinaryTreesEmpty<'a> + BinaryTreesTreeOf<'a> { fn join_key( self, tl: Self::Tree, diff --git a/src/flow/binary/avl.rs b/src/flow/binary/avl.rs index cf57568..ede31bf 100644 --- a/src/flow/binary/avl.rs +++ b/src/flow/binary/avl.rs @@ -1,6 +1,8 @@ use super::*; -pub trait BinaryTreesAvl<'a>: BinaryTreesHeight<'a> + BinaryTreesTryJoin<'a> { +pub trait BinaryTreesAvl<'a>: + BinaryTreesHeight<'a> + BinaryTreesTreeOf<'a> + BinaryTreesTryJoin<'a> +{ fn assume_node(&self, tree: &Self::Tree) -> BTWrap<'a, Self, Self::Node> { match self.refer(tree) { Some(reference) => self.resolve(&reference), @@ -68,4 +70,7 @@ pub trait BinaryTreesAvl<'a>: BinaryTreesHeight<'a> + BinaryTreesTryJoin<'a> { } } -impl<'a, BT: BinaryTreesHeight<'a> + BinaryTreesTryJoin<'a>> BinaryTreesAvl<'a> for BT {} +impl<'a, BT: BinaryTreesHeight<'a> + BinaryTreesTreeOf<'a> + BinaryTreesTryJoin<'a>> + BinaryTreesAvl<'a> for BT +{ +} diff --git a/src/flow/binary/balancing.rs b/src/flow/binary/balancing.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/flow/binary/bounds/bound.rs b/src/flow/binary/bounds/bound.rs index 8827ad2..8848fe2 100644 --- a/src/flow/binary/bounds/bound.rs +++ b/src/flow/binary/bounds/bound.rs @@ -70,13 +70,6 @@ impl<'a, BT: BinaryTreesBindable<'a>> BinaryTrees<'a> for BoundTrees { ) } - fn tree_of(&self, node: Self::Node) -> BTWrap<'a, Self, Self::Tree> { - Self::fmap(self.0.tree_of(node.node), move |tree| Bound { - bound: tree, - bounds: node.bounds, - }) - } - fn resolve(&self, reference: &Self::Reference) -> BTWrap<'a, Self, Self::Node> { let ctx = self.clone(); let bounds = reference.bounds.clone(); @@ -109,6 +102,17 @@ impl<'a, BT: BinaryTreesBindable<'a>> BinaryTrees<'a> for BoundTrees { } } +impl<'a, BT: BinaryTreesBindable<'a> + BinaryTreesTreeOf<'a>> BinaryTreesTreeOf<'a> + for BoundTrees +{ + fn tree_of(&self, node: Self::Node) -> BTWrap<'a, Self, Self::Tree> { + Self::fmap(self.0.tree_of(node.node), move |tree| Bound { + bound: tree, + bounds: node.bounds, + }) + } +} + impl<'a, BT: BinaryTreesBindable<'a> + BinaryTreesEmpty<'a>> BinaryTreesEmpty<'a> for BoundTrees { diff --git a/src/mrds/trees/avl.rs b/src/mrds/trees/avl.rs index 2ab4112..ed17069 100644 --- a/src/mrds/trees/avl.rs +++ b/src/mrds/trees/avl.rs @@ -126,15 +126,6 @@ impl<'a, A: 'a + PartialOrd + Clone> BinaryTrees<'a> for AvlTs { (node.l.clone(), node.r.clone(), node.key.clone()) } - fn tree_of(&self, node: Self::Node) -> BTWrap<'a, Self, Self::Tree> { - AvlT { - height: std::cmp::max(node.l.height, node.r.height) - .checked_add(1) - .unwrap(), - reference: Some(AvlR { node: node.into() }), - } - } - fn resolve(&self, reference: &Self::Reference) -> BTWrap<'a, Self, Self::Node> { reference.node.as_ref().clone() } @@ -148,6 +139,17 @@ impl<'a, A: 'a + PartialOrd + Clone> BinaryTrees<'a> for AvlTs { } } +impl<'a, A: 'a + PartialOrd + Clone> BinaryTreesTreeOf<'a> for AvlTs { + fn tree_of(&self, node: Self::Node) -> BTWrap<'a, Self, Self::Tree> { + AvlT { + height: std::cmp::max(node.l.height, node.r.height) + .checked_add(1) + .unwrap(), + reference: Some(AvlR { node: node.into() }), + } + } +} + impl<'a, A: 'a + PartialOrd + Clone> BinaryTreesEmpty<'a> for AvlTs { fn empty(&self) -> Self::Tree { AvlT { diff --git a/src/rstd/collections/avl/context.rs b/src/rstd/collections/avl/context.rs index c046b78..eb2afb9 100644 --- a/src/rstd/collections/avl/context.rs +++ b/src/rstd/collections/avl/context.rs @@ -48,13 +48,6 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + Clone, C: 'a + Comparator BTWrap<'a, Self, Self::Tree> { - match node.into_tree() { - Ok(tree) => Self::pure(tree), - Err(e) => Self::fail(ResolutionError::Parse(e)), - } - } - fn resolve(&self, reference: &Self::Reference) -> BTWrap<'a, Self, Self::Node> { Ctx::stuff(reference.resolve(self.comparator.clone())) } @@ -68,6 +61,17 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + Clone, C: 'a + Comparator, A: Mentionable<'a, Ctx> + Clone, C: 'a + Comparator> + BinaryTreesTreeOf<'a> for BoundContext<'a, Ctx, A, C> +{ + fn tree_of(&self, node: Self::Node) -> BTWrap<'a, Self, Self::Tree> { + match node.into_tree() { + Ok(tree) => Self::pure(tree), + Err(e) => Self::fail(ResolutionError::Parse(e)), + } + } +} + impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + Clone, C: 'a + Comparator> BinaryTreesEmpty<'a> for BoundContext<'a, Ctx, A, C> {