function shouldBe(actual, expected) { if (actual !== expected) throw new Error(`bad value: ${String(actual)}`); } (function () { function *g1(a, b, c) { yield arguments; yield arguments; } var g = g1(0, 1, 2); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); function *g2(a, b, c) { yield arguments; yield arguments; a = yield a; yield arguments; b = yield b; yield arguments; c = yield c; yield arguments; } var g = g2(0, 1, 2); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); shouldBe(g.next().value, 0); shouldBe(JSON.stringify(g.next(42).value), `{"0":42,"1":1,"2":2}`); shouldBe(g.next().value, 1); shouldBe(JSON.stringify(g.next(42).value), `{"0":42,"1":42,"2":2}`); shouldBe(g.next().value, 2); shouldBe(JSON.stringify(g.next(42).value), `{"0":42,"1":42,"2":42}`); }()); (function () { function *g1(a, b, c) { "use strict"; yield arguments; yield arguments; } var g = g1(0, 1, 2); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); function *g2(a, b, c) { "use strict"; yield arguments; yield arguments; a = yield a; yield arguments; b = yield b; yield arguments; c = yield c; yield arguments; } var g = g2(0, 1, 2); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); shouldBe(g.next().value, 0); shouldBe(JSON.stringify(g.next(42).value), `{"0":0,"1":1,"2":2}`); shouldBe(g.next().value, 1); shouldBe(JSON.stringify(g.next(42).value), `{"0":0,"1":1,"2":2}`); shouldBe(g.next().value, 2); shouldBe(JSON.stringify(g.next(42).value), `{"0":0,"1":1,"2":2}`); }()); (function () { "use strict"; function *g1(a, b, c) { yield arguments; yield arguments; } var g = g1(0, 1, 2); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); function *g2(a, b, c) { yield arguments; yield arguments; a = yield a; yield arguments; b = yield b; yield arguments; c = yield c; yield arguments; } var g = g2(0, 1, 2); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); shouldBe(JSON.stringify(g.next().value), `{"0":0,"1":1,"2":2}`); shouldBe(g.next().value, 0); shouldBe(JSON.stringify(g.next(42).value), `{"0":0,"1":1,"2":2}`); shouldBe(g.next().value, 1); shouldBe(JSON.stringify(g.next(42).value), `{"0":0,"1":1,"2":2}`); shouldBe(g.next().value, 2); shouldBe(JSON.stringify(g.next(42).value), `{"0":0,"1":1,"2":2}`); }());