rbtree::subset
This commit is contained in:
parent
911e536c67
commit
5c9e4985b6
@ -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::core::*;
|
||||||
use crate::std::{
|
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>> {
|
pub struct BNode<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> {
|
||||||
cl: Nullable<'a, Ctx, RBNode<'a, Ctx, A>>,
|
cl: Nullable<'a, Ctx, RBNode<'a, Ctx, A>>,
|
||||||
cr: Nullable<'a, Ctx, RBNode<'a, Ctx, A>>,
|
cr: Nullable<'a, Ctx, RBNode<'a, Ctx, A>>,
|
||||||
key: A,
|
key: Rc<A>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct RNode<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> {
|
pub struct RNode<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> {
|
||||||
cl: Nullable<'a, Ctx, BNode<'a, Ctx, A>>,
|
cl: Nullable<'a, Ctx, BNode<'a, Ctx, A>>,
|
||||||
cr: Nullable<'a, Ctx, BNode<'a, Ctx, A>>,
|
cr: Nullable<'a, Ctx, BNode<'a, Ctx, A>>,
|
||||||
key: A,
|
key: Rc<A>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -222,7 +224,7 @@ impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> Factory<'a, Ctx> for BFactory<F
|
|||||||
let key = self
|
let key = self
|
||||||
.key_factory
|
.key_factory
|
||||||
.deserialize(deserializer, resolver, addresses)
|
.deserialize(deserializer, resolver, addresses)
|
||||||
.map_err(TreeParseError::Key)?;
|
.map_err(TreeParseError::Key)?.into();
|
||||||
Ok(BNode { cl, cr, key })
|
Ok(BNode { cl, cr, key })
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,7 +252,7 @@ impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> Factory<'a, Ctx> for RFactory<F
|
|||||||
let key = self
|
let key = self
|
||||||
.key_factory
|
.key_factory
|
||||||
.deserialize(deserializer, resolver, addresses)
|
.deserialize(deserializer, resolver, addresses)
|
||||||
.map_err(TreeParseError::Key)?;
|
.map_err(TreeParseError::Key)?.into();
|
||||||
Ok(RNode { cl, cr, key })
|
Ok(RNode { cl, cr, key })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
168
src/std/collections/rbtree/subset.rs
Normal file
168
src/std/collections/rbtree/subset.rs
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
use crate::flow::traversible::*;
|
||||||
|
use crate::func::*;
|
||||||
|
use crate::std::fallible::*;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
pub type TPE<'a, Ctx, A> =
|
||||||
|
TreeParseError<<<A as Mentionable<'a, Ctx>>::Fctr as Factory<'a, Ctx>>::ParseError>;
|
||||||
|
|
||||||
|
pub type TreeFaiure<'a, Ctx, A> =
|
||||||
|
ResolutionError<<Ctx as Context>::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<Ctx, TreeFaiure<'a, Ctx, A>>;
|
||||||
|
|
||||||
|
pub fn subset_pure<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>>(
|
||||||
|
value: bool,
|
||||||
|
) -> SubsetWrapped<'a, Ctx, A> {
|
||||||
|
<SubsetMonad<'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<Self>,
|
||||||
|
) -> Rc<dyn TraversibleBinaryTree<'a, SubsetMonad<'a, Ctx, A>, 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<Self>,
|
||||||
|
) -> Rc<dyn TraversibleBinaryTree<'a, SubsetMonad<'a, Ctx, A>, 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<Self>,
|
||||||
|
) -> Rc<dyn TraversibleBinaryTree<'a, SubsetMonad<'a, Ctx, A>, 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,
|
||||||
|
) -> <SubsetMonad<'a, Ctx, A> as WeakFunctor>::F<
|
||||||
|
'a,
|
||||||
|
Rc<dyn TraversibleBinaryNode<'a, SubsetMonad<'a, Ctx, A>, A, RefData>>,
|
||||||
|
> {
|
||||||
|
<SubsetMonad<'a, Ctx, A> as Functor>::fmap(
|
||||||
|
|resolved| resolved as Rc<dyn TraversibleBinaryNode<'a, _, _, _>>,
|
||||||
|
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,
|
||||||
|
) -> <SubsetMonad<'a, Ctx, A> as WeakFunctor>::F<
|
||||||
|
'a,
|
||||||
|
Rc<dyn TraversibleBinaryNode<'a, SubsetMonad<'a, Ctx, A>, A, RefData>>,
|
||||||
|
> {
|
||||||
|
<SubsetMonad<'a, Ctx, A> as Functor>::fmap(
|
||||||
|
|resolved| resolved as Rc<dyn TraversibleBinaryNode<'a, _, _, _>>,
|
||||||
|
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,
|
||||||
|
) -> <SubsetMonad<'a, Ctx, A> as WeakFunctor>::F<
|
||||||
|
'a,
|
||||||
|
Rc<dyn TraversibleBinaryNode<'a, SubsetMonad<'a, Ctx, A>, A, RefData>>,
|
||||||
|
> {
|
||||||
|
<SubsetMonad<'a, Ctx, A> as Functor>::fmap(
|
||||||
|
|resolved| resolved as Rc<dyn TraversibleBinaryNode<'a, _, _, _>>,
|
||||||
|
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<Rc<dyn TraversibleBinaryReference<'a, SubsetMonad<'a, Ctx, A>, A, D>>> {
|
||||||
|
match self {
|
||||||
|
Nullable::Null(_) => None,
|
||||||
|
Nullable::NotNull(point) => Some(Rc::new(point.clone())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user