diff --git a/test/test.js b/test/test.js index 6c69858..f3c2b3b 100644 --- a/test/test.js +++ b/test/test.js @@ -155,6 +155,21 @@ describe('Test xrange', function () { return each + 1; }), zero2three); }); + + it('filter', function () { + assert.deepEqual(xrange(-5, 5).filter(function (each) { + return each >= 0 && each <= 3; + }), zero2three); + }); + + it('reduce', function () { + assert.equal(xrange(-5, 8).reduce(function (acc, each) { + return acc + each; + }), 13); + assert.equal(xrange(-5, 8).reduce(function (acc, each) { + return acc + each; + }, 1), 14); + }); }); }); diff --git a/xrange.js b/xrange.js index b462b7f..f1ec2c2 100644 --- a/xrange.js +++ b/xrange.js @@ -8,21 +8,47 @@ * Create array by executing `map` on each value. */ + var results = new Array(this.length); + + var value = start; + + for (var i = 0; i < this.length; i++) { + results[i] = callback(value); + value += by; + } + + return results; + }; + + this.filter = function (callback) { + /** + * Create array of items that satisfy predicate function + */ + var results = []; - var cmp = function (i, finish) { - if (start < finish) { - return i < finish; - } else { - return i > finish; + for (var i = start; i < finish; i += by) { + if (callback(i)) { + results.push(i); } - }; + } + return results; + }; + + this.reduce = function (callback, acc) { + /** + * Reduces an xrange by specified callback + */ - for (var i = start; cmp(i, finish); i += by) { - results.push(callback(i)); + if (acc === undefined) { + acc = start; + start += by; } - return results; + for (var i = start; i < finish; i += by) { + acc = callback(acc, i); + } + return acc; }; this.each = this.forEach = function (callback) { @@ -48,6 +74,8 @@ return each; }); }; + + }; var factory = function (start, finish, by) {