| import _curry3 from "./internal/_curry3.js"; |
| import _has from "./internal/_has.js"; |
| import _isArray from "./internal/_isArray.js"; |
| import _isInteger from "./internal/_isInteger.js"; |
| import assoc from "./assoc.js"; |
| import isNil from "./isNil.js"; |
| /** |
| * Makes a shallow clone of an object, setting or overriding the nodes required |
| * to create the given path, and placing the specific value at the tail end of |
| * that path. Note that this copies and flattens prototype properties onto the |
| * new object as well. All non-primitive properties are copied by reference. |
| * |
| * @func |
| * @memberOf R |
| * @since v0.8.0 |
| * @category Object |
| * @typedefn Idx = String | Int |
| * @sig [Idx] -> a -> {a} -> {a} |
| * @param {Array} path the path to set |
| * @param {*} val The new value |
| * @param {Object} obj The object to clone |
| * @return {Object} A new object equivalent to the original except along the specified path. |
| * @see R.dissocPath |
| * @example |
| * |
| * R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}} |
| * |
| * // Any missing or non-object keys in path will be overridden |
| * R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}} |
| */ |
| |
| var assocPath = |
| /*#__PURE__*/ |
| _curry3(function assocPath(path, val, obj) { |
| if (path.length === 0) { |
| return val; |
| } |
| |
| var idx = path[0]; |
| |
| if (path.length > 1) { |
| var nextObj = !isNil(obj) && _has(idx, obj) ? obj[idx] : _isInteger(path[1]) ? [] : {}; |
| val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj); |
| } |
| |
| if (_isInteger(idx) && _isArray(obj)) { |
| var arr = [].concat(obj); |
| arr[idx] = val; |
| return arr; |
| } else { |
| return assoc(idx, val, obj); |
| } |
| }); |
| |
| export default assocPath; |