From 1ae6e67cdcaee549f62ec51c43b245a75bc914f4 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Wed, 2 Dec 2015 21:42:51 -0800 Subject: [PATCH] Add `_.rangeRight`. --- lodash.js | 47 ++++++++++++++++++++++++++++++++++------------- test/test.js | 5 +++-- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/lodash.js b/lodash.js index 9c91ab191..22c3e342c 100644 --- a/lodash.js +++ b/lodash.js @@ -3247,6 +3247,33 @@ return min + nativeFloor(nativeRandom() * (max - min + 1)); } + function baseRange(start, end, step, fromRight) { + start = toNumber(start); + start = start === start ? start : 0; + + if (end === undefined) { + end = start; + start = 0; + } else { + end = toNumber(end) || 0; + } + step = step === undefined ? (start < end ? 1 : -1) : (toNumber(step) || 0); + + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (++index < length) { + if (fromRight) { + result[index] = (end -= step); + } else { + result[index] = start; + start+= step; + } + } + return result; + } + /** * The base implementation of `_.set`. * @@ -13279,21 +13306,14 @@ if (step && isIterateeCall(start, end, step)) { end = step = undefined; } - start = toNumber(start); - start = start === start ? start : 0; + return baseRange(start, end, step); + } - if (end === undefined) { - end = start; - start = 0; - } else { - end = toNumber(end) || 0; + function rangeRight(start, end, step) { + if (step && isIterateeCall(start, end, step)) { + end = step = undefined; } - step = step === undefined ? (start < end ? 1 : -1) : (toNumber(step) || 0); - - var n = nativeMax(nativeCeil((end - start) / (step || 1)), 0); - return baseTimes(n, function(index) { - return index ? (start += step) : start; - }); + return baseRange(start, end, step, true); } /** @@ -13795,6 +13815,7 @@ lodash.pullAllBy = pullAllBy; lodash.pullAt = pullAt; lodash.range = range; + lodash.rangeRight = rangeRight; lodash.rearg = rearg; lodash.reject = reject; lodash.remove = remove; diff --git a/test/test.js b/test/test.js index 4c3d37e5c..07d81681d 100644 --- a/test/test.js +++ b/test/test.js @@ -22570,6 +22570,7 @@ 'pullAll', 'pullAt', 'range', + 'rangeRight', 'reject', 'remove', 'sampleSize', @@ -22592,7 +22593,7 @@ var acceptFalsey = lodashStable.difference(allMethods, rejectFalsey); QUnit.test('should accept falsey arguments', function(assert) { - assert.expect(282); + assert.expect(284); var emptyArrays = lodashStable.map(falsey, lodashStable.constant([])); @@ -22630,7 +22631,7 @@ }); QUnit.test('should return an array', function(assert) { - assert.expect(68); + assert.expect(70); var array = [1, 2, 3];