Source: list/splice.js

import curry from "../function/curry";

/**
 * Creates a shallow copy of the list and splices it,
 * deleting `deleteCount` items at the specified index (can be zero),
 * and inserting `newElements` in that place.
 * Notice that `newElements` can also be an empty list.
 * Unlike `Array.prototype.splice`, it receives its new elements as a list instead of
 * [Rest parameters]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters}
 *
 * Reference: [Array.prototype.splice]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice}
 *
 * @param {number} index
 * @param {number} deleteCount
 * @param {any[]} newElements
 * @param {any[]} list
 * @returns {any[]}
 */
const splice = (index, deleteCount, newElements, list) => {
  const clone = list.slice();
  clone.splice(index, deleteCount, ...newElements);
  return clone;
};

export default curry(splice);