anchor.diff:  
     IMap<K, V> modify(K k, V f(V v), V dflt) => new IMap(_order, _tree.modify(_order, k, f, dflt));
   
  -  Option<IMap<K, V>> set(K k, V v) => _tree.set(_order, k, v).map((newTree) => new IMap(_order, newTree));
  +  Option<IMap<K, V>> set(K k, V v) {
  +    final newMap = setIfPresent(k, v);
  +    return identical(this, newMap) ? none() : some(newMap);
  +  }
  +
  +  IMap<K, V> setIfPresent(K k, V v) {
  +    final newTree = _tree.setIfPresent(_order, k, v);
  +    return identical(_tree, newTree) ? this : new IMap(_order, newTree);
  +  }
   
     IMap<K, V> remove(K k) => new IMap(_order, _tree.remove(_order, k));
   
  
positive.code:   int get height;
    int get balance;
    Option<Tuple3<_IMapAVLNode<K, V>, K, V>> _removeMax();
    Option<_IMapAVLNode<K, V>> set(Order<K> order, K k, V v);
    _IMapAVLNode<K, V> modify(Order<K> order, K k, V f(V v), V dflt);
    _IMapAVLNode<K, dynamic/*=V2*/> map/*<V2>*/(/*=V2*/ f(V v));
    bool get empty;
  
negative.code:     return new _NonEmptyIMapAVLNode/*<K, V2>*/(_k, newV, newLeft, newRight);
    }
  
    @override _IMapAVLNode<K, V> setIfPresent(Order<K> order, K k, V v) {
      final Ordering o = order.order(k, _k);
      if (o == Ordering.LT) {
        final newLeft = _left.setIfPresent(order, k, v);
        return identical(newLeft, _left) ? this : new _NonEmptyIMapAVLNode(_k, _v, newLeft, _right);
      } else if (o == Ordering.GT) {
        final newRight = _right.setIfPresent(order, k, v);
        return identical(newRight, _right) ? this : new _NonEmptyIMapAVLNode(_k, _v, _left, newRight);
      } else {
        return new _NonEmptyIMapAVLNode(_k, v, _left, _right);
      }
    }
  
  