diff --git a/composer.json b/composer.json index 3e81bc5..0553bb4 100644 --- a/composer.json +++ b/composer.json @@ -33,10 +33,10 @@ } ], "require": { - "php": ">=8" + "php": ">=8", + "ext-fiber": "*" }, "require-dev": { - "ext-fiber": "*", "ext-json": "*", "amphp/phpunit-util": "^1", "amphp/php-cs-fixer-config": "dev-master", @@ -51,8 +51,7 @@ }, "files": [ "lib/functions.php", - "lib/Internal/functions.php", - "polyfill/ext-fiber.php" + "lib/Internal/functions.php" ] }, "autoload-dev": { diff --git a/lib/Coroutine.php b/lib/Coroutine.php index c7c9328..a199f24 100644 --- a/lib/Coroutine.php +++ b/lib/Coroutine.php @@ -2,9 +2,9 @@ namespace Amp; -use React\Promise\PromiseInterface as ReactPromise; - /** + * @deprecated Use {@see await()} and ext-fiber to await promises. + * * Creates a promise from a generator function yielding promises. * * When a promise is yielded, execution of the generator is interrupted until the promise is resolved. A success @@ -18,44 +18,6 @@ final class Coroutine implements Promise { use Internal\Placeholder; - /** - * Attempts to transform the non-promise yielded from the generator into a promise, otherwise returns an instance - * `Amp\Failure` failed with an instance of `Amp\InvalidYieldError`. - * - * @param mixed $yielded Non-promise yielded from generator. - * @param \Generator $generator No type for performance, we already know the type. - * - * @return Promise - */ - private static function transform(mixed $yielded, \Generator $generator): Promise - { - $exception = null; // initialize here, see https://github.com/vimeo/psalm/issues/2951 - - try { - if (\is_array($yielded)) { - return Promise\all($yielded); - } - - if ($yielded instanceof ReactPromise) { - return Promise\adapt($yielded); - } - - // No match, continue to returning Failure below. - } catch (\Throwable $exception) { - // Conversion to promise failed, fall-through to returning Failure below. - } - - return new Failure(new InvalidYieldError( - $generator, - \sprintf( - "Unexpected yield; Expected an instance of %s or %s or an array of such instances", - Promise::class, - ReactPromise::class - ), - $exception - )); - } - /** * @param \Generator $generator * @psalm-param \Generatorresolve(async(function () use ($generator): mixed { $yielded = $generator->current(); - if (!$yielded instanceof Promise) { - if (!$generator->valid()) { - $this->resolve($generator->getReturn()); - return; - } - - $yielded = self::transform($yielded, $generator); - } - } catch (\Throwable $exception) { - $this->fail($exception); - return; - } - - /** - * @param \Throwable|null $e Exception to be thrown into the generator. - * @param mixed $v Value to be sent into the generator. - * - * @return void - * - * @psalm-suppress MissingClosureParamType - * @psalm-suppress MissingClosureReturnType - */ - $onResolve = function (?\Throwable $e, mixed $v) use ($generator, &$onResolve): void { - /** @var bool $immediate Used to control iterative coroutine continuation. */ - static $immediate = true; - - /** @var \Throwable|null $exception Promise failure reason when executing next coroutine step, null at all other times. */ - static $exception; - - /** @var mixed $value Promise success value when executing next coroutine step, null at all other times. */ - static $value; - - $exception = $e; - /** @psalm-suppress MixedAssignment */ - $value = $v; - - if (!$immediate) { - $immediate = true; - return; - } - - try { + while ($generator->valid()) { try { - do { - if ($exception) { - // Throw exception at current execution point. - $yielded = $generator->throw($exception); - } else { - // Send the new value and execute to next yield statement. - $yielded = $generator->send($value); - } - - if (!$yielded instanceof Promise) { - if (!$generator->valid()) { - $this->resolve($generator->getReturn()); - $onResolve = null; - return; - } - - $yielded = self::transform($yielded, $generator); - } - - $immediate = false; - $yielded->onResolve($onResolve); - } while ($immediate); - - $immediate = true; + $value = await($yielded); } catch (\Throwable $exception) { - $this->fail($exception); - $onResolve = null; - } finally { - $exception = null; - $value = null; + $yielded = $generator->throw($exception); + continue; } - } catch (\Throwable $e) { - Loop::defer(static function () use ($e) { - throw $e; - }); + + $yielded = $generator->send($value); } - }; - try { - $yielded->onResolve($onResolve); - - unset($generator, $yielded, $onResolve); - } catch (\Throwable $e) { - Loop::defer(static function () use ($e) { - throw $e; - }); - } + return $generator->getReturn(); + })); } } diff --git a/polyfill/ext-fiber.php b/polyfill/ext-fiber.php deleted file mode 100644 index d2432c2..0000000 --- a/polyfill/ext-fiber.php +++ /dev/null @@ -1,6 +0,0 @@ -