| /** |
| * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> |
| * Build: `lodash modularize exports="node" -o ./compat/` |
| * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> |
| * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> |
| * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors |
| * Available under MIT license <http://lodash.com/license> |
| */ |
| var baseBind = require('./baseBind'), |
| baseCreateWrapper = require('./baseCreateWrapper'), |
| isFunction = require('../objects/isFunction'), |
| slice = require('./slice'); |
| |
| /** |
| * Used for `Array` method references. |
| * |
| * Normally `Array.prototype` would suffice, however, using an array literal |
| * avoids issues in Narwhal. |
| */ |
| var arrayRef = []; |
| |
| /** Native method shortcuts */ |
| var push = arrayRef.push, |
| unshift = arrayRef.unshift; |
| |
| /** |
| * 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 flags to compose. |
| * The bitmask may be composed of the following flags: |
| * 1 - `_.bind` |
| * 2 - `_.bindKey` |
| * 4 - `_.curry` |
| * 8 - `_.curry` (bound) |
| * 16 - `_.partial` |
| * 32 - `_.partialRight` |
| * @param {Array} [partialArgs] An array of arguments to prepend to those |
| * provided to the new function. |
| * @param {Array} [partialRightArgs] An array of arguments to append to those |
| * provided to the new function. |
| * @param {*} [thisArg] The `this` binding of `func`. |
| * @param {number} [arity] The arity of `func`. |
| * @returns {Function} Returns the new function. |
| */ |
| function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) { |
| var isBind = bitmask & 1, |
| isBindKey = bitmask & 2, |
| isCurry = bitmask & 4, |
| isCurryBound = bitmask & 8, |
| isPartial = bitmask & 16, |
| isPartialRight = bitmask & 32; |
| |
| if (!isBindKey && !isFunction(func)) { |
| throw new TypeError; |
| } |
| if (isPartial && !partialArgs.length) { |
| bitmask &= ~16; |
| isPartial = partialArgs = false; |
| } |
| if (isPartialRight && !partialRightArgs.length) { |
| bitmask &= ~32; |
| isPartialRight = partialRightArgs = false; |
| } |
| var bindData = func && func.__bindData__; |
| if (bindData && bindData !== true) { |
| // clone `bindData` |
| bindData = slice(bindData); |
| if (bindData[2]) { |
| bindData[2] = slice(bindData[2]); |
| } |
| if (bindData[3]) { |
| bindData[3] = slice(bindData[3]); |
| } |
| // set `thisBinding` is not previously bound |
| if (isBind && !(bindData[1] & 1)) { |
| bindData[4] = thisArg; |
| } |
| // set if previously bound but not currently (subsequent curried functions) |
| if (!isBind && bindData[1] & 1) { |
| bitmask |= 8; |
| } |
| // set curried arity if not yet set |
| if (isCurry && !(bindData[1] & 4)) { |
| bindData[5] = arity; |
| } |
| // append partial left arguments |
| if (isPartial) { |
| push.apply(bindData[2] || (bindData[2] = []), partialArgs); |
| } |
| // append partial right arguments |
| if (isPartialRight) { |
| unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs); |
| } |
| // merge flags |
| bindData[1] |= bitmask; |
| return createWrapper.apply(null, bindData); |
| } |
| // fast path for `_.bind` |
| var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper; |
| return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]); |
| } |
| |
| module.exports = createWrapper; |