Dygraph.Iterator = function(array, start, length, predicate) {
start = start || 0;
length = length || array.length;
+ this.hasNext = true; // Use to identify if there's another element.
+ this.peek = null; // Use for look-ahead
+ this.start_ = start;
this.array_ = array;
this.predicate_ = predicate;
this.end_ = Math.min(array.length, start + length);
- this.nextIdx_ = start - 1; // use -1 so initial call to advance works.
- this.hasNext_ = true;
- this.peek_ = null;
- this.advance_();
-}
-
-Dygraph.Iterator.prototype.hasNext = function() {
- return this.hasNext_;
+ this.nextIdx_ = start - 1; // use -1 so initial advance works.
+ this.next(); // ignoring result.
}
Dygraph.Iterator.prototype.next = function() {
- if (this.hasNext_) {
- var obj = this.peek_;
- this.advance_();
- return obj;
+ if (!this.hasNext) {
+ return null;
}
- return null;
-}
+ var obj = this.peek;
-Dygraph.Iterator.prototype.peek = function() {
- return this.peek_;
-}
-
-Dygraph.Iterator.prototype.advance_ = function() {
- var nextIdx = this.nextIdx_;
- nextIdx++;
- while(nextIdx < this.end_) {
+ var nextIdx = this.nextIdx_ + 1;
+ var found = false;
+ while (nextIdx < this.end_) {
if (!this.predicate_ || this.predicate_(this.array_, nextIdx)) {
- this.peek_ = this.array_[nextIdx];
- this.nextIdx_ = nextIdx;
- return;
+ this.peek = this.array_[nextIdx];
+ found = true;
+ break;
}
nextIdx++;
}
this.nextIdx_ = nextIdx;
- this.hasNext_ = false;
- this.peek_ = null;
+ if (!found) {
+ this.hasNext = false;
+ this.peek = null;
+ }
+ return obj;
}
/**