// deno-lint-ignore-file no-explicit-any export type Resolve = (value: T | PromiseLike) => void; export type Reject = (reason?: any) => void; export type ResolvablePromiseInit = PromiseLike | ((resolve: Resolve, reject: Reject) => void); export class ResolvablePromise implements Promise { #promise: Promise; #resolve!: Resolve; #reject!: Reject; #settled = false; constructor(init?: ResolvablePromiseInit | null) { // super(_ => _(void 0 as any)); this.#promise = new Promise((res, rej) => { const resolve = this.#resolve = v => (this.#settled = true, res(v)); const reject = this.#reject = r => (this.#settled = true, rej(r)); if (init == null) return; if (typeof init === 'function') init(resolve, reject); else if (typeof init.then === 'function') init.then(resolve, reject); }); } resolve(x: T | PromiseLike) { this.#resolve(x); } reject(reason?: any) { this.#reject(reason); } /** @deprecated Name of this property might change */ get settled() { return this.#settled } then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | null): Promise { return this.#promise.then(onfulfilled, onrejected); } catch(onrejected?: ((reason: any) => TResult | PromiseLike) | null): Promise { return this.#promise.catch(onrejected); } finally(onfinally?: (() => void) | null): Promise { return this.#promise.finally(onfinally); } readonly [Symbol.toStringTag] = 'ResolvablePromise' } /** @deprecated */ export function resolvablePromise() { return new ResolvablePromise(); }