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
use crate::{flow::traversible::*, func::fail::*};

pub fn n_contains<'a, T: MonadFail<'a, ()>, A: 'a + Send + Clone, D: 'a + PartialEq>(
    comparator: &'a dyn Comparator<A>,
    n_set: Arc<dyn TraversibleBinaryNode<'a, T, A, D>>,
    key: A,
) -> T::F<()> {
    let (t_setl, t_setr, k_set) = n_set.split();
    match comparator.compare(&key, &k_set) {
        Comparison::L => t_contains(comparator, t_setl, key),
        Comparison::E => T::pure(()),
        Comparison::R => t_contains(comparator, t_setr, key),
    }
}

pub fn r_contains<'a, T: MonadFail<'a, ()>, A: 'a + Send + Clone, D: 'a + PartialEq>(
    comparator: &'a dyn Comparator<A>,
    r_set: Arc<dyn TraversibleBinaryReference<'a, T, A, D>>,
    key: A,
) -> T::F<()> {
    T::bind(r_set.resolve(), |n_set| n_contains(comparator, n_set, key))
}

pub fn t_contains<'a, T: MonadFail<'a, ()>, A: 'a + Send + Clone, D: 'a + PartialEq>(
    comparator: &'a dyn Comparator<A>,
    t_set: Arc<dyn TraversibleBinaryTree<'a, T, A, D>>,
    key: A,
) -> T::F<()> {
    match t_set.refer() {
        Some(r_set) => r_contains(comparator, r_set, key),
        None => T::fail(()),
    }
}