@virtualstate/navigation
Version:
Native JavaScript [navigation](https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API) implementation
44 lines (40 loc) • 978 B
text/typescript
import { ok } from "./is";
export type DeferredStatus = "pending" | "fulfilled" | "rejected";
export interface Deferred<T = void> {
resolve(value: T): void;
reject(reason: unknown): void;
promise: Promise<T>;
readonly settled: boolean;
readonly status: DeferredStatus;
}
export function defer<T = void>(): Deferred<T> {
let resolve: Deferred<T>["resolve"] | undefined = undefined,
reject: Deferred<T>["reject"] | undefined = undefined,
settled = false,
status: DeferredStatus = "pending";
const promise = new Promise<T>((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,
};
}