import { Task } from "./Task"; export class TaskCompletionSource { private task: Task; private isResultSet: boolean; constructor() { this.task = new Task(); this.isResultSet = false; } public cancel(error: E): void { this.trySetError(error); } public setResult(result: T): void { if (this.isResultSet) { throw new Error("result/error has been set before"); } else { this.isResultSet = true; this.task.resolve(result); } } public getResultAsync(): Promise { return this.task.getResultAsync(); } public trySetResult(result: T): void { if (!this.isResultSet) { this.setResult(result); } } public setError(error: E): void { if (this.isResultSet) { throw new Error("result/error has been set before"); } else { this.isResultSet = true; this.task.reject(error); } } public trySetError(error: E): void { if (!this.isResultSet) { this.setError(error); } } }