PluginProbe
WooCommerce / 11.1.0
WooCommerce v11.1.0
11.1.0 11.1.0-rc.2 11.1.0-rc.1 11.1.0-beta.2 11.1.0-beta.1 11.0.1 11.0.0 11.0.0-rc.3 11.0.0-rc.2 11.0.0-rc.1 11.0.0-beta.2 11.0.0-beta.1 10.9.4 10.9.3 10.9.2 10.9.1 10.9.0 10.9.0-rc.1 10.9.0-beta.2 10.9.0-beta.1 10.8.1 10.8.0 10.8.0-rc.1 10.8.0-beta.2 10.8.0-beta.1 All 648 releases
woocommerce / lib / packages / GraphQL / Executor / Promise / Adapter / AmpPromiseAdapter.php
AmpPromiseAdapter.php
152 lines 4.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php declare(strict_types=1);
2
3 namespace Automattic\WooCommerce\Vendor\GraphQL\Executor\Promise\Adapter;
4
5 use Amp\Deferred;
6 use Amp\Failure;
7 use Amp\Promise as AmpPromise;
8 use Amp\Success;
9 use Automattic\WooCommerce\Vendor\GraphQL\Error\InvariantViolation;
10 use Automattic\WooCommerce\Vendor\GraphQL\Executor\Promise\Promise;
11 use Automattic\WooCommerce\Vendor\GraphQL\Executor\Promise\PromiseAdapter;
12
13 use function Amp\Promise\all;
14
15 class AmpPromiseAdapter implements PromiseAdapter
16 {
17 public function isThenable($value): bool
18 {
19 return $value instanceof AmpPromise;
20 }
21
22 /** @throws InvariantViolation */
23 public function convertThenable($thenable): Promise
24 {
25 return new Promise($thenable, $this);
26 }
27
28 /** @throws InvariantViolation */
29 public function then(Promise $promise, ?callable $onFulfilled = null, ?callable $onRejected = null): Promise
30 {
31 $deferred = new Deferred();
32 $onResolve = static function (?\Throwable $reason, $value) use ($onFulfilled, $onRejected, $deferred): void {
33 if ($reason === null && $onFulfilled !== null) {
34 self::resolveWithCallable($deferred, $onFulfilled, $value);
35 } elseif ($reason === null) {
36 $deferred->resolve($value);
37 } elseif ($onRejected !== null) {
38 self::resolveWithCallable($deferred, $onRejected, $reason);
39 } else {
40 $deferred->fail($reason);
41 }
42 };
43
44 $ampPromise = $promise->adoptedPromise;
45 assert($ampPromise instanceof AmpPromise);
46 $ampPromise->onResolve($onResolve);
47
48 return new Promise($deferred->promise(), $this);
49 }
50
51 /** @throws InvariantViolation */
52 public function create(callable $resolver): Promise
53 {
54 $deferred = new Deferred();
55
56 $resolver(
57 static function ($value) use ($deferred): void {
58 $deferred->resolve($value);
59 },
60 static function (\Throwable $exception) use ($deferred): void {
61 $deferred->fail($exception);
62 }
63 );
64
65 return new Promise($deferred->promise(), $this);
66 }
67
68 /**
69 * @throws \Error
70 * @throws InvariantViolation
71 */
72 public function createFulfilled($value = null): Promise
73 {
74 $promise = new Success($value);
75
76 return new Promise($promise, $this);
77 }
78
79 /** @throws InvariantViolation */
80 public function createRejected(\Throwable $reason): Promise
81 {
82 $promise = new Failure($reason);
83
84 return new Promise($promise, $this);
85 }
86
87 /**
88 * @throws \Error
89 * @throws InvariantViolation
90 */
91 public function all(iterable $promisesOrValues): Promise
92 {
93 /** @var array<AmpPromise<mixed>> $promises */
94 $promises = [];
95 foreach ($promisesOrValues as $key => $item) {
96 if ($item instanceof Promise) {
97 $ampPromise = $item->adoptedPromise;
98 assert($ampPromise instanceof AmpPromise);
99 $promises[$key] = $ampPromise;
100 } elseif ($item instanceof AmpPromise) {
101 $promises[$key] = $item;
102 }
103 }
104
105 $deferred = new Deferred();
106
107 all($promises)->onResolve(static function (?\Throwable $reason, ?array $values) use ($promisesOrValues, $deferred): void {
108 if ($reason === null) {
109 assert(is_array($values), 'Either $reason or $values must be passed');
110
111 $promisesOrValuesArray = is_array($promisesOrValues)
112 ? $promisesOrValues
113 : iterator_to_array($promisesOrValues);
114 $resolvedValues = array_replace($promisesOrValuesArray, $values);
115 $deferred->resolve($resolvedValues);
116
117 return;
118 }
119
120 $deferred->fail($reason);
121 });
122
123 return new Promise($deferred->promise(), $this);
124 }
125
126 /**
127 * @template TArgument
128 * @template TResult of AmpPromise<mixed>
129 *
130 * @param Deferred<TResult> $deferred
131 * @param callable(TArgument): TResult $callback
132 * @param TArgument $argument
133 */
134 private static function resolveWithCallable(Deferred $deferred, callable $callback, $argument): void
135 {
136 try {
137 $result = $callback($argument);
138 } catch (\Throwable $exception) {
139 $deferred->fail($exception);
140
141 return;
142 }
143
144 if ($result instanceof Promise) {
145 /** @var TResult $result */
146 $result = $result->adoptedPromise;
147 }
148
149 $deferred->resolve($result);
150 }
151 }
152