use Generator;
use http\Client;
-use React\Promise\Deferred;
-use React\Promise\PromiseInterface;
-use React\Promise\ExtendedPromiseInterface;
-
-use function React\Promise\all;
+use React\Promise\{
+ Deferred,
+ ExtendedPromiseInterface,
+ PromiseInterface,
+ function all
+};
class Invoker extends Deferred
{
/**
* Create a new generator invoker
- * @param \http\Client $client
+ * @param Client $client
*/
function __construct(Client $client) {
$this->client = $client;
/**
* Invoke $generator to create a \Generator which yields promises
*
- * @param callable $generator as function() : \Generator, creating a generator yielding promises
- * @return \seekat\API\Invoker
+ * @param callable $generator as function():\Generator, creating a generator yielding promises
+ * @return Invoker
*/
function invoke(callable $generator) : Invoker {
$this->iterate($generator());
/**
* Iterate over $gen, a \Generator yielding promises
*
- * @param \Generator $gen
- * @return \seekat\API\Invoker
+ * @param Generator $gen
+ * @return Invoker
*/
function iterate(Generator $gen) : Invoker {
$this->cancelled = false;
if ($this->cancelled) {
break;
}
- $this->queue($promise, $gen);
+ $this->give($promise, $gen);
}
if (!$this->cancelled) {
/**
* Get the generator's result
- *
- * @return \React\Promise\ExtendedPromiseInterface
+ *
+ * @return ExtendedPromiseInterface
*/
function result() : ExtendedPromiseInterface {
return $this->promise();
/**
* Promise handler
- *
- * @param \React\Promise\PromiseInterface $promise
- * @param \Generator $to
+ *
+ * @param array|PromiseInterface $promise
+ * @param Generator $gen
*/
- private function give(PromiseInterface $promise, Generator $to) {
- $promise->then(function($result) use($to) {
- if (($promise = $to->send($result))) {
- $this->queue($promise, $to);
- }
- });
- }
-
- private function queue($promise, Generator $gen) {
+ private function give($promise, Generator $gen) {
if ($promise instanceof PromiseInterface) {
- $this->give($promise, $gen);
+ $promise->then(function($result) use($gen) {
+ if (($promise = $gen->send($result))) {
+ $this->give($promise, $gen);
+ }
+ });
} else {
all($promise)->then(function($results) use($gen) {
if (($promise = $gen->send($results))) {
- $this->queue($promise, $gen);
+ $this->give($promise, $gen);
}
});
}