| var isLaziable = require('./_isLaziable'), |
| setData = require('./_setData'), |
| setWrapToString = require('./_setWrapToString'); |
| |
| /** Used to compose bitmasks for function metadata. */ |
| var WRAP_BIND_FLAG = 1, |
| WRAP_BIND_KEY_FLAG = 2, |
| WRAP_CURRY_BOUND_FLAG = 4, |
| WRAP_CURRY_FLAG = 8, |
| WRAP_PARTIAL_FLAG = 32, |
| WRAP_PARTIAL_RIGHT_FLAG = 64; |
| |
| /** |
| * Creates a function that wraps `func` to continue currying. |
| * |
| * @private |
| * @param {Function} func The function to wrap. |
| * @param {number} bitmask The bitmask flags. See `createWrap` for more details. |
| * @param {Function} wrapFunc The function to create the `func` wrapper. |
| * @param {*} placeholder The placeholder value. |
| * @param {*} [thisArg] The `this` binding of `func`. |
| * @param {Array} [partials] The arguments to prepend to those provided to |
| * the new function. |
| * @param {Array} [holders] The `partials` placeholder indexes. |
| * @param {Array} [argPos] The argument positions of the new function. |
| * @param {number} [ary] The arity cap of `func`. |
| * @param {number} [arity] The arity of `func`. |
| * @returns {Function} Returns the new wrapped function. |
| */ |
| function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { |
| var isCurry = bitmask & WRAP_CURRY_FLAG, |
| newHolders = isCurry ? holders : undefined, |
| newHoldersRight = isCurry ? undefined : holders, |
| newPartials = isCurry ? partials : undefined, |
| newPartialsRight = isCurry ? undefined : partials; |
| |
| bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); |
| bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); |
| |
| if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { |
| bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); |
| } |
| var newData = [ |
| func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, |
| newHoldersRight, argPos, ary, arity |
| ]; |
| |
| var result = wrapFunc.apply(undefined, newData); |
| if (isLaziable(func)) { |
| setData(result, newData); |
| } |
| result.placeholder = placeholder; |
| return setWrapToString(result, func, bitmask); |
| } |
| |
| module.exports = createRecurry; |