Source: object/dissocPath.js

import curry2 from "../function/curry2";
import _getPathArray from "../internals/_getPathArray";
import dissoc from "./dissoc";
import assoc from "./assoc";
import isNil from "../logic/isNil";
import slice from "../list/slice";

/**
 * Creates a shallow copy of the object
 * with the element at the specified path removed.
 *
 * @see assocPath
 * @param {string|string[]} path
 * @param {object} object
 * @returns {object}
 */
const dissocPath = (path, object) => {
  const pathArray = _getPathArray(path);
  if (pathArray.length === 0) {
    return { ...object };
  }

  const prop = pathArray[0];
  const remainingPath = slice(1, pathArray.length, pathArray);

  if (pathArray.length === 1) {
    return dissoc(prop, object);
  }

  if (isNil(object[prop])) {
    return { ...object };
  }

  return assoc(prop, dissocPath(remainingPath, object[prop]), object);
};

export default curry2(dissocPath);