| var apply = require('./_apply'), |
| arrayMap = require('./_arrayMap'), |
| baseFlatten = require('./_baseFlatten'), |
| baseIteratee = require('./_baseIteratee'), |
| baseRest = require('./_baseRest'), |
| baseUnary = require('./_baseUnary'), |
| castRest = require('./_castRest'), |
| isArray = require('./isArray'); |
| |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeMin = Math.min; |
| |
| /** |
| * Creates a function that invokes `func` with its arguments transformed. |
| * |
| * @static |
| * @since 4.0.0 |
| * @memberOf _ |
| * @category Function |
| * @param {Function} func The function to wrap. |
| * @param {...(Function|Function[])} [transforms=[_.identity]] |
| * The argument transforms. |
| * @returns {Function} Returns the new function. |
| * @example |
| * |
| * function doubled(n) { |
| * return n * 2; |
| * } |
| * |
| * function square(n) { |
| * return n * n; |
| * } |
| * |
| * var func = _.overArgs(function(x, y) { |
| * return [x, y]; |
| * }, [square, doubled]); |
| * |
| * func(9, 3); |
| * // => [81, 6] |
| * |
| * func(10, 5); |
| * // => [100, 10] |
| */ |
| var overArgs = castRest(function(func, transforms) { |
| transforms = (transforms.length == 1 && isArray(transforms[0])) |
| ? arrayMap(transforms[0], baseUnary(baseIteratee)) |
| : arrayMap(baseFlatten(transforms, 1), baseUnary(baseIteratee)); |
| |
| var funcsLength = transforms.length; |
| return baseRest(function(args) { |
| var index = -1, |
| length = nativeMin(args.length, funcsLength); |
| |
| while (++index < length) { |
| args[index] = transforms[index].call(this, args[index]); |
| } |
| return apply(func, this, args); |
| }); |
| }); |
| |
| module.exports = overArgs; |