From edbff39ae2e23864bdf29cbff588ffbd11843188 Mon Sep 17 00:00:00 2001 From: timofey <tim@ongoteam.yaconnect.com> Date: Sun, 15 Oct 2023 12:45:46 +0000 Subject: [PATCH] `one_has_height_1` --- src/rstd/collections/tree.rs | 22 +++++++++-- src/rstd/collections/tree/context.rs | 59 +++++++++++++++++----------- 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/rstd/collections/tree.rs b/src/rstd/collections/tree.rs index 7b86a99..ad18226 100644 --- a/src/rstd/collections/tree.rs +++ b/src/rstd/collections/tree.rs @@ -237,15 +237,23 @@ mod tests { use std::convert::Infallible; use crate::{ - flow::{binary::*, comparator::*}, + flow::{ + binary::{balancing::*, *}, + comparator::*, + }, rstd::atomic_object::*, testing::TestContextPlain, }; use super::context::*; - type Trees = - TreeContext2<'static, TestContextPlain, AtomicObject<u64>, DefaultComparator, Infallible>; + type Trees = TreeContext2< + 'static, + TestContextPlain, + AtomicObject<u64>, + DefaultComparator, + WrappedExtra<BalancingError, Infallible>, + >; fn new_trees() -> Trees { Trees::new((DefaultComparator.into(), u64::f())) @@ -256,4 +264,12 @@ mod tests { let trees = new_trees(); assert_eq!(trees.height(&trees.empty()), 0); } + + #[test] + fn one_has_height_1() { + let trees = BalancedTrees::new(new_trees()); + let tree = trees.empty(); + let tree = trees.clone().add_tree(tree, 0.into()).unwrap(); + assert_eq!(trees.height(&tree), 1); + } } diff --git a/src/rstd/collections/tree/context.rs b/src/rstd/collections/tree/context.rs index 1d66f6e..6578dd6 100644 --- a/src/rstd/collections/tree/context.rs +++ b/src/rstd/collections/tree/context.rs @@ -26,32 +26,32 @@ impl<Cl: Clone, T> Clone for TreeContext<Cl, T> { } } -pub enum TreeContextError<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>, E: 'a> { - Resolution(ResolutionFailure<'a, Ctx, Node<'a, Ctx, A>>), +#[derive(Debug)] +pub enum TreeContextError<R, E> { + Resolution(R), Extra(E), } -impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>, E: 'a> - From<ResolutionFailure<'a, Ctx, Node<'a, Ctx, A>>> for TreeContextError<'a, Ctx, A, E> +pub type TreeContextError2<'a, Ctx, A, E> = + TreeContextError<ResolutionFailure<'a, Ctx, Node<'a, Ctx, A>>, E>; + +impl<L, P, E> From<ResolutionError<L, TreeParseError<P>>> + for TreeContextError<ResolutionError<L, TreeParseError<P>>, E> { - fn from(value: ResolutionFailure<'a, Ctx, Node<'a, Ctx, A>>) -> Self { + fn from(value: ResolutionError<L, TreeParseError<P>>) -> Self { Self::Resolution(value) } } -type TreeParseError2<'a, A> = TreeParseError<ParseErrorA<'a, A>>; - -impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>, E: 'a> From<TreeParseError2<'a, A>> - for TreeContextError<'a, Ctx, A, E> +impl<L, P, E> From<TreeParseError<P>> + for TreeContextError<ResolutionError<L, TreeParseError<P>>, E> { - fn from(value: TreeParseError2<'a, A>) -> Self { + fn from(value: TreeParseError<P>) -> Self { ResolutionError::Parse(value).into() } } -impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>, E: 'a> From<HeightError> - for TreeContextError<'a, Ctx, A, E> -{ +impl<L, P, E> From<HeightError> for TreeContextError<ResolutionError<L, TreeParseError<P>>, E> { fn from(value: HeightError) -> Self { TreeParseError::HeightValue(value).into() } @@ -67,7 +67,7 @@ impl< E: 'a + Send, > FunctorContext<'a> for TreeContext2<'a, Ctx, A, C, E> { - type T = FallibleMonad<'a, Ctx, TreeContextError<'a, Ctx, A, E>>; + type T = FallibleMonad<'a, Ctx, TreeContextError2<'a, Ctx, A, E>>; } impl< @@ -181,6 +181,24 @@ impl< } } +impl< + 'a, + Ctx: Context<'a>, + A: Mentionable<'a, Ctx> + Clone, + C: 'a + Comparator<A>, + E: 'a + Send, + > BinaryTreesTryJoin<'a> for TreeContext2<'a, Ctx, A, C, E> +{ + fn try_join( + &self, + tl: Self::Tree, + key: Self::Key, + tr: Self::Tree, + ) -> BTWrap<'a, Self, Self::Node> { + Self::pure(Node { l: tl, r: tr, key }) + } +} + impl< 'a, Ctx: Context<'a>, @@ -194,30 +212,25 @@ impl< } } +#[derive(Debug)] pub enum WrappedExtra<W, E> { Wrapped(W), Extra(E), } -impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>, W: 'a, E: 'a> From<WrappedExtra<W, E>> - for TreeContextError<'a, Ctx, A, WrappedExtra<W, E>> -{ +impl<R, E, W> From<WrappedExtra<W, E>> for TreeContextError<R, WrappedExtra<W, E>> { fn from(value: WrappedExtra<W, E>) -> Self { Self::Extra(value) } } -impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>, E: 'a> From<BalancingError> - for TreeContextError<'a, Ctx, A, WrappedExtra<BalancingError, E>> -{ +impl<R, E> From<BalancingError> for TreeContextError<R, WrappedExtra<BalancingError, E>> { fn from(value: BalancingError) -> Self { WrappedExtra::Wrapped(value).into() } } -impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>, E: 'a> From<BoundsError<A>> - for TreeContextError<'a, Ctx, A, WrappedExtra<BoundsError<A>, E>> -{ +impl<R, A, E> From<BoundsError<A>> for TreeContextError<R, WrappedExtra<BoundsError<A>, E>> { fn from(value: BoundsError<A>) -> Self { WrappedExtra::Wrapped(value).into() }