code: private HamtPMap<K, V> minus(K key, int hash, V[] value) {
      if (hash == this.hash && key.equals(this.key)) {
        HamtPMap<K, V> result = deleteRoot(mask, children);
        if (value != null) {
          value[0] = this.value;
        }
        return result != null ? result : empty();
      }
      int bucket = bucket(hash);
      int bucketMask = 1 << bucket;
      if ((mask & bucketMask) == 0) {
        // not present, stop looking
        return this;
      }
      hash = shift(hash);
      int index = index(bucketMask);
      HamtPMap<K, V> child = children[index];
      HamtPMap<K, V> newChild = child.minus(key, hash, value);
      if (newChild == child) {
        return this;
      } else if (newChild == EMPTY) {
        return withChildren(mask & ~bucketMask, deleteChild(children, index));
      } else {
        return withChildren(mask, replaceChild(children, index, newChild));
      }
    }
docs: Internal recursive implementation of minus(K). The value of the removed node is returned via
  the 'value' array, if it is non-null.