1 var apply = require('./_apply'),
2 toInteger = require('./toInteger');
4 /** Used as the `TypeError` message for "Functions" methods. */
5 var FUNC_ERROR_TEXT = 'Expected a function';
7 /* Built-in method references for those with the same name as other `lodash` methods. */
8 var nativeMax = Math.max;
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.
14 * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).
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.
24 * var say = _.rest(function(what, names) {
25 * return what + ' ' + _.initial(names).join(', ') +
26 * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
29 * say('hello', 'fred', 'barney', 'pebbles');
30 * // => 'hello fred, barney, & pebbles'
32 function rest(func, start) {
33 if (typeof func != 'function') {
34 throw new TypeError(FUNC_ERROR_TEXT);
36 start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);
40 length = nativeMax(args.length - start, 0),
41 array = Array(length);
43 while (++index < length) {
44 array[index] = args[start + index];
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);
51 var otherArgs = Array(start + 1);
53 while (++index < start) {
54 otherArgs[index] = args[index];
56 otherArgs[start] = array;
57 return apply(func, this, otherArgs);
61 module.exports = rest;