@Override
  public @NotNull <V> KeyFMap plus(@NotNull Key<V> key, @NotNull V value) {
    int keyCode = key.hashCode();
    int keyPos = indexOf(keyCode);
    if (keyPos >= 0) {
      if (values[keyPos] == value) {
        return this;
      }
      Object[] newValues = values.clone();
      newValues[keyPos] = value;
      // Can reuse keys as it is never mutated
      return new ArrayBackedFMap(keys, newValues);
    }
    if (size() < ARRAY_THRESHOLD) {
      int[] newKeys = ArrayUtil.insert(keys, -keyPos - 1, keyCode);
      Object[] newValues = ArrayUtil.insert(values, -keyPos - 1, value);
      return new ArrayBackedFMap(newKeys, newValues);
    }
    return new MapBackedFMap(keys, keyCode, values, value);
  }
@Override
  public @NotNull <V> KeyFMap plus(@NotNull Key<V> key, @NotNull V value)