diff --git a/src/flow/traversible.rs b/src/flow/traversible.rs
index b7fd998..abb5b1e 100644
--- a/src/flow/traversible.rs
+++ b/src/flow/traversible.rs
@@ -1,5 +1,7 @@
 //! Traversible binary trees.
 
+// pub mod unbalanced;
+
 use std::rc::Rc;
 
 use crate::func::*;
@@ -50,24 +52,24 @@ pub type Split<'a, T, A, D> = (
     Rc<A>,
 );
 
-pub trait TraversibleBinaryNode<'a, T: Monad, A, D: 'a + PartialEq>: 'a {
+pub trait TraversibleBinaryNode<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>: 'a {
     fn split(&self) -> Split<'a, T, A, D>;
 
     fn to_tree(self: Rc<Self>) -> Rc<dyn TraversibleBinaryTree<'a, T, A, D>>;
 }
 
-pub trait TraversibleBinaryReference<'a, T: Monad, A, D: 'a + PartialEq>: 'a {
+pub trait TraversibleBinaryReference<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>: 'a {
     fn resolve(&self) -> <T as WeakFunctor>::F<'a, Rc<dyn TraversibleBinaryNode<'a, T, A, D>>>;
 
     /// This should be enough to compare reference for equality.
     fn data(&self) -> D;
 }
 
-pub trait TraversibleBinaryTree<'a, T: Monad, A, D: 'a + PartialEq>: 'a {
+pub trait TraversibleBinaryTree<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>: 'a {
     fn refer(&self) -> Option<Rc<dyn TraversibleBinaryReference<'a, T, A, D>>>;
 }
 
-pub fn n_contains<'a, T: Monad, A, D: 'a + PartialEq>(
+pub fn n_contains<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
     comparator: &'a dyn Comparator<A>,
     n_set: Rc<dyn TraversibleBinaryNode<'a, T, A, D>>,
     key: Rc<A>,
@@ -80,7 +82,7 @@ pub fn n_contains<'a, T: Monad, A, D: 'a + PartialEq>(
     }
 }
 
-pub fn r_contains<'a, T: Monad, A, D: 'a + PartialEq>(
+pub fn r_contains<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
     comparator: &'a dyn Comparator<A>,
     r_set: Rc<dyn TraversibleBinaryReference<'a, T, A, D>>,
     key: Rc<A>,
@@ -88,7 +90,7 @@ pub fn r_contains<'a, T: Monad, A, D: 'a + PartialEq>(
     T::bind(r_set.resolve(), |n_set| n_contains(comparator, n_set, key))
 }
 
-pub fn t_contains<'a, T: Monad, A, D: 'a + PartialEq>(
+pub fn t_contains<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
     comparator: &'a dyn Comparator<A>,
     t_set: Rc<dyn TraversibleBinaryTree<'a, T, A, D>>,
     key: Rc<A>,
@@ -99,7 +101,7 @@ pub fn t_contains<'a, T: Monad, A, D: 'a + PartialEq>(
     }
 }
 
-pub fn n_subset_of_n<'a, T: Monad, A, D: 'a + PartialEq>(
+pub fn n_subset_of_n<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
     comparator: &'a dyn Comparator<A>,
     n_subset: Rc<dyn TraversibleBinaryNode<'a, T, A, D>>,
     n_superset: Rc<dyn TraversibleBinaryNode<'a, T, A, D>>,
@@ -128,7 +130,7 @@ pub fn n_subset_of_n<'a, T: Monad, A, D: 'a + PartialEq>(
                 t_subset_of_t(
                     comparator,
                     t_subr,
-                    n_subset.to_tree(),
+                    n_superset.to_tree(),
                     Some(k_sub.clone()),
                     k_r,
                 ),
@@ -147,7 +149,7 @@ pub fn n_subset_of_n<'a, T: Monad, A, D: 'a + PartialEq>(
                 t_subset_of_t(
                     comparator,
                     t_subl,
-                    n_subset.to_tree(),
+                    n_superset.to_tree(),
                     k_l,
                     Some(k_sub.clone()),
                 ),
@@ -157,7 +159,7 @@ pub fn n_subset_of_n<'a, T: Monad, A, D: 'a + PartialEq>(
     }
 }
 
-pub fn r_subset_of_r<'a, T: Monad, A, D: 'a + PartialEq>(
+pub fn r_subset_of_r<'a, T: 'a + Monad, A: 'a, D: 'a + PartialEq>(
     comparator: &'a dyn Comparator<A>,
     r_subset: Rc<dyn TraversibleBinaryReference<'a, T, A, D>>,
     r_superset: Rc<dyn TraversibleBinaryReference<'a, T, A, D>>,