40856aeee9c5f087782225cc1e1d2f5036754a8f
[yaffs-website] / node_modules / grunt-legacy-log-utils / node_modules / lodash / rest.js
1 var apply = require('./_apply'),
2     toInteger = require('./toInteger');
3
4 /** Used as the `TypeError` message for "Functions" methods. */
5 var FUNC_ERROR_TEXT = 'Expected a function';
6
7 /* Built-in method references for those with the same name as other `lodash` methods. */
8 var nativeMax = Math.max;
9
10 /**
11  * Creates a function that invokes `func` with the `this` binding of the
12  * created function and arguments from `start` and beyond provided as an array.
13  *
14  * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).
15  *
16  * @static
17  * @memberOf _
18  * @category Function
19  * @param {Function} func The function to apply a rest parameter to.
20  * @param {number} [start=func.length-1] The start position of the rest parameter.
21  * @returns {Function} Returns the new function.
22  * @example
23  *
24  * var say = _.rest(function(what, names) {
25  *   return what + ' ' + _.initial(names).join(', ') +
26  *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
27  * });
28  *
29  * say('hello', 'fred', 'barney', 'pebbles');
30  * // => 'hello fred, barney, & pebbles'
31  */
32 function rest(func, start) {
33   if (typeof func != 'function') {
34     throw new TypeError(FUNC_ERROR_TEXT);
35   }
36   start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);
37   return function() {
38     var args = arguments,
39         index = -1,
40         length = nativeMax(args.length - start, 0),
41         array = Array(length);
42
43     while (++index < length) {
44       array[index] = args[start + index];
45     }
46     switch (start) {
47       case 0: return func.call(this, array);
48       case 1: return func.call(this, args[0], array);
49       case 2: return func.call(this, args[0], args[1], array);
50     }
51     var otherArgs = Array(start + 1);
52     index = -1;
53     while (++index < start) {
54       otherArgs[index] = args[index];
55     }
56     otherArgs[start] = array;
57     return apply(func, this, otherArgs);
58   };
59 }
60
61 module.exports = rest;