* Creates a function that, when called, either curries or invokes `func` * with an optional `this` binding and partially applied arguments. * * @private * @param {Function|string} func The function or method name to reference. * @param {number} bitmask The bitmask of method
(func, bitmask, partialArgs, partialRightArgs, thisArg, arity)
| 36526 | * @returns {Function} Returns the new function. |
| 36527 | */ |
| 36528 | function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) { |
| 36529 | var isBind = bitmask & 1, |
| 36530 | isBindKey = bitmask & 2, |
| 36531 | isCurry = bitmask & 4, |
| 36532 | isCurryBound = bitmask & 8, |
| 36533 | isPartial = bitmask & 16, |
| 36534 | isPartialRight = bitmask & 32; |
| 36535 | |
| 36536 | if (!isBindKey && !isFunction(func)) { |
| 36537 | throw new TypeError; |
| 36538 | } |
| 36539 | if (isPartial && !partialArgs.length) { |
| 36540 | bitmask &= ~16; |
| 36541 | isPartial = partialArgs = false; |
| 36542 | } |
| 36543 | if (isPartialRight && !partialRightArgs.length) { |
| 36544 | bitmask &= ~32; |
| 36545 | isPartialRight = partialRightArgs = false; |
| 36546 | } |
| 36547 | var bindData = func && func.__bindData__; |
| 36548 | if (bindData && bindData !== true) { |
| 36549 | // clone `bindData` |
| 36550 | bindData = slice(bindData); |
| 36551 | if (bindData[2]) { |
| 36552 | bindData[2] = slice(bindData[2]); |
| 36553 | } |
| 36554 | if (bindData[3]) { |
| 36555 | bindData[3] = slice(bindData[3]); |
| 36556 | } |
| 36557 | // set `thisBinding` is not previously bound |
| 36558 | if (isBind && !(bindData[1] & 1)) { |
| 36559 | bindData[4] = thisArg; |
| 36560 | } |
| 36561 | // set if previously bound but not currently (subsequent curried functions) |
| 36562 | if (!isBind && bindData[1] & 1) { |
| 36563 | bitmask |= 8; |
| 36564 | } |
| 36565 | // set curried arity if not yet set |
| 36566 | if (isCurry && !(bindData[1] & 4)) { |
| 36567 | bindData[5] = arity; |
| 36568 | } |
| 36569 | // append partial left arguments |
| 36570 | if (isPartial) { |
| 36571 | push.apply(bindData[2] || (bindData[2] = []), partialArgs); |
| 36572 | } |
| 36573 | // append partial right arguments |
| 36574 | if (isPartialRight) { |
| 36575 | unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs); |
| 36576 | } |
| 36577 | // merge flags |
| 36578 | bindData[1] |= bitmask; |
| 36579 | return createWrapper.apply(null, bindData); |
| 36580 | } |
| 36581 | // fast path for `_.bind` |
| 36582 | var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper; |
| 36583 | return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]); |
| 36584 | } |
| 36585 |