45 lines
830 B
JavaScript
45 lines
830 B
JavaScript
function* wrap(generator) {
|
|
return yield *generator;
|
|
}
|
|
|
|
class BadIterable {
|
|
constructor() {
|
|
this.closed = false;
|
|
}
|
|
|
|
[Symbol.iterator]() {
|
|
return {
|
|
iterable: this,
|
|
next(v) {
|
|
return {value: 42, done: false};
|
|
},
|
|
// throw method missing
|
|
return(v) {
|
|
this.iterable.closed = true;
|
|
return {value: undefined, done: true};
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
var i1 = new BadIterable();
|
|
var g1 = wrap(i1);
|
|
assert.deepEqual(g1.next(), {value: 42, done: false});
|
|
assert.throws(() => g1.throw('ex1'), TypeError);
|
|
assert.isTrue(i1.closed);
|
|
|
|
function* f2() {
|
|
try {
|
|
yield 1;
|
|
} finally {
|
|
f2.closed = true;
|
|
}
|
|
}
|
|
f2.closed = false;
|
|
|
|
var g2 = wrap(f2());
|
|
assert.deepEqual(g2.next(), {value: 1, done: false});
|
|
assert.throws(() => g2.throw('ex2'), 'ex2');
|
|
assert.isTrue(f2.closed);
|
|
|