interface Yielder
{
public function getData(): iterable;
}
class ClassicYielder implements Yielder
{
public function getData(): iterable
{
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
}
class LimitedYielder implements Yielder
{
private $wrapped;
private $total = 3;
private $count = 0;
public function __construct(Yielder $wrapped)
{
$this->wrapped = $wrapped;
}
public function getData(): iterable
{
if ($this->count < $this->total) {
$this->count++;
yield from $this->wrapped->getData();
}
// how to stop here?
}
}
$x = new ClassicYielder();
$y = new LimitedYielder($x);
foreach ($y->getData() as $data) {
echo $data;
}
===
Will print: 1 2 3 4 5
У меня есть интерфейс Yielder с одним методом, который возвращает итерацию через yield.Я хочу обернуть мой классический урожай в ограниченный, который дает значения только до тех пор, пока выполняется условие.Как видите, приведенный выше код выдаст все значения моего классического урожайника, не отслеживая мой счетчик.
Что я здесь не так делаю?Можно ли как-нибудь заставить это работать?