@Override
  public void mergeWith(final SmartMap<K, V> anotherMap, final BinaryFunction<V, V> mergeFunct) {
    SmartMap<K, V> resultMap = createNewInstance(internalMap);
    clear();

    for (Map.Entry<K, V> entry : anotherMap.entrySet()) {
      if (resultMap.containsKey(entry.getKey())) {
        V mergedVal = mergeFunct.apply(resultMap.get(entry.getKey()), entry.getValue());
        internalMap.put(entry.getKey(), mergedVal);
      } else {
        internalMap.put(entry.getKey(), entry.getValue());
      }
    }
  }