1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//! Traversible binary trees.

use std::sync::Arc;

use crate::flow::comparator::*;
use crate::func::*;

pub mod algorithms;

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>>>;
}