1var apply = require('./_apply'), 2 arrayMap = require('./_arrayMap'), 3 baseFlatten = require('./_baseFlatten'), 4 baseIteratee = require('./_baseIteratee'), 5 baseRest = require('./_baseRest'), 6 baseUnary = require('./_baseUnary'), 7 castRest = require('./_castRest'), 8 isArray = require('./isArray'); 9 10/* Built-in method references for those with the same name as other `lodash` methods. */ 11var nativeMin = Math.min; 12 13/** 14 * Creates a function that invokes `func` with its arguments transformed. 15 * 16 * @static 17 * @since 4.0.0 18 * @memberOf _ 19 * @category Function 20 * @param {Function} func The function to wrap. 21 * @param {...(Function|Function[])} [transforms=[_.identity]] 22 * The argument transforms. 23 * @returns {Function} Returns the new function. 24 * @example 25 * 26 * function doubled(n) { 27 * return n * 2; 28 * } 29 * 30 * function square(n) { 31 * return n * n; 32 * } 33 * 34 * var func = _.overArgs(function(x, y) { 35 * return [x, y]; 36 * }, [square, doubled]); 37 * 38 * func(9, 3); 39 * // => [81, 6] 40 * 41 * func(10, 5); 42 * // => [100, 10] 43 */ 44var overArgs = castRest(function(func, transforms) { 45 transforms = (transforms.length == 1 && isArray(transforms[0])) 46 ? arrayMap(transforms[0], baseUnary(baseIteratee)) 47 : arrayMap(baseFlatten(transforms, 1), baseUnary(baseIteratee)); 48 49 var funcsLength = transforms.length; 50 return baseRest(function(args) { 51 var index = -1, 52 length = nativeMin(args.length, funcsLength); 53 54 while (++index < length) { 55 args[index] = transforms[index].call(this, args[index]); 56 } 57 return apply(func, this, args); 58 }); 59}); 60 61module.exports = overArgs; 62