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:     return new _NonEmptyIMapAVLNode/*<K, V2>*/(_k, newV, newLeft, newRight);
    }
  
    @override Option<_IMapAVLNode<K, V>> set(Order<K> order, K k, V v) {
      final Ordering o = order.order(k, _k);
      if (o == Ordering.LT) {
        return _left.set(order, k, v).map((newLeft) => new _NonEmptyIMapAVLNode(_k, _v, newLeft, _right));
      } else if (o == Ordering.GT) {
        return _right.set(order, k, v).map((newRight) => new _NonEmptyIMapAVLNode(_k, _v, _left, newRight));
      } else {
        return some(new _NonEmptyIMapAVLNode(_k, v, _left, _right));
      }
    }
  
  
negative.code: }
  
  IMap/*<K, V>*/ imap/*<K, V>*/(Map/*<K, V>*/ m) => new IMap.from(m);
  IMap/*<K, V>*/ imapWithOrder/*<K, K2 extends K, V>*/(Order/*<K>*/ o, Map/*<K2, V>*/ m) => new IMap/*<K, V>*/.fromWithOrder(o, m);
  IMap/*<K, V>*/ emptyMap/*<K, V>*/() => new IMap.empty();
  IMap/*<K, V>*/ singletonMap/*<K, V>*/(/*=K*/ k, /*=V*/ v) => new IMap/*<K, V>*/.empty().put(k, v);
  
  