fix subset check

This commit is contained in:
AF 2023-04-25 17:39:25 +00:00
parent 5d604d2834
commit 9ef14b53ac

View File

@ -1,5 +1,7 @@
//! Traversible binary trees. //! Traversible binary trees.
// pub mod unbalanced;
use std::rc::Rc; use std::rc::Rc;
use crate::func::*; use crate::func::*;
@ -50,24 +52,24 @@ pub type Split<'a, T, A, D> = (
Rc<A>, Rc<A>,
); );
pub trait TraversibleBinaryNode<'a, T: Monad, A, D: 'a + PartialEq>: 'a { pub trait TraversibleBinaryNode<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>: 'a {
fn split(&self) -> Split<'a, T, A, D>; fn split(&self) -> Split<'a, T, A, D>;
fn to_tree(self: Rc<Self>) -> Rc<dyn TraversibleBinaryTree<'a, T, A, D>>; fn to_tree(self: Rc<Self>) -> Rc<dyn TraversibleBinaryTree<'a, T, A, D>>;
} }
pub trait TraversibleBinaryReference<'a, T: Monad, A, D: 'a + PartialEq>: 'a { pub trait TraversibleBinaryReference<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>: 'a {
fn resolve(&self) -> <T as WeakFunctor>::F<'a, Rc<dyn TraversibleBinaryNode<'a, T, A, D>>>; fn resolve(&self) -> <T as WeakFunctor>::F<'a, Rc<dyn TraversibleBinaryNode<'a, T, A, D>>>;
/// This should be enough to compare reference for equality. /// This should be enough to compare reference for equality.
fn data(&self) -> D; fn data(&self) -> D;
} }
pub trait TraversibleBinaryTree<'a, T: Monad, A, D: 'a + PartialEq>: 'a { pub trait TraversibleBinaryTree<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>: 'a {
fn refer(&self) -> Option<Rc<dyn TraversibleBinaryReference<'a, T, A, D>>>; fn refer(&self) -> Option<Rc<dyn TraversibleBinaryReference<'a, T, A, D>>>;
} }
pub fn n_contains<'a, T: Monad, A, D: 'a + PartialEq>( pub fn n_contains<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
comparator: &'a dyn Comparator<A>, comparator: &'a dyn Comparator<A>,
n_set: Rc<dyn TraversibleBinaryNode<'a, T, A, D>>, n_set: Rc<dyn TraversibleBinaryNode<'a, T, A, D>>,
key: Rc<A>, key: Rc<A>,
@ -80,7 +82,7 @@ pub fn n_contains<'a, T: Monad, A, D: 'a + PartialEq>(
} }
} }
pub fn r_contains<'a, T: Monad, A, D: 'a + PartialEq>( pub fn r_contains<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
comparator: &'a dyn Comparator<A>, comparator: &'a dyn Comparator<A>,
r_set: Rc<dyn TraversibleBinaryReference<'a, T, A, D>>, r_set: Rc<dyn TraversibleBinaryReference<'a, T, A, D>>,
key: Rc<A>, key: Rc<A>,
@ -88,7 +90,7 @@ pub fn r_contains<'a, T: Monad, A, D: 'a + PartialEq>(
T::bind(r_set.resolve(), |n_set| n_contains(comparator, n_set, key)) T::bind(r_set.resolve(), |n_set| n_contains(comparator, n_set, key))
} }
pub fn t_contains<'a, T: Monad, A, D: 'a + PartialEq>( pub fn t_contains<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
comparator: &'a dyn Comparator<A>, comparator: &'a dyn Comparator<A>,
t_set: Rc<dyn TraversibleBinaryTree<'a, T, A, D>>, t_set: Rc<dyn TraversibleBinaryTree<'a, T, A, D>>,
key: Rc<A>, key: Rc<A>,
@ -99,7 +101,7 @@ pub fn t_contains<'a, T: Monad, A, D: 'a + PartialEq>(
} }
} }
pub fn n_subset_of_n<'a, T: Monad, A, D: 'a + PartialEq>( pub fn n_subset_of_n<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
comparator: &'a dyn Comparator<A>, comparator: &'a dyn Comparator<A>,
n_subset: Rc<dyn TraversibleBinaryNode<'a, T, A, D>>, n_subset: Rc<dyn TraversibleBinaryNode<'a, T, A, D>>,
n_superset: Rc<dyn TraversibleBinaryNode<'a, T, A, D>>, n_superset: Rc<dyn TraversibleBinaryNode<'a, T, A, D>>,
@ -128,7 +130,7 @@ pub fn n_subset_of_n<'a, T: Monad, A, D: 'a + PartialEq>(
t_subset_of_t( t_subset_of_t(
comparator, comparator,
t_subr, t_subr,
n_subset.to_tree(), n_superset.to_tree(),
Some(k_sub.clone()), Some(k_sub.clone()),
k_r, k_r,
), ),
@ -147,7 +149,7 @@ pub fn n_subset_of_n<'a, T: Monad, A, D: 'a + PartialEq>(
t_subset_of_t( t_subset_of_t(
comparator, comparator,
t_subl, t_subl,
n_subset.to_tree(), n_superset.to_tree(),
k_l, k_l,
Some(k_sub.clone()), Some(k_sub.clone()),
), ),
@ -157,7 +159,7 @@ pub fn n_subset_of_n<'a, T: Monad, A, D: 'a + PartialEq>(
} }
} }
pub fn r_subset_of_r<'a, T: Monad, A, D: 'a + PartialEq>( pub fn r_subset_of_r<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
comparator: &'a dyn Comparator<A>, comparator: &'a dyn Comparator<A>,
r_subset: Rc<dyn TraversibleBinaryReference<'a, T, A, D>>, r_subset: Rc<dyn TraversibleBinaryReference<'a, T, A, D>>,
r_superset: Rc<dyn TraversibleBinaryReference<'a, T, A, D>>, r_superset: Rc<dyn TraversibleBinaryReference<'a, T, A, D>>,