1 var apply = require('./_apply'),
2 createCtorWrapper = require('./_createCtorWrapper'),
3 createHybridWrapper = require('./_createHybridWrapper'),
4 createRecurryWrapper = require('./_createRecurryWrapper'),
5 replaceHolders = require('./_replaceHolders'),
6 root = require('./_root');
9 * Creates a function that wraps `func` to enable currying.
12 * @param {Function} func The function to wrap.
13 * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details.
14 * @param {number} arity The arity of `func`.
15 * @returns {Function} Returns the new wrapped function.
17 function createCurryWrapper(func, bitmask, arity) {
18 var Ctor = createCtorWrapper(func);
21 var length = arguments.length,
24 fn = (this && this !== root && this instanceof wrapper) ? Ctor : func,
25 placeholder = wrapper.placeholder;
28 args[index] = arguments[index];
30 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
32 : replaceHolders(args, placeholder);
34 length -= holders.length;
36 ? createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, undefined, args, holders, undefined, undefined, arity - length)
37 : apply(fn, this, args);
42 module.exports = createCurryWrapper;