Source code

Revision control

Copy as Markdown

Other Tools

// Test that each yield* loop just checks "done", and "value" is only
// fetched once at the end.
var log = "";
function collect_results(iter) {
var ret = [];
var result;
do {
result = iter.next();
ret.push(result);
} while (!result.done);
return ret;
}
function Iter(val, count) {
function next() {
log += 'n';
return {
get done() { log += "d"; return count-- == 0; },
get value() { log += "v"; return val; }
}
}
function iterator() {
log += 'i';
return this;
}
this.next = next;
this[Symbol.iterator] = iterator;
}
function* delegate(iter) { return yield* iter; }
var inner = new Iter(42, 5);
var outer = delegate(inner);
// Five values, and one terminal value.
outer.next();
outer.next();
outer.next();
outer.next();
outer.next();
outer.next();
assertEq(log, "indndndndndndv");
// Outer's dead, man. Outer's dead.
assertDeepEq(outer.next(), {value: undefined, done: true});
// No more checking the iterator.
assertEq(log, "indndndndndndv");
if (typeof reportCompare == "function")
reportCompare(true, true);