namespace seekat\API\Future;
use Amp\Deferred as AmpDeferred;
-use AsyncInterop\Promise;
-use Icicle\Awaitable\Deferred as IcicleDeferred;
+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 Promise
+ * @return mixed promise
*/
function resolve(Future $future, $value) {
$promisor = $future->createContext();
- $future->onSuccess($promisor, $value);
+ $future->resolve($promisor, $value);
return $future->getPromise($promisor);
}
/**
* @param Future $future
* @param mixed $reason
- * @return Promise
+ * @return mixed promise
*/
function reject(Future $future, $reason) {
$promisor = $future->createContext();
- $future->onFailure($promisor, $reason);
+ $future->reject($promisor, $reason);
return $future->getPromise($promisor);
}
*/
function resolver(Future $future, $context) {
return function($value) use($future, $context) {
- return $future->onSuccess($context, $value);
+ return $future->resolve($context, $value);
};
}
*/
function rejecter(Future $future, $context) {
return function($reason) use($future, $context) {
- return $future->onFailure($context, $reason);
+ return $future->reject($context, $reason);
};
}
* @param mixed $context Promisor
* @return \Closure
*/
-function updater(Future $future, $context) {
- return function($update) use($future, $context) {
- return $future->onUpdate($context, $update);
+function reducer(Future $future, $context) {
+ return function(array $promises) use($future, $context) {
+ return $future->all($context, $promises);
};
}
return new ReactDeferred($onCancel);
}
- function getPromise($context) : Promise {
+ function getPromise($context) {
/* @var $context ReactDeferred */
return $context->promise();
}
- function onSuccess($context, $value) {
+ 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) : bool {
+ /* @var $promise \React\Promise\Promise */
+ $promise->cancel();
+ return true;
+ }
+
+ function resolve($context, $value) {
/* @var $context ReactDeferred */
$context->resolve($value);
}
- function onFailure($context, $reason) {
+ function reject($context, $reason) {
/* @var $context ReactDeferred */
$context->reject($reason);
}
- function onUpdate($context, $update) {
- /* @var $context ReactDeferred */
- $context->notify($update);
+ function all($context, array $promises) {
+ return \React\Promise\all($promises);
}
};
}
return new AmpDeferred();
}
- function getPromise($context) : Promise {
+ function getPromise($context) {
/* @var $context AmpDeferred */
return $context->promise();
}
- function onSuccess($context, $value) {
- /* @var $context AmpDeferred */
- $context->resolve($value);
- }
-
- function onFailure($context, $reason) {
- /* @var $context AmpDeferred */
- $context->fail($reason);
- }
-
- function onUpdate($context, $update) {
- /* @var $context AmpDeferred */
- /* noop */
+ function isPromise($promise) : bool {
+ return $promise instanceof AmpPromise;
}
- };
-}
-/**
- * @return Future
- */
-function icicle() {
- return new class implements Future {
- /**
- * @param callable|null $onCancel
- * @return IcicleDeferred
- */
- function createContext(callable $onCancel = null) {
- return new IcicleDeferred($onCancel);
+ 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 getPromise($context): Promise {
- /* @var $context IcicleDeferred */
- return $context->getPromise();
+ function cancelPromise($promise) : bool {
+ return false;
}
- function onSuccess($context, $value) {
- /* @var $context IcicleDeferred */
+ function resolve($context, $value) {
+ /* @var $context AmpDeferred */
$context->resolve($value);
}
- function onFailure($context, $reason) {
- /* @var $context IcicleDeferred */
- $context->reject($reason);
+ function reject($context, $reason) {
+ /* @var $context AmpDeferred */
+ $context->fail(\seekat\Exception\exception($reason));
}
- function onUpdate($context, $update) {
- /* @var $context IcicleDeferred */
- /* noop */
+ function all($context, array $promises) {
+ return \Amp\all($promises);
}
};
}