2fc9f7e6c9716c9cd1ac4f4b9b4e217b46b9f997
[yaffs-website] / node_modules / grunt-legacy-log-utils / node_modules / lodash / _createCurryWrapper.js
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');
7
8 /**
9  * Creates a function that wraps `func` to enable currying.
10  *
11  * @private
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.
16  */
17 function createCurryWrapper(func, bitmask, arity) {
18   var Ctor = createCtorWrapper(func);
19
20   function wrapper() {
21     var length = arguments.length,
22         index = length,
23         args = Array(length),
24         fn = (this && this !== root && this instanceof wrapper) ? Ctor : func,
25         placeholder = wrapper.placeholder;
26
27     while (index--) {
28       args[index] = arguments[index];
29     }
30     var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
31       ? []
32       : replaceHolders(args, placeholder);
33
34     length -= holders.length;
35     return length < arity
36       ? createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, undefined, args, holders, undefined, undefined, arity - length)
37       : apply(fn, this, args);
38   }
39   return wrapper;
40 }
41
42 module.exports = createCurryWrapper;