From 8eccdd098aebbbec401f0a9763074e9f26e6c721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luiz=20Am=C3=A9rico?= Date: Wed, 5 Dec 2018 02:09:54 -0200 Subject: [PATCH] Restore createAssigner (fixes compilation of merge and mergeWith) (#4101) --- .internal/createAssigner.js | 36 ++++++++++++++++++++++++++++++++++++ .internal/isIterateeCall.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 .internal/createAssigner.js create mode 100644 .internal/isIterateeCall.js diff --git a/.internal/createAssigner.js b/.internal/createAssigner.js new file mode 100644 index 000000000..9d1b70476 --- /dev/null +++ b/.internal/createAssigner.js @@ -0,0 +1,36 @@ +import isIterateeCall from './isIterateeCall.js'; + +/** + * Creates a function like `assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return (object, ...sources) => { + let index = -1; + let length = sources.length; + let customizer = length > 1 ? sources[length - 1] : undefined; + const guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + const source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }; +} + +export default createAssigner; \ No newline at end of file diff --git a/.internal/isIterateeCall.js b/.internal/isIterateeCall.js new file mode 100644 index 000000000..29e6c5462 --- /dev/null +++ b/.internal/isIterateeCall.js @@ -0,0 +1,29 @@ +import isArrayLike from '../isArrayLike.js' +import isIndex from './isIndex.js' + +/** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + const type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; +} + +export default isIterateeCall