import { ok } from "./is"; export type DeferredStatus = "pending" | "fulfilled" | "rejected"; export interface Deferred { resolve(value: T): void; reject(reason: unknown): void; promise: Promise; readonly settled: boolean; readonly status: DeferredStatus; } export function defer(): Deferred { let resolve: Deferred["resolve"] | undefined = undefined, reject: Deferred["reject"] | undefined = undefined, settled = false, status: DeferredStatus = "pending"; const promise = new Promise((resolveFn, rejectFn) => { resolve = (value) => { status = "fulfilled"; settled = true; resolveFn(value); }; reject = (reason) => { status = "rejected"; settled = true; rejectFn(reason); }; }); ok(resolve); ok(reject); return { get settled() { return settled; }, get status() { return status; }, resolve, reject, promise, }; }