summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorYusuke Sakurai <kerokerokerop@gmail.com>2019-02-16 01:03:57 +0900
committerRyan Dahl <ry@tinyclouds.org>2019-02-15 11:03:57 -0500
commit57f4e6a86448263c9f1c75934e829e048c76f572 (patch)
treeb4e46dcb4a43fec2694e289702fba2cd5e475c50 /util
parent34ece9f2ede9c63af2678feb15ef5290a74c8d2f (diff)
Redesign of http server module (denoland/deno_std#188)
Original: https://github.com/denoland/deno_std/commit/8569f15207bdc12c2c8ca81e9d020955be54918b
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
+ );
+});