diff --git a/lodash.src.js b/lodash.src.js index 4c3c7284f..dc5f3f403 100644 --- a/lodash.src.js +++ b/lodash.src.js @@ -11674,12 +11674,13 @@ chainAll = this.__chain__, value = this.__wrapped__, isHybrid = !!this.__actions__.length, - isLazy = value instanceof LazyWrapper; + isLazy = value instanceof LazyWrapper, + iteratee = args[0], + useLazy = isLazy || isArray(value); - if (isLazy && checkIteratee) { + if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) { // avoid lazy use if the iteratee has a `length` other than `1` - var iteratee = args[0]; - isLazy = !(typeof iteratee == 'function' && iteratee.length != 1); + isLazy = useLazy = false; } var onlyLazy = isLazy && !isHybrid; if (retUnwrapped && !chainAll) { @@ -11692,7 +11693,7 @@ push.apply(otherArgs, args); return lodashFunc.apply(lodash, otherArgs); }; - if (isLazy || isArray(value)) { + if (useLazy) { var wrapper = onlyLazy ? value : new LazyWrapper(this), result = func.apply(wrapper, args); diff --git a/test/test.js b/test/test.js index 786d29e2d..a6b875fa8 100644 --- a/test/test.js +++ b/test/test.js @@ -3986,11 +3986,17 @@ } }); - test('should provide the correct `predicate` arguments in a lazy chain sequence', 4, function() { + test('should provide the correct `predicate` arguments in a lazy chain sequence', 5, function() { if (!isNpm) { var args, expected = [16, 3, [1, 4, 9 ,16]]; + _(array).dropRightWhile(function(value, index, array) { + args = slice.call(arguments); + }).value(); + + deepEqual(args, [4, 3, array]); + _(array).map(square).dropRightWhile(function(value, index, array) { args = slice.call(arguments); }).value(); @@ -4016,7 +4022,7 @@ deepEqual(args, expected); } else { - skipTest(4); + skipTest(5); } }); }()); @@ -4102,11 +4108,17 @@ } }); - test('should provide the correct `predicate` arguments in a lazy chain sequence', 4, function() { + test('should provide the correct `predicate` arguments in a lazy chain sequence', 5, function() { if (!isNpm) { var args, expected = [1, 0, [1, 4, 9, 16]]; + _(array).dropWhile(function(value, index, array) { + args = slice.call(arguments); + }).value(); + + deepEqual(args, [1, 0, array]); + _(array).map(square).dropWhile(function(value, index, array) { args = slice.call(arguments); }).value(); @@ -4132,7 +4144,7 @@ deepEqual(args, expected); } else { - skipTest(4); + skipTest(5); } }); }()); @@ -4936,11 +4948,17 @@ } }); - test('should provide the correct `predicate` arguments in a lazy chain sequence', 4, function() { + test('should provide the correct `predicate` arguments in a lazy chain sequence', 5, function() { if (!isNpm) { var args, expected = [16, 3, [1, 4, 9 , 16]]; + _(array).takeRightWhile(function(value, index, array) { + args = slice.call(arguments) + }).value(); + + deepEqual(args, [4, 3, array]); + _(array).map(square).takeRightWhile(function(value, index, array) { args = slice.call(arguments) }).value(); @@ -4966,7 +4984,7 @@ deepEqual(args, expected); } else { - skipTest(4); + skipTest(5); } }); }()); @@ -5051,11 +5069,17 @@ } }); - test('should provide the correct `predicate` arguments in a lazy chain sequence', 4, function() { + test('should provide the correct `predicate` arguments in a lazy chain sequence', 5, function() { if (!isNpm) { var args, expected = [1, 0, [1, 4, 9, 16]]; + _(array).takeWhile(function(value, index, array) { + args = slice.call(arguments); + }).value(); + + deepEqual(args, [1, 0, array]); + _(array).map(square).takeWhile(function(value, index, array) { args = slice.call(arguments); }).value(); @@ -5081,7 +5105,7 @@ deepEqual(args, expected); } else { - skipTest(4); + skipTest(5); } }); }()); @@ -9223,11 +9247,18 @@ } }); - test('should provide the correct `predicate` arguments in a lazy chain sequence', 4, function() { + test('should provide the correct `predicate` arguments in a lazy chain sequence', 5, function() { if (!isNpm) { var args, expected = [1, 0, [1, 4, 9]]; + _(array).map(function(value, index, array) { + args || (args = slice.call(arguments)); + }).value(); + + deepEqual(args, [1, 0, array]); + + args = null; _(array).map(square).map(function(value, index, array) { args || (args = slice.call(arguments)); }).value(); @@ -9256,7 +9287,7 @@ deepEqual(args, expected); } else { - skipTest(4); + skipTest(5); } }); @@ -12210,11 +12241,18 @@ } }); - test('`_.' + methodName + '` should provide the correct `predicate` arguments in a lazy chain sequence', 4, function() { + test('`_.' + methodName + '` should provide the correct `predicate` arguments in a lazy chain sequence', 5, function() { if (!isNpm) { var args, expected = [1, 0, [1, 4, 9, 16]]; + _(array)[methodName](function(value, index, array) { + args || (args = slice.call(arguments)); + }).value(); + + deepEqual(args, [1, 0, array]); + + args = null; _(array).map(square)[methodName](function(value, index, array) { args || (args = slice.call(arguments)); }).value(); @@ -12243,7 +12281,7 @@ deepEqual(args, expected); } else { - skipTest(4); + skipTest(5); } }); });