anchor.diff:      let rec filterAux (comparer: IComparer<'Key>) (f: OptimizedClosures.FSharpFunc<_, _, _>) (m: MapTree<'Key, 'Value>) acc = 
           if isEmpty m then acc
           else
  -            match m with 
  -            | :? MapTreeNode<'Key, 'Value> as mn ->
  +            if m.Height = 1 then  
  +                filter1 comparer f m.Key m.Value acc
  +            else
  +                let mn = asNode m
                   let acc = filterAux comparer f mn.Left acc
                   let acc = filter1 comparer f mn.Key mn.Value acc
                   filterAux comparer f mn.Right acc
  -            | _ -> filter1 comparer f m.Key m.Value acc
  +            
   
       let filter (comparer: IComparer<'Key>) f m =
           filterAux comparer (OptimizedClosures.FSharpFunc<_, _, _>.Adapt f) m empty
  
positive.code:     let rec forallOpt (f: OptimizedClosures.FSharpFunc<_, _, _>) (m: MapTree<'Key, 'Value>) = 
          if isEmpty m then true
          else
              match m with 
              | :? MapTreeNode<'Key, 'Value> as mn -> forallOpt f mn.Left && f.Invoke (mn.Key, mn.Value) && forallOpt f mn.Right
              | _ -> f.Invoke (m.Key, m.Value)
              
  
      let forall f m =
  
negative.code:                         let sk, sv, r' = spliceOutSuccessor mn.Right 
                          mk mn.Left sk sv r'
                  else rebalance mn.Left mn.Key mn.Value (remove comparer k mn.Right)
              
  
      let rec change (comparer: IComparer<'Key>) k (u: 'Value option -> 'Value option) (m: MapTree<'Key, 'Value>) : MapTree<'Key,'Value> =
          if isEmpty m then
  