<?php
function generator1(): \Traversable
{
yield 'alpha';
yield 'beta';
yield 'delta';
}
function generator2(): \Traversable
{
yield from generator1();
yield 'upsilon';
yield 'omega';
}
function resolve(iterable $generator) {
foreach ($generator as $index => $item)
echo "$index $item" . PHP_EOL;
}
resolve(generator1());
echo PHP_EOL;
resolve(generator2());
die;
Produces this result:
0 alpha
1 beta
2 delta
0 alpha
1 beta
2 delta
0 upsilon
1 omega
That last stream should be:
0 alpha
1 beta
2 delta
3 upsilon
4 omega
What's going on here? Is this a bug in PHP (I'm running v7.4.10 in Ubuntu.) How do I get the correct result without using an array or some other form of collector?