summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
Diffstat (limited to 'util')
-rw-r--r--util/deferred.ts42
-rw-r--r--util/deferred_test.ts16
2 files changed, 58 insertions, 0 deletions
diff --git a/util/deferred.ts b/util/deferred.ts
new file mode 100644
index 000000000..f52087547
--- /dev/null
+++ b/util/deferred.ts
@@ -0,0 +1,42 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+
+export type Deferred<T = any, R = Error> = {
+ promise: Promise<T>;
+ resolve: (t?: T) => void;
+ reject: (r?: R) => void;
+ readonly handled: boolean;
+};
+
+/** Create deferred promise that can be resolved and rejected by outside */
+export function defer<T>(): Deferred<T> {
+ let handled = false;
+ let resolve;
+ let reject;
+ const promise = new Promise<T>((res, rej) => {
+ resolve = r => {
+ handled = true;
+ res(r);
+ };
+ reject = r => {
+ handled = true;
+ rej(r);
+ };
+ });
+ return {
+ promise,
+ resolve,
+ reject,
+ get handled() {
+ return handled;
+ }
+ };
+}
+
+export function isDeferred(x): x is Deferred {
+ return (
+ typeof x === "object" &&
+ x.promise instanceof Promise &&
+ typeof x["resolve"] === "function" &&
+ typeof x["reject"] === "function"
+ );
+}
diff --git a/util/deferred_test.ts b/util/deferred_test.ts
new file mode 100644
index 000000000..a397b3012
--- /dev/null
+++ b/util/deferred_test.ts
@@ -0,0 +1,16 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+
+import { assert, test } from "../testing/mod.ts";
+import { defer, isDeferred } from "./deferred.ts";
+
+test(async function asyncIsDeferred() {
+ const d = defer();
+ assert.assert(isDeferred(d));
+ assert.assert(
+ isDeferred({
+ promise: null,
+ resolve: () => {},
+ reject: () => {}
+ }) === false
+ );
+});