3 namespace seekat\API\Future
;
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
;
12 * @param Future $future
14 * @return mixed promise
16 function resolve(Future
$future, $value) {
17 $promisor = $future->createContext();
18 $future->resolve($promisor, $value);
19 return $future->getPromise($promisor);
23 * @param Future $future
24 * @param mixed $reason
25 * @return mixed promise
27 function reject(Future
$future, $reason) {
28 $promisor = $future->createContext();
29 $future->reject($promisor, $reason);
30 return $future->getPromise($promisor);
34 * @param Future $future
35 * @param mixed $context Promisor
38 function resolver(Future
$future, $context) {
39 return function($value) use($future, $context) {
40 $future->resolve($context, $value);
45 * @param Future $future
46 * @param mixed $context Promisor
49 function rejecter(Future
$future, $context) {
50 return function($reason) use($future, $context) {
51 $future->reject($context, $reason);
56 * @param Future $future
57 * @param mixed $context Promisor
60 function reducer(Future
$future, $context) {
61 return function(array $promises) use($future, $context) {
62 return $future->all($context, $promises);
70 return new class implements Future
{
72 * @param callable|null $onCancel
73 * @return ReactDeferred
75 function createContext(callable
$onCancel = null) {
76 return new ReactDeferred($onCancel);
79 function getPromise($context) {
80 /* @var $context ReactDeferred */
81 return $context->promise();
84 function isPromise($promise) : bool {
85 return $promise instanceof ReactPromise
;
88 function handlePromise($promise, callable
$onResult = null, callable
$onError = null) {
89 return $promise->then($onResult, $onError);
92 function cancelPromise($promise) {
93 /* @var $promise \React\Promise\Promise */
97 function resolve($context, $value) {
98 /* @var $context ReactDeferred */
99 $context->resolve($value);
102 function reject($context, $reason) {
103 /* @var $context ReactDeferred */
104 $context->reject($reason);
107 function all($context, array $promises) {
108 return \React\Promise\all
($promises);
117 return new class implements Future
{
119 * @return AmpDeferred
121 function createContext(callable
$onCancel = null) {
122 $context = new AmpDeferred();
123 /** @noinspection PhpUndefinedFieldInspection */
124 $context->promise()->cancel
= function() use($onCancel, $context) {
130 function getPromise($context) {
131 /* @var $context AmpDeferred */
132 return $context->promise();
135 function isPromise($promise) : bool {
136 return $promise instanceof AmpPromise
;
139 function handlePromise($promise, callable
$onResult = null, callable
$onError = null) {
140 $promise->onResolve(function($error = null, $result = null) use($onResult, $onError) {
154 function cancelPromise($promise) {
155 /** @var $promise AmpPromise */
156 /** @noinspection PhpUndefinedFieldInspection */
157 ($promise->cancel
)();
160 function resolve($context, $value) {
161 /* @var $context AmpDeferred */
162 $context->resolve($value);
165 function reject($context, $reason) {
166 /* @var $context AmpDeferred */
167 $context->fail(\seekat\Exception\
exception($reason));
170 function all($context, array $promises) {
171 return \Amp\Promise\all
($promises);