Есть обычный метод
map для работы над итераторами (вместо массивов):
public static function map(iterable $iterator, ?callable $forward, callable $backward = null): \Generator
// ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
// Here be dragons
{
$generator = self::toGenerator($iterator);
while ($generator->valid()) {
[$key, $value] = [$generator->key(), $generator->current()];
$response = yield $key => $forward === null ? $value : $forward($value, $key);
$generator->send($backward === null ? $response : $backward($response));
}
}
Не могу придумать названия аргументов для "маппера" ответа (возвращаемого значения) и "обратной связи" (когда возвращается контроль управления обратно в исходную точку) сопрограммы. Пока назвал
forward и
backward, но, кажется, что-то тут не так. Мб есть какие-то другие идеи или может существует термин, который обозначает прямой и обратный ответы сопрограмм?
P.S. Добавлю пример использования:
function example1() {
echo yield 23; // echo 42 (возврат управления с применением второго аргумента)
}
function example2(\Generator $it) {
echo $response = $i->current(); // $response = 46 (применяется первый аргумент)
$i->send($response);
}
// Соединение двух функций через map
$cb1 = function(int $arg): int {
return $arg * 2; // Функция прямого маппера
};
$cb2 = function(int $response): int {
return $response - 4; // Функция обратного маппера
};
example2(...::map(example(), $cb1, $cb2));
А вообще было бы прикольно знать терминологию, если она существует, для первого и второго куска сопрограммы. На её основе можно будет уже назвать аргументы.