1 var 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');
10 /* Built-in method references for those with the same name as other `lodash` methods. */
11 var nativeMin = Math.min;
14 * Creates a function that invokes `func` with its arguments transformed.
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.
26 * function doubled(n) {
30 * function square(n) {
34 * var func = _.overArgs(function(x, y) {
36 * }, [square, doubled]);
44 var 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));
49 var funcsLength = transforms.length;
50 return baseRest(function(args) {
52 length = nativeMin(args.length, funcsLength);
54 while (++index < length) {
55 args[index] = transforms[index].call(this, args[index]);
57 return apply(func, this, args);
61 module.exports = overArgs;