diff --git a/.internal/mergeData.js b/.internal/mergeData.js deleted file mode 100644 index 506d1662b..000000000 --- a/.internal/mergeData.js +++ /dev/null @@ -1,89 +0,0 @@ -import composeArgs from './composeArgs.js' -import composeArgsRight from './composeArgsRight.js' -import replaceHolders from './replaceHolders.js' - -/** Used as the internal argument placeholder. */ -const PLACEHOLDER = '__lodash_placeholder__' - -/** Used to compose bitmasks for function metadata. */ -const WRAP_BIND_FLAG = 1 -const WRAP_BIND_KEY_FLAG = 2 -const WRAP_CURRY_BOUND_FLAG = 4 -const WRAP_CURRY_FLAG = 8 -const WRAP_ARY_FLAG = 128 -const WRAP_REARG_FLAG = 256 - -/** - * Merges the function metadata of `source` into `data`. - * - * Merging metadata reduces the number of wrappers used to invoke a function. - * This is possible because methods like `bind`, `curry`, and `partial` - * may be applied regardless of execution order. Methods like `ary` and - * `rearg` modify function arguments, making the order in which they are - * executed important, preventing the merging of metadata. However, we make - * an exception for a safe combined case where curried functions have `ary` - * and or `rearg` applied. - * - * @private - * @param {Array} data The destination metadata. - * @param {Array} source The source metadata. - * @returns {Array} Returns `data`. - */ -function mergeData(data, source) { - const bitmask = data[1] - const srcBitmask = source[1] - - let newBitmask = bitmask | srcBitmask - const isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG) - - const isCombo = - ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || - ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || - ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)) - - // Exit early if metadata can't be merged. - if (!(isCommon || isCombo)) { - return data - } - // Use source `thisArg` if available. - if (srcBitmask & WRAP_BIND_FLAG) { - data[2] = source[2] - // Set when currying a bound function. - newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG - } - // Compose partial arguments. - let partials - let value = source[3] - if (value) { - partials = data[3] - data[3] = partials ? composeArgs(partials, value, source[4]) : value - data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4] - } - // Compose partial right arguments. - value = source[5] - if (value) { - partials = data[5] - data[5] = partials ? composeArgsRight(partials, value, source[6]) : value - data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6] - } - // Use source `argPos` if available. - value = source[7] - if (value) { - data[7] = value - } - // Use source `ary` if it's smaller. - if (srcBitmask & WRAP_ARY_FLAG) { - data[8] = data[8] == null ? source[8] : Math.min(data[8], source[8]) - } - // Use source `arity` if one is not provided. - if (data[9] == null) { - data[9] = source[9] - } - // Use source `func` and merge bitmasks. - data[0] = source[0] - data[1] = newBitmask - - return data -} - -export default mergeData