From 556eee85633d262ca8e865912390c4f3f975ce9e Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Sat, 5 Sep 2015 09:04:46 -0700 Subject: [PATCH] Use a create function helper for `modArgs`. --- lodash.js | 40 +++++++++++++++++++++++++++------------- test/test.js | 6 +++--- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/lodash.js b/lodash.js index 1dcf57970..263cef5b4 100644 --- a/lodash.js +++ b/lodash.js @@ -3513,6 +3513,31 @@ return wrapper; } + /** + * Creates a function like `_.modArgs`. + * + * @private + * @param {Function} resolver The function to resolve which invocation + * arguments are provided to each transform. + * @returns {Function} Returns the new arguments modifier function. + */ + function createModArgs(resolver) { + return 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].apply(this, resolver(args[index], index, args)); + } + return func.apply(this, args); + }); + }); + } + /** * Creates the padding required for `string` based on the given `length`. * The `chars` string is truncated if the number of characters exceeds `length`. @@ -7578,19 +7603,8 @@ * 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); - }); + var modArgs = createModArgs(function(value) { + return [value]; }); /** diff --git a/test/test.js b/test/test.js index 2cabad3ed..9ac313e81 100644 --- a/test/test.js +++ b/test/test.js @@ -11057,19 +11057,19 @@ deepEqual(modded(5, 10, 18), [5, 10, 18]); }); - test('should not pass `undefined` if there are more `transforms` than `arguments`', 1, function() { + test('should not pass `undefined` if there are more transforms than arguments', 1, function() { var modded = _.modArgs(fn, doubled, _.identity); deepEqual(modded(5), [10]); }); - test('should not set a `this` binding', 1, function() { + test('should use `this` binding of function for transforms', 1, function() { var modded = _.modArgs(function(x) { return this[x]; }, function(x) { return this === x; }); - var object = { 'modded': modded, 'false': 1 }; + var object = { 'modded': modded, 'true': 1 }; strictEqual(object.modded(object), 1); }); }());