diff options
Diffstat (limited to 'util')
| -rw-r--r-- | util/deferred.ts | 42 | ||||
| -rw-r--r-- | util/deferred_test.ts | 16 |
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 + ); +}); |
