У меня есть метод, который принимает генератор плюс некоторые дополнительные параметры и дает новый генератор:
function merge(\Generator $carry, array $additional)
{
foreach ( $carry as $item ) {
yield $item;
}
foreach ( $additional as $item ) {
yield $item;
}
}
Обычный пример использования для этой функции аналогичен этому:
function source()
{
for ( $i = 0; $i < 3; $i++ ) {
yield $i;
}
}
foreach ( merge(source(), [4, 5]) as $item ) {
var_dump($item);
}
Но проблема в том, что иногда мне нужно передать пустой источник методу merge
. В идеале я хотел бы сделать что-то вроде этого:
merge(\Generator::getEmpty(), [4, 5]);
Именно так я и сделал бы на С# (есть свойство IEnumerable<T>.Empty
). Но я не вижу генератора empty
в руководстве.
Мне удалось обойти это (пока) с помощью этой функции:
function sourceEmpty()
{
if ( false ) {
yield;
}
}
И это работает. Код:
foreach ( merge(sourceEmpty(), [4, 5]) as $item ) {
var_dump($item);
}
правильно выводит:
int(4)
int(5)
Но это, очевидно, не идеальное решение. Каким будет правильный способ передачи пустого генератора методу merge
?