class Deferred<T> {
    promise: Promise<T>;

    resolve!: (value: T | PromiseLike<T>) => void;

    reject!: (reason?: Error) => void;

    constructor() {
        this.promise = new Promise<T>((resolve, reject) => {
            this.resolve = resolve;
            this.reject = reject;
        });
    }
}

export { Deferred };