var arrayEvery = require('../internal/arrayEvery'), baseFlatten = require('../internal/baseFlatten'), baseIsFunction = require('../internal/baseIsFunction'), restParam = require('./restParam'); /** Used as the `TypeError` message for "Functions" methods. */ var FUNC_ERROR_TEXT = 'Expected a function'; /* Native method references for those with the same name as other `lodash` methods. */ var nativeMin = Math.min; /** * Creates a function that runs each argument through a corresponding * transform function. * * @static * @memberOf _ * @category Function * @param {Function} func The function to wrap. * @param {...(Function|Function[])} [transforms] The functions to transform * arguments, specified as individual functions or arrays of functions. * @returns {Function} Returns the new function. * @example * * function doubled(n) { * return n * 2; * } * * function square(n) { * return n * n; * } * * var modded = _.modArgs(function(x, y) { * return [x, y]; * }, square, doubled); * * modded(1, 2); * // => [1, 4] * * modded(5, 10); * // => [25, 20] */ var modArgs = restParam(function(func, transforms) { transforms = baseFlatten(transforms); if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) { throw new TypeError(FUNC_ERROR_TEXT); } var length = transforms.length; return restParam(function(args) { var index = nativeMin(args.length, length); while (index--) { args[index] = transforms[index](args[index]); } return func.apply(this, args); }); }); module.exports = modArgs;