UNPKG

1.87 kBJavaScriptView Raw
1var fromArray = exports.fromArray = function(array) {
2 var index = 0;
3 var hasNext = function() {
4 return index < array.length;
5 };
6 return new LazyIterator({
7 hasNext: hasNext,
8 next: function() {
9 if (!hasNext()) {
10 throw new Error("No more elements");
11 } else {
12 return array[index++];
13 }
14 }
15 });
16};
17
18var LazyIterator = function(iterator) {
19 this._iterator = iterator;
20};
21
22LazyIterator.prototype.map = function(func) {
23 var iterator = this._iterator;
24 return new LazyIterator({
25 hasNext: function() {
26 return iterator.hasNext();
27 },
28 next: function() {
29 return func(iterator.next());
30 }
31 });
32};
33
34LazyIterator.prototype.filter = function(condition) {
35 var iterator = this._iterator;
36
37 var moved = false;
38 var hasNext = false;
39 var next;
40 var moveIfNecessary = function() {
41 if (moved) {
42 return;
43 }
44 moved = true;
45 hasNext = false;
46 while (iterator.hasNext() && !hasNext) {
47 next = iterator.next();
48 hasNext = condition(next);
49 }
50 };
51
52 return new LazyIterator({
53 hasNext: function() {
54 moveIfNecessary();
55 return hasNext;
56 },
57 next: function() {
58 moveIfNecessary();
59 var toReturn = next;
60 moved = false;
61 return toReturn;
62 }
63 });
64};
65
66LazyIterator.prototype.first = function() {
67 var iterator = this._iterator;
68 if (this._iterator.hasNext()) {
69 return iterator.next();
70 } else {
71 return null;
72 }
73};
74
75LazyIterator.prototype.toArray = function() {
76 var result = [];
77 while (this._iterator.hasNext()) {
78 result.push(this._iterator.next());
79 }
80 return result;
81};