c36315eca0c18a4f71bb697bbddf80ff668ce681
9 ExtendedPromiseInterface
,
14 class Invoker
extends Deferred
23 * The return value of the generator
32 private $cancelled = false;
35 * Create a new generator invoker
36 * @param Client $client
38 function __construct(Client
$client) {
39 $this->client
= $client;
41 parent
::__construct(function($resolve, $reject) {
42 return $this->cancel($resolve, $reject);
47 * Invoke $generator to create a \Generator which yields promises
49 * @param callable $generator as function():\Generator, creating a generator yielding promises
52 function invoke(callable
$generator) : Invoker
{
53 $this->iterate($generator());
58 * Iterate over $gen, a \Generator yielding promises
60 * @param Generator $gen
63 function iterate(Generator
$gen) : Invoker
{
64 $this->cancelled
= false;
66 foreach ($gen as $promise) {
67 if ($this->cancelled
) {
70 $this->give($promise, $gen);
73 if (!$this->cancelled
) {
74 $this->resolve($this->result
= $gen->getReturn());
80 * Get the generator's result
82 * @return ExtendedPromiseInterface
84 function result() : ExtendedPromiseInterface
{
85 return $this->promise();
91 * @param array|PromiseInterface $promise
92 * @param Generator $gen
94 private function give($promise, Generator
$gen) {
95 if ($promise instanceof PromiseInterface
) {
96 $promise->then(function($result) use($gen) {
97 if (($promise = $gen->send($result))) {
98 $this->give($promise, $gen);
102 all($promise)->then(function($results) use($gen) {
103 if (($promise = $gen->send($results))) {
104 $this->give($promise, $gen);
108 $this->client
->send();
112 * Cancellation callback
114 * @param callable $resolve
115 * @param callable $reject
117 private function cancel(callable
$resolve, callable
$reject) {
118 $this->cancelled
= true;
120 /* did we finish in the meantime? */
122 $resolve($this->result
);
124 $reject("Cancelled");