API/TaskCompletionSource.js

/**
 * @template T.
 * @class TaskCompletionSource
 */
class TaskCompletionSource {
	constructor() {
		var Resolve;
		var Reject;
		this.State = 0;
		/**@type Priomise<T> */
		this.Task = new Promise((res, rej) => {
			Resolve = res;
			Reject = rej;
		});
		Object.defineProperties(this, {
			Resolve: { value: Resolve, enumerable: false },
			Reject: { value: Reject, enumerable: false },
		});
	}
	get isResolved() {
		return this.State === 1;
	}
	get isRejected() {
		return this.State === 2;
	}
	get isCompleated() {
		return this.State !== 0;
	}
	SetResult(value) {
		this.Resolve(value);
		this.State = 1;
		return true;
	}
	TrySetResult(value) {
		if (this.isCompleated) return false;
		try {
			this.SetResult(value);
			return true;
		} catch (error) {
			return false;
		}
	}
}
module.exports = { TaskCompletionSource };