/** * @param mixed $generatorOrValue * * @return mixed */ public static function await($generatorOrValue) { switch (true) { case $generatorOrValue instanceof \generator: $generatorOrValue->current(); while ($generatorOrValue->valid() === true) { $generatorOrValue->next(); } return self::await($generatorOrValue->getReturn()); case is_callable($generatorOrValue): return self::await($generatorOrValue()); case $generatorOrValue instanceof wrapper: return wrapper::unwrap($generatorOrValue); case is_array($generatorOrValue) === true: return array_map(function ($generator) { return self::await($generator); }, $generatorOrValue); default: return $generatorOrValue; } }