flush
[m6w6/seekat] / lib / API / Future / functions.php
1 <?php
2
3 namespace seekat\API\Future;
4
5 use Amp\Deferred as AmpDeferred;
6 use AsyncInterop\Promise;
7 use React\Promise\Deferred as ReactDeferred;
8 use seekat\API\Future;
9
10 /**
11 * @param Future $future
12 * @param mixed $value
13 * @return Promise
14 */
15 function resolve(Future $future, $value) {
16 $promisor = $future->createContext();
17 $future->onSuccess($promisor, $value);
18 return $future->getPromise($promisor);
19 }
20
21 /**
22 * @param Future $future
23 * @param mixed $reason
24 * @return Promise
25 */
26 function reject(Future $future, $reason) {
27 $promisor = $future->createContext();
28 $future->onFailure($promisor, $reason);
29 return $future->getPromise($promisor);
30 }
31
32 /**
33 * @param Future $future
34 * @param mixed $context Promisor
35 * @return \Closure
36 */
37 function resolver(Future $future, $context) {
38 return function($value) use($future, $context) {
39 return $future->onSuccess($context, $value);
40 };
41 }
42
43 /**
44 * @param Future $future
45 * @param mixed $context Promisor
46 * @return \Closure
47 */
48 function rejecter(Future $future, $context) {
49 return function($reason) use($future, $context) {
50 return $future->onFailure($context, $reason);
51 };
52 }
53
54 /**
55 * @param Future $future
56 * @param mixed $context Promisor
57 * @return \Closure
58 */
59 function reducer(Future $future, $context) {
60 return function(array $promises) use($future, $context) : Promise {
61 return $future->onMultiple($context, $promises);
62 };
63 }
64
65 /**
66 * @return Future
67 */
68 function react() {
69 return new class implements Future {
70 /**
71 * @param callable|null $onCancel
72 * @return ReactDeferred
73 */
74 function createContext(callable $onCancel = null) {
75 return new ReactDeferred($onCancel);
76 }
77
78 function getPromise($context) : Promise {
79 /* @var $context ReactDeferred */
80 return $context->promise();
81 }
82
83 function cancelPromise(Promise $promise) : bool {
84 /* @var $promise \React\Promise\Promise */
85 $promise->cancel();
86 return true;
87 }
88
89 function onSuccess($context, $value) {
90 /* @var $context ReactDeferred */
91 $context->resolve($value);
92 }
93
94 function onFailure($context, $reason) {
95 /* @var $context ReactDeferred */
96 $context->reject($reason);
97 }
98
99 function onMultiple($context, array $promises) : Promise {
100 return \React\Promise\all($promises);
101 }
102 };
103 }
104
105 /**
106 * @return Future
107 */
108 function amp() {
109 return new class implements Future {
110 /**
111 * @return AmpDeferred
112 */
113 function createContext(callable $onCancel = null) {
114 return new AmpDeferred();
115 }
116
117 function getPromise($context) : Promise {
118 /* @var $context AmpDeferred */
119 return $context->promise();
120 }
121
122 function cancelPromise(Promise $promise) : bool {
123 return false;
124 }
125
126 function onSuccess($context, $value) {
127 /* @var $context AmpDeferred */
128 $context->resolve($value);
129 }
130
131 function onFailure($context, $reason) {
132 /* @var $context AmpDeferred */
133 $context->fail(\seekat\Exception\exception($reason));
134 }
135
136 function onMultiple($context, array $promises) : Promise {
137 return \Amp\all($promises);
138 }
139 };
140 }