You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.8 KiB
81 lines
1.8 KiB
var fromArray = exports.fromArray = function(array) {
|
|
var index = 0;
|
|
var hasNext = function() {
|
|
return index < array.length;
|
|
};
|
|
return new LazyIterator({
|
|
hasNext: hasNext,
|
|
next: function() {
|
|
if (!hasNext()) {
|
|
throw new Error("No more elements");
|
|
} else {
|
|
return array[index++];
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
var LazyIterator = function(iterator) {
|
|
this._iterator = iterator;
|
|
};
|
|
|
|
LazyIterator.prototype.map = function(func) {
|
|
var iterator = this._iterator;
|
|
return new LazyIterator({
|
|
hasNext: function() {
|
|
return iterator.hasNext();
|
|
},
|
|
next: function() {
|
|
return func(iterator.next());
|
|
}
|
|
});
|
|
};
|
|
|
|
LazyIterator.prototype.filter = function(condition) {
|
|
var iterator = this._iterator;
|
|
|
|
var moved = false;
|
|
var hasNext = false;
|
|
var next;
|
|
var moveIfNecessary = function() {
|
|
if (moved) {
|
|
return;
|
|
}
|
|
moved = true;
|
|
hasNext = false;
|
|
while (iterator.hasNext() && !hasNext) {
|
|
next = iterator.next();
|
|
hasNext = condition(next);
|
|
}
|
|
};
|
|
|
|
return new LazyIterator({
|
|
hasNext: function() {
|
|
moveIfNecessary();
|
|
return hasNext;
|
|
},
|
|
next: function() {
|
|
moveIfNecessary();
|
|
var toReturn = next;
|
|
moved = false;
|
|
return toReturn;
|
|
}
|
|
});
|
|
};
|
|
|
|
LazyIterator.prototype.first = function() {
|
|
var iterator = this._iterator;
|
|
if (this._iterator.hasNext()) {
|
|
return iterator.next();
|
|
} else {
|
|
return null;
|
|
}
|
|
};
|
|
|
|
LazyIterator.prototype.toArray = function() {
|
|
var result = [];
|
|
while (this._iterator.hasNext()) {
|
|
result.push(this._iterator.next());
|
|
}
|
|
return result;
|
|
};
|
|
|