38 lines
959 B
Rust
38 lines
959 B
Rust
//! Traversible binary trees.
|
|
|
|
pub mod algorithms;
|
|
|
|
use std::sync::Arc;
|
|
|
|
use crate::flow::comparator::*;
|
|
use crate::func::*;
|
|
|
|
pub type Split<'a, T, A, D> = (
|
|
Arc<dyn TraversibleBinaryTree<'a, T, A, D>>,
|
|
Arc<dyn TraversibleBinaryTree<'a, T, A, D>>,
|
|
A,
|
|
);
|
|
|
|
pub trait TraversibleBinaryNode<'a, T: Monad<'a>, A: 'a, D: 'a + PartialEq>:
|
|
'a + Send + Sync
|
|
{
|
|
fn split(&self) -> Split<'a, T, A, D>;
|
|
|
|
fn to_tree(self: Arc<Self>) -> Arc<dyn TraversibleBinaryTree<'a, T, A, D>>;
|
|
}
|
|
|
|
pub trait TraversibleBinaryReference<'a, T: Monad<'a>, A: 'a, D: 'a + PartialEq>:
|
|
'a + Send + Sync
|
|
{
|
|
fn resolve(&self) -> Wrap<'a, Arc<dyn TraversibleBinaryNode<'a, T, A, D>>, T>;
|
|
|
|
/// This should be enough to compare reference for equality.
|
|
fn data(&self) -> D;
|
|
}
|
|
|
|
pub trait TraversibleBinaryTree<'a, T: Monad<'a>, A: 'a, D: 'a + PartialEq>:
|
|
'a + Send + Sync
|
|
{
|
|
fn refer(&self) -> Option<Arc<dyn TraversibleBinaryReference<'a, T, A, D>>>;
|
|
}
|