X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fseekat;a=blobdiff_plain;f=lib%2FAPI%2FFuture%2Ffunctions.php;fp=lib%2FAPI%2FFuture%2Ffunctions.php;h=d2a92329133eca4acc56bc61c52b4ad2dbc9fdee;hp=3cddb221b06c1188713a7e9065cc9f3b7bed397d;hb=654d736df2c46ec2520f73e9089d06a44f2b9c50;hpb=2121556150be871684b5046af7cf250b8219128d diff --git a/lib/API/Future/functions.php b/lib/API/Future/functions.php index 3cddb22..d2a9232 100644 --- a/lib/API/Future/functions.php +++ b/lib/API/Future/functions.php @@ -2,173 +2,22 @@ namespace seekat\API\Future; -use Amp\Deferred as AmpDeferred; -use Amp\Promise as AmpPromise; -use React\Promise\Deferred as ReactDeferred; -use React\Promise\PromiseInterface as ReactPromise; use seekat\API\Future; -/** - * @param Future $future - * @param mixed $value - * @return mixed promise - */ -function resolve(Future $future, $value) { - $promisor = $future->createContext(); - $future->resolve($promisor, $value); - return $future->getPromise($promisor); +function react() : React2 { + return new React2; } -/** - * @param Future $future - * @param mixed $reason - * @return mixed promise - */ -function reject(Future $future, $reason) { - $promisor = $future->createContext(); - $future->reject($promisor, $reason); - return $future->getPromise($promisor); +function amp() : Amp2 { + return new Amp2; } -/** - * @param Future $future - * @param mixed $context Promisor - * @return \Closure - */ -function resolver(Future $future, $context) { - return function($value) use($future, $context) { - $future->resolve($context, $value); - }; -} - -/** - * @param Future $future - * @param mixed $context Promisor - * @return \Closure - */ -function rejecter(Future $future, $context) { - return function($reason) use($future, $context) { - $future->reject($context, $reason); - }; -} - -/** - * @param Future $future - * @param mixed $context Promisor - * @return \Closure - */ -function reducer(Future $future, $context) { - return function(array $promises) use($future, $context) { - return $future->all($context, $promises); - }; -} - -/** - * @return Future - */ -function react() { - return new class implements Future { - /** - * @param callable|null $onCancel - * @return ReactDeferred - */ - function createContext(callable $onCancel = null) { - return new ReactDeferred($onCancel); - } - - function getPromise($context) { - /* @var $context ReactDeferred */ - return $context->promise(); - } - - function isPromise($promise) : bool { - return $promise instanceof ReactPromise; - } - - function handlePromise($promise, callable $onResult = null, callable $onError = null) { - return $promise->then($onResult, $onError); - } - - function cancelPromise($promise) { - /* @var $promise \React\Promise\Promise */ - $promise->cancel(); - } - - function resolve($context, $value) { - /* @var $context ReactDeferred */ - $context->resolve($value); - } - - function reject($context, $reason) { - /* @var $context ReactDeferred */ - $context->reject($reason); - } - - function all($context, array $promises) { - return \React\Promise\all($promises); - } - }; -} - -/** - * @return Future - */ -function amp() { - return new class implements Future { - /** - * @return AmpDeferred - */ - function createContext(callable $onCancel = null) { - $context = new AmpDeferred(); - /** @noinspection PhpUndefinedFieldInspection */ - $context->promise()->cancel = function() use($onCancel, $context) { - $onCancel(); - }; - return $context; - } - - function getPromise($context) { - /* @var $context AmpDeferred */ - return $context->promise(); - } - - function isPromise($promise) : bool { - return $promise instanceof AmpPromise; - } - - function handlePromise($promise, callable $onResult = null, callable $onError = null) { - $promise->onResolve(function($error = null, $result = null) use($onResult, $onError) { - if ($error) { - if ($onError) { - $onError($error); - } - } else { - if ($onResult) { - $onResult($result); - } - } - }); - return $promise; - } - - function cancelPromise($promise) { - /** @var $promise AmpPromise */ - /** @noinspection PhpUndefinedFieldInspection */ - ($promise->cancel)(); - } - - function resolve($context, $value) { - /* @var $context AmpDeferred */ - $context->resolve($value); - } - - function reject($context, $reason) { - /* @var $context AmpDeferred */ - $context->fail(\seekat\Exception\exception($reason)); - } - - function all($context, array $promises) { - return \Amp\Promise\all($promises); - } - }; +function any() : Amp2|React2 { + if (interface_exists(\Amp\Promise::class, true)) { + return amp(); + } + if (interface_exists(\React\Promise\PromiseInterface::class, true)) { + return react(); + } + throw new \Exception("Cannot find any promise implementation"); }