PHP8
[m6w6/seekat] / lib / API / Future / functions.php
1 <?php
2
3 namespace seekat\API\Future;
4
5 use Amp\Deferred as AmpDeferred;
6 use Amp\Promise as AmpPromise;
7 use React\Promise\Deferred as ReactDeferred;
8 use React\Promise\PromiseInterface as ReactPromise;
9 use seekat\API\Future;
10
11 /**
12 * @param Future $future
13 * @param mixed $value
14 * @return mixed promise
15 */
16 function resolve(Future $future, $value) {
17 $promisor = $future->createContext();
18 $future->resolve($promisor, $value);
19 return $future->getPromise($promisor);
20 }
21
22 /**
23 * @param Future $future
24 * @param mixed $reason
25 * @return mixed promise
26 */
27 function reject(Future $future, $reason) {
28 $promisor = $future->createContext();
29 $future->reject($promisor, $reason);
30 return $future->getPromise($promisor);
31 }
32
33 /**
34 * @param Future $future
35 * @param mixed $context Promisor
36 * @return \Closure
37 */
38 function resolver(Future $future, $context) {
39 return function($value) use($future, $context) {
40 $future->resolve($context, $value);
41 };
42 }
43
44 /**
45 * @param Future $future
46 * @param mixed $context Promisor
47 * @return \Closure
48 */
49 function rejecter(Future $future, $context) {
50 return function($reason) use($future, $context) {
51 $future->reject($context, $reason);
52 };
53 }
54
55 /**
56 * @param Future $future
57 * @param mixed $context Promisor
58 * @return \Closure
59 */
60 function reducer(Future $future, $context) {
61 return function(array $promises) use($future, $context) {
62 return $future->all($context, $promises);
63 };
64 }
65
66 /**
67 * @return Future
68 */
69 function react() {
70 return new class implements Future {
71 /**
72 * @param callable|null $onCancel
73 * @return ReactDeferred
74 */
75 function createContext(callable $onCancel = null) {
76 return new ReactDeferred($onCancel);
77 }
78
79 function getPromise($context) {
80 /* @var $context ReactDeferred */
81 return $context->promise();
82 }
83
84 function isPromise($promise) : bool {
85 return $promise instanceof ReactPromise;
86 }
87
88 function handlePromise($promise, callable $onResult = null, callable $onError = null) {
89 return $promise->then($onResult, $onError);
90 }
91
92 function cancelPromise($promise) {
93 /* @var $promise \React\Promise\Promise */
94 $promise->cancel();
95 }
96
97 function resolve($context, $value) {
98 /* @var $context ReactDeferred */
99 $context->resolve($value);
100 }
101
102 function reject($context, $reason) {
103 /* @var $context ReactDeferred */
104 $context->reject($reason);
105 }
106
107 function all($context, array $promises) {
108 return \React\Promise\all($promises);
109 }
110 };
111 }
112
113 /**
114 * @return Future
115 */
116 function amp() {
117 return new class implements Future {
118 /**
119 * @return AmpDeferred
120 */
121 function createContext(callable $onCancel = null) {
122 $context = new AmpDeferred();
123 /** @noinspection PhpUndefinedFieldInspection */
124 $context->promise()->cancel = function() use($onCancel, $context) {
125 $onCancel();
126 };
127 return $context;
128 }
129
130 function getPromise($context) {
131 /* @var $context AmpDeferred */
132 return $context->promise();
133 }
134
135 function isPromise($promise) : bool {
136 return $promise instanceof AmpPromise;
137 }
138
139 function handlePromise($promise, callable $onResult = null, callable $onError = null) {
140 $promise->onResolve(function($error = null, $result = null) use($onResult, $onError) {
141 if ($error) {
142 if ($onError) {
143 $onError($error);
144 }
145 } else {
146 if ($onResult) {
147 $onResult($result);
148 }
149 }
150 });
151 return $promise;
152 }
153
154 function cancelPromise($promise) {
155 /** @var $promise AmpPromise */
156 /** @noinspection PhpUndefinedFieldInspection */
157 ($promise->cancel)();
158 }
159
160 function resolve($context, $value) {
161 /* @var $context AmpDeferred */
162 $context->resolve($value);
163 }
164
165 function reject($context, $reason) {
166 /* @var $context AmpDeferred */
167 $context->fail(\seekat\Exception\exception($reason));
168 }
169
170 function all($context, array $promises) {
171 return \Amp\Promise\all($promises);
172 }
173 };
174 }