@alwatr/flatomise
Version:
A utility for creating promises that can be externally resolved or rejected.
55 lines (48 loc) • 1.22 kB
text/typescript
/* eslint-disable @typescript-eslint/no-explicit-any */
import type {Mutable} from '@alwatr/type-helper';
/**
* Flat promise that can be resolved or rejected from outside.
*/
export interface Flatomise<T> {
/**
* The promise.
*/
readonly promise: Promise<T>;
/**
* Resolve the promise.
*/
readonly resolve: (value: T | PromiseLike<T>) => void;
/**
* Reject the promise.
*/
readonly reject: (reason?: any) => void;
/**
* Whether the promise is settled (resolved or rejected).
*/
readonly settled: boolean;
}
/**
* Create a new Flatomise is a promise that can be resolved or rejected from outside.
*
* @returns A new Flatomise.
*
* @example
* ```typescript
* const flatomise = newFlatomise();
* flatomise.promise.then(() => {
* console.log('flatomise resolved');
* });
* flatomise.resolve();
* ```
*/
export function newFlatomise<T>(): Flatomise<T> {
const flatomise: Partial<Mutable<Flatomise<T>>> = {settled: false};
flatomise.promise = new Promise<T>((resolve, reject) => {
flatomise.resolve = resolve;
flatomise.reject = reject;
});
flatomise.promise.finally(() => {
flatomise.settled = true;
});
return flatomise as Flatomise<T>;
}