BoundTrees
This commit is contained in:
parent
f0aa3878c4
commit
0a0ec3a882
@ -1,3 +1,5 @@
|
|||||||
|
pub mod bound;
|
||||||
|
|
||||||
use crate::flow::comparator::*;
|
use crate::flow::comparator::*;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
99
src/flow/binary/bounds/bound.rs
Normal file
99
src/flow/binary/bounds/bound.rs
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
use crate::{flow::binary::*, func::context::*};
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Bound<A, T> {
|
||||||
|
bound: T,
|
||||||
|
bounds: Bounds<A>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct BoundNode2<A, T> {
|
||||||
|
boundsl: Bounds<A>,
|
||||||
|
boundsr: Bounds<A>,
|
||||||
|
bounds: Bounds<A>,
|
||||||
|
node: T,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct BoundTrees<BT>(BT);
|
||||||
|
|
||||||
|
impl<'a, BT: FunctorContext<'a>> FunctorContext<'a> for BoundTrees<BT> {
|
||||||
|
type T = BT::T;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait BinaryTreesBindable<'a>: BinaryTrees<'a> {
|
||||||
|
fn bounds_error<T: 'a>(&self, error: BoundsError<Self::Key>) -> BTWrap<'a, Self, T>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, BT: BinaryTreesBindable<'a>> BinaryTrees<'a> for BoundTrees<BT>
|
||||||
|
where
|
||||||
|
BT::Tree: Clone,
|
||||||
|
{
|
||||||
|
type Node = BoundNode2<Self::Key, BT::Node>;
|
||||||
|
|
||||||
|
type Reference = Bound<Self::Key, BT::Reference>;
|
||||||
|
|
||||||
|
type Tree = Bound<Self::Key, BT::Tree>;
|
||||||
|
|
||||||
|
type Key = BT::Key;
|
||||||
|
|
||||||
|
type Comparator = BT::Comparator;
|
||||||
|
|
||||||
|
type _Tm = Self::T;
|
||||||
|
|
||||||
|
fn comparator(&self) -> &Self::Comparator {
|
||||||
|
self.0.comparator()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn split(&self, node: &Self::Node) -> Split<'a, Self> {
|
||||||
|
let (tl, tr, key) = self.0.split(&node.node);
|
||||||
|
(
|
||||||
|
Bound {
|
||||||
|
bound: tl,
|
||||||
|
bounds: node.boundsl.clone(),
|
||||||
|
},
|
||||||
|
Bound {
|
||||||
|
bound: tr,
|
||||||
|
bounds: node.boundsr.clone(),
|
||||||
|
},
|
||||||
|
key,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tree_of(&self, node: Self::Node) -> BTWrap<'a, Self, Self::Tree> {
|
||||||
|
Self::fmap(self.0.tree_of(node.node), move |tree| Bound {
|
||||||
|
bound: tree,
|
||||||
|
bounds: node.bounds,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn resolve(&self, reference: &Self::Reference) -> BTWrap<'a, Self, Self::Node> {
|
||||||
|
let ctx = self.clone();
|
||||||
|
let bounds = reference.bounds.clone();
|
||||||
|
Self::bind(self.0.resolve(&reference.bound), move |node| {
|
||||||
|
let (_, _, key) = ctx.0.split(&node);
|
||||||
|
match bounds.clone().split(&key, ctx.comparator()) {
|
||||||
|
Ok((boundsl, boundsr)) => Self::pure(BoundNode2 {
|
||||||
|
boundsl,
|
||||||
|
boundsr,
|
||||||
|
bounds,
|
||||||
|
node,
|
||||||
|
}),
|
||||||
|
Err(e) => ctx.0.bounds_error(e),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn equal(&self, rl: &Self::Reference, rr: &Self::Reference) -> bool {
|
||||||
|
Bounds::equal(&rl.bounds, &rr.bounds, self.comparator())
|
||||||
|
&& self.0.equal(&rl.bound, &rr.bound)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn refer(&self, tree: &Self::Tree) -> Option<Self::Reference> {
|
||||||
|
Some(Bound {
|
||||||
|
bound: self.0.refer(&tree.bound)?,
|
||||||
|
bounds: tree.bounds.clone(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user