1--TEST--
2yield from on multiple trees needing merge
3--FILE--
4<?php
5
6function from($levels) {
7    foreach (range(0, 2 << $levels) as $v) {
8        yield $v;
9        if ($v == (1 << ($levels - 1)) - 2) {
10            throw new Exception();
11        }
12    }
13}
14
15function gen($gen, $level) {
16    yield from $gen;
17}
18
19$levels = 5;
20
21print "$levels levels\n\n";
22
23$all = array();
24$all[] = $gens[0][0] = from($levels);
25
26for ($level = 1; $level < $levels; $level++) {
27    for ($i = 0; $i < (1 << $level); $i++) {
28        $all[] = $gens[$level][$i] = gen($gens[$level-1][$i >> 1], $level);
29    }
30}
31
32for ($i = 0; $i < 2; $i++) {
33    try {
34        foreach ($all as $gen) {
35            var_dump($gen->current());
36            $gen->next();
37            if (!$gen->valid()) {
38                break;
39            }
40        }
41    } catch(Exception $e) {
42        print "$e\n";
43        unset($all[array_search($gen, $all)]);
44    }
45}
46?>
47--EXPECTF--
485 levels
49
50int(0)
51int(1)
52int(2)
53int(3)
54int(4)
55int(5)
56int(6)
57int(7)
58int(8)
59int(9)
60int(10)
61int(11)
62int(12)
63int(13)
64int(14)
65Exception in %s:%d
66Stack trace:
67#0 %s(%d): from(5)
68#1 %s(%d): gen(Object(Generator), 1)
69#2 %s(%d): gen(Object(Generator), 2)
70#3 [internal function]: gen(Object(Generator), 3)
71#4 %s(%d): Generator->next()
72#5 {main}
73ClosedGeneratorException: Generator yielded from aborted, no return value available in %s:%d
74Stack trace:
75#0 [internal function]: gen(Object(Generator), 1)
76#1 %s(%d): Generator->current()
77#2 {main}
78