diff --git a/src/std/collections/rbtree.rs b/src/std/collections/rbtree.rs index cff332d..3648ddb 100644 --- a/src/std/collections/rbtree.rs +++ b/src/std/collections/rbtree.rs @@ -1,4 +1,6 @@ -use std::{error::Error, fmt::Display}; +pub mod subset; + +use std::{rc::Rc, error::Error, fmt::Display}; use crate::core::*; use crate::std::{ @@ -57,13 +59,13 @@ pub enum RBNode<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> { pub struct BNode<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> { cl: Nullable<'a, Ctx, RBNode<'a, Ctx, A>>, cr: Nullable<'a, Ctx, RBNode<'a, Ctx, A>>, - key: A, + key: Rc, } pub struct RNode<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> { cl: Nullable<'a, Ctx, BNode<'a, Ctx, A>>, cr: Nullable<'a, Ctx, BNode<'a, Ctx, A>>, - key: A, + key: Rc, } #[derive(Clone)] @@ -222,7 +224,7 @@ impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> Factory<'a, Ctx> for BFactory> Factory<'a, Ctx> for RFactory = + TreeParseError<<>::Fctr as Factory<'a, Ctx>>::ParseError>; + +pub type TreeFaiure<'a, Ctx, A> = + ResolutionError<::LookupError<'a>, TPE<'a, Ctx, A>>; + +pub type SubsetWrapped<'a, Ctx, A> = FallibleWrapped<'a, Ctx, bool, TreeFaiure<'a, Ctx, A>>; + +pub type SubsetMonad<'a, Ctx, A> = FallibleMonad>; + +pub fn subset_pure<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>>( + value: bool, +) -> SubsetWrapped<'a, Ctx, A> { + as Pure>::pure(value) +} + +#[derive(PartialEq)] +enum NodeType { + Rb, + R, + B, +} + +type RefData = (NodeType, Hash); + +impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> + TraversibleBinaryNode<'a, SubsetMonad<'a, Ctx, A>, A, RefData> for BNode<'a, Ctx, A> +{ + fn split(&self) -> Split<'a, SubsetMonad<'a, Ctx, A>, A, RefData> { + ( + Rc::new(self.cl.clone()), + Rc::new(self.cr.clone()), + self.key.clone(), + ) + } + + fn to_tree( + self: Rc, + ) -> Rc, A, RefData>> { + Rc::new(Nullable::from(self)) + } +} + +impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> + TraversibleBinaryNode<'a, SubsetMonad<'a, Ctx, A>, A, RefData> for RNode<'a, Ctx, A> +{ + fn split(&self) -> Split<'a, SubsetMonad<'a, Ctx, A>, A, RefData> { + ( + Rc::new(self.cl.clone()), + Rc::new(self.cr.clone()), + self.key.clone(), + ) + } + + fn to_tree( + self: Rc, + ) -> Rc, A, RefData>> { + Rc::new(Nullable::from(self)) + } +} + +impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> + TraversibleBinaryNode<'a, SubsetMonad<'a, Ctx, A>, A, RefData> for RBNode<'a, Ctx, A> +{ + fn split(&self) -> Split<'a, SubsetMonad<'a, Ctx, A>, A, RefData> { + match self { + RBNode::R(r) => r.split(), + RBNode::B(b) => b.split(), + } + } + + fn to_tree( + self: Rc, + ) -> Rc, A, RefData>> { + Rc::new(Nullable::from(self)) + } +} + +impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> + TraversibleBinaryReference<'a, SubsetMonad<'a, Ctx, A>, A, RefData> + for Point<'a, Ctx, BNode<'a, Ctx, A>> +{ + fn resolve( + &self, + ) -> as WeakFunctor>::F< + 'a, + Rc, A, RefData>>, + > { + as Functor>::fmap( + |resolved| resolved as Rc>, + self.resolve(), + ) + } + + fn data(&self) -> RefData { + (NodeType::B, self.point) + } +} + +impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> + TraversibleBinaryReference<'a, SubsetMonad<'a, Ctx, A>, A, RefData> + for Point<'a, Ctx, RNode<'a, Ctx, A>> +{ + fn resolve( + &self, + ) -> as WeakFunctor>::F< + 'a, + Rc, A, RefData>>, + > { + as Functor>::fmap( + |resolved| resolved as Rc>, + self.resolve(), + ) + } + + fn data(&self) -> RefData { + (NodeType::R, self.point) + } +} + +impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> + TraversibleBinaryReference<'a, SubsetMonad<'a, Ctx, A>, A, RefData> + for Point<'a, Ctx, RBNode<'a, Ctx, A>> +{ + fn resolve( + &self, + ) -> as WeakFunctor>::F< + 'a, + Rc, A, RefData>>, + > { + as Functor>::fmap( + |resolved| resolved as Rc>, + self.resolve(), + ) + } + + fn data(&self) -> RefData { + (NodeType::Rb, self.point) + } +} + +impl< + 'a, + Ctx: 'a + Context, + A: Mentionable<'a, Ctx>, + T: Mentionable<'a, Ctx>, + D: 'a + PartialEq, + > TraversibleBinaryTree<'a, SubsetMonad<'a, Ctx, A>, A, D> for Nullable<'a, Ctx, T> +where + Point<'a, Ctx, T>: TraversibleBinaryReference<'a, SubsetMonad<'a, Ctx, A>, A, D>, +{ + fn refer( + &self, + ) -> Option, A, D>>> { + match self { + Nullable::Null(_) => None, + Nullable::NotNull(point) => Some(Rc::new(point.clone())), + } + } +}