update to PHP-8.1
[m6w6/seekat] / lib / API / Future / Amp2.php
diff --git a/lib/API/Future/Amp2.php b/lib/API/Future/Amp2.php
new file mode 100644 (file)
index 0000000..51eb8c6
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+
+namespace seekat\API\Future;
+
+use Amp;
+use seekat\API\Future;
+use function seekat\Exception\exception;
+
+final class Amp2 extends Common implements Future {
+       protected string $promiseType = Amp\Promise::class;
+
+       function createContext(callable $onCancel = null) : Amp\Deferred {
+               $context = new Amp\Deferred();
+               if (isset($onCancel)) {
+                       $this->cancellations[$context->promise()] = $onCancel;
+               }
+               return $context;
+       }
+
+       function handlePromise(object $promise, callable $onResult = null, callable $onError = null) : Amp\Promise {
+               $promise->onResolve(function($error = null, $result = null) use($onResult, $onError) {
+                       if ($error) {
+                               if ($onError) {
+                                       $onError($error);
+                               }
+                       } else {
+                               if ($onResult) {
+                                       $onResult($result);
+                               }
+                       }
+               });
+               return $promise;
+       }
+
+       function reject(mixed $reason) : object {
+               $this->createContext()->fail(\seekat\Exception\exception($reason));
+       }
+
+       function rejecter(object $context) : \Closure {
+               return function($reason) use($context) {
+                       $context->fail(exception($reason));
+               };
+       }
+
+       /**
+        * @param array<Amp\Promise> $promises
+        */
+       function all(array $promises) : Amp\Promise {
+               return Amp\Promise\all($promises);
+       }
+}