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())),
+ }
+ }
+}