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(()),
}
}