code: function merge(target, path, value) {
      return set(target, path, assign(Array.isArray(value) ? [] : {}, get(target, path), value));
  }
docs: Immutable merge: merges the given value and the existing value (if any) at the path in the target using Object.assign() and return a new target.
  Creates the necessary objects/arrays if the path doesn't exist.