9 ExtendedPromiseInterface
,
14 class Consumer
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 * Iterate over $gen, a \Generator yielding promises
49 * @param Generator $gen
50 * @return ExtendedPromiseInterface
52 function __invoke(Generator
$gen) : ExtendedPromiseInterface
{
53 $this->cancelled
= false;
55 foreach ($gen as $promise) {
56 if ($this->cancelled
) {
59 $this->give($promise, $gen);
62 if (!$this->cancelled
) {
63 $this->resolve($this->result
= $gen->getReturn());
66 return $this->promise();
72 * @param array|PromiseInterface $promise
73 * @param Generator $gen
75 private function give($promise, Generator
$gen) {
76 if ($promise instanceof PromiseInterface
) {
77 $promise->then(function($result) use($gen) {
78 if (($promise = $gen->send($result))) {
79 $this->give($promise, $gen);
83 all($promise)->then(function($results) use($gen) {
84 if (($promise = $gen->send($results))) {
85 $this->give($promise, $gen);
89 $this->client
->send();
93 * Cancellation callback
95 * @param callable $resolve
96 * @param callable $reject
98 private function cancel(callable
$resolve, callable
$reject) {
99 $this->cancelled
= true;
101 /* did we finish in the meantime? */
103 $resolve($this->result
);
105 $reject("Cancelled");