| // Test that yield* can appear in a loop, and alongside yield. |
| |
| function* countdown(n) { |
| while (n > 0) { |
| yield n; |
| yield* countdown(--n); |
| } |
| return 34; |
| } |
| |
| function collect_results(iter) { |
| var ret = []; |
| var result; |
| do { |
| result = iter.next(); |
| ret.push(result); |
| } while (!result.done); |
| return ret; |
| } |
| |
| var expected = [ |
| // yield in countdown(3), n == 3 |
| {value: 3, done: false}, |
| // yield in yield* countdown(2), n == 2 |
| {value: 2, done: false}, |
| // yield in nested yield* countdown(1), n == 1 |
| {value: 1, done: false}, |
| // countdown(0) yields no values |
| // second go-through of countdown(2) loop, n == 1 |
| {value: 1, done: false}, |
| // second go-through of countdown(3) loop, n == 2 |
| {value: 2, done: false}, |
| // yield in yield* countdown(1), n == 1 |
| {value: 1, done: false}, |
| // third go-through of countdown(3) loop, n == 1 |
| {value: 1, done: false}, |
| // done |
| {value: 34, done: true} |
| ]; |
| |
| assertDeepEq(expected, collect_results(countdown(3))); |
| |
| if (typeof reportCompare == "function") |
| reportCompare(true, true); |