UNPKG

@hazae41/box

Version:

Rust-like Box and similar objects for TypeScript

1 lines 5.01 kB
{"version":3,"file":"index.cjs","sources":["../../../../src/mods/once/index.ts"],"sourcesContent":["import { Nullable } from \"libs/nullable/index.js\"\nimport { Deferred } from \"mods/deferred/index.js\"\nimport { AsyncWrap, Wrap } from \"mods/wrap/index.js\"\n\nexport class DisposedError extends Error {\n readonly #class = DisposedError\n readonly name = this.#class.name\n\n constructor() {\n super(`Reference has been disposed`)\n }\n}\n\n/**\n * A reference that can only be disposed once\n */\nexport class Once<T> {\n\n #disposed = false\n\n /**\n * A reference that can only be disposed once\n * @param value \n */\n constructor(\n readonly value: T,\n readonly clean: Disposable\n ) { }\n\n static wrap<T extends Disposable>(value: T) {\n return new Once(value, value)\n }\n\n static from<T>(value: Wrap<T>) {\n return new Once(value.get(), value)\n }\n\n static with<T>(value: T, clean: (value: T) => void) {\n return new Once(value, new Deferred(() => clean(value)))\n }\n\n [Symbol.dispose]() {\n if (this.#disposed)\n return\n this.#disposed = true\n\n this.clean[Symbol.dispose]()\n }\n\n async [Symbol.asyncDispose]() {\n this[Symbol.dispose]()\n }\n\n get disposed() {\n return this.#disposed\n }\n\n get() {\n return this.value\n }\n\n getOrNull(): Nullable<T> {\n if (this.#disposed)\n return\n\n return this.value\n }\n\n getOrThrow(): T {\n if (this.#disposed)\n throw new DisposedError()\n\n return this.value\n }\n\n}\n\nexport class AsyncOnce<T> {\n\n #disposed = false\n\n /**\n * A reference that can only be disposed once\n * @param value \n */\n constructor(\n readonly value: T,\n readonly clean: AsyncDisposable\n ) { }\n\n static wrap<T extends AsyncDisposable>(value: T) {\n return new AsyncOnce(value, value)\n }\n\n static from<T>(value: AsyncWrap<T>) {\n return new AsyncOnce(value.get(), value)\n }\n\n static with<T>(value: T, clean: (value: T) => void) {\n return new AsyncOnce(value, new Deferred(() => clean(value)))\n }\n\n async [Symbol.asyncDispose]() {\n if (this.#disposed)\n return\n this.#disposed = true\n\n await this.clean[Symbol.asyncDispose]()\n }\n\n get disposed() {\n return this.#disposed\n }\n\n get() {\n return this.value\n }\n\n getOrNull(): Nullable<T> {\n if (this.#disposed)\n return\n\n return this.value\n }\n\n async getOrThrow(): Promise<T> {\n if (this.#disposed)\n throw new DisposedError()\n\n return this.value\n }\n\n}"],"names":["Deferred"],"mappings":"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"}