Use a create function helper for modArgs.

This commit is contained in:
John-David Dalton
2015-09-05 09:04:46 -07:00
parent 1422f50ee9
commit 556eee8563
2 changed files with 30 additions and 16 deletions

View File

@@ -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];
});
/**

View File

@@ -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);
});
}());