UNPKG

@hazae41/box

Version:

Rust-like Box and similar objects for TypeScript

113 lines (109 loc) 2.48 kB
'use strict'; var index = require('../deferred/index.cjs'); var _a; class DisposedError extends Error { #class = _a; name = this.#class.name; constructor() { super(`Reference has been disposed`); } } _a = DisposedError; /** * A reference that can only be disposed once */ class Once { value; clean; #disposed = false; /** * A reference that can only be disposed once * @param value */ constructor(value, clean) { this.value = value; this.clean = clean; } static wrap(value) { return new Once(value, value); } static from(value) { return new Once(value.get(), value); } static with(value, clean) { return new Once(value, new index.Deferred(() => clean(value))); } [Symbol.dispose]() { if (this.#disposed) return; this.#disposed = true; this.clean[Symbol.dispose](); } async [Symbol.asyncDispose]() { this[Symbol.dispose](); } get disposed() { return this.#disposed; } get() { return this.value; } getOrNull() { if (this.#disposed) return; return this.value; } getOrThrow() { if (this.#disposed) throw new DisposedError(); return this.value; } } class AsyncOnce { value; clean; #disposed = false; /** * A reference that can only be disposed once * @param value */ constructor(value, clean) { this.value = value; this.clean = clean; } static wrap(value) { return new AsyncOnce(value, value); } static from(value) { return new AsyncOnce(value.get(), value); } static with(value, clean) { return new AsyncOnce(value, new index.Deferred(() => clean(value))); } async [Symbol.asyncDispose]() { if (this.#disposed) return; this.#disposed = true; await this.clean[Symbol.asyncDispose](); } get disposed() { return this.#disposed; } get() { return this.value; } getOrNull() { if (this.#disposed) return; return this.value; } async getOrThrow() { if (this.#disposed) throw new DisposedError(); return this.value; } } exports.AsyncOnce = AsyncOnce; exports.DisposedError = DisposedError; exports.Once = Once; //# sourceMappingURL=index.cjs.map