1 var apply = require('./apply'),
2 createCtorWrapper = require('./createCtorWrapper'),
3 createHybridWrapper = require('./createHybridWrapper'),
4 createRecurryWrapper = require('./createRecurryWrapper'),
5 replaceHolders = require('./replaceHolders');
8 * Creates a function that wraps `func` to enable currying.
11 * @param {Function} func The function to wrap.
12 * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details.
13 * @param {number} arity The arity of `func`.
14 * @returns {Function} Returns the new wrapped function.
16 function createCurryWrapper(func, bitmask, arity) {
17 var Ctor = createCtorWrapper(func);
20 var length = arguments.length,
23 fn = (this && this !== global && this instanceof wrapper) ? Ctor : func,
24 placeholder = wrapper.placeholder;
27 args[index] = arguments[index];
29 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
31 : replaceHolders(args, placeholder);
33 length -= holders.length;
35 ? createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, undefined, args, holders, undefined, undefined, arity - length)
36 : apply(fn, this, args);
41 module.exports = createCurryWrapper;