UNPKG

@hazae41/box

Version:

Rust-like Box and similar objects for TypeScript

1 lines 7.38 kB
{"version":3,"file":"index.mjs","sources":["../../../../src/mods/box/index.ts"],"sourcesContent":["import { Nullable } from \"libs/nullable/index.js\"\nimport { BorrowedError } from \"mods/borrow/index.js\"\nimport { Deferred } from \"mods/deferred/index.js\"\nimport { MovedError } from \"mods/move/index.js\"\nimport { Ref } from \"mods/ref/index.js\"\nimport { Wrap } from \"mods/wrap/index.js\"\n\n/**\n * A movable and borrowable reference\n */\nexport class Box<T> implements Disposable {\n\n #state: \"owned\" | \"borrowed\" | \"moved\" = \"owned\"\n\n /**\n * An movable and borrowable reference\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 Box(value, value)\n }\n\n static from<T>(value: Wrap<T>) {\n return new Box(value.get(), value)\n }\n\n static with<T>(value: T, clean: (value: T) => void) {\n return new Box(value, new Deferred(() => clean(value)))\n }\n\n [Symbol.dispose]() {\n if (this.moved)\n return\n\n this.clean[Symbol.dispose]()\n }\n\n async [Symbol.asyncDispose]() {\n this[Symbol.dispose]()\n }\n\n get owned() {\n return this.#state === \"owned\"\n }\n\n get borrowed() {\n return this.#state === \"borrowed\"\n }\n\n get moved() {\n return this.#state === \"moved\"\n }\n\n /**\n * Get the value\n * @returns T\n */\n get() {\n return this.value\n }\n\n /**\n * Get the value or null-like if not owned\n * @returns T or null-like if not owned\n */\n getOrNull(): Nullable<T> {\n if (this.borrowed)\n return\n if (this.moved)\n return\n\n return this.value\n }\n\n /**\n * Get the value or throw if not owned\n * @returns T\n * @throws NotOwnedError if not owned\n */\n getOrThrow(): T {\n if (this.borrowed)\n throw new BorrowedError()\n if (this.moved)\n throw new MovedError()\n\n return this.value\n }\n\n checkOrNull(): Nullable<this> {\n if (this.borrowed)\n return\n if (this.moved)\n return\n\n return this\n }\n\n checkOrThrow(): this {\n if (this.borrowed)\n throw new BorrowedError()\n if (this.moved)\n throw new MovedError()\n\n return this\n }\n\n /**\n * Get the value and set this as moved or null-like if not owned\n * @returns T or null-like if not owned\n */\n unwrapOrNull(): Nullable<T> {\n if (this.borrowed)\n return\n if (this.moved)\n return\n\n this.#state = \"moved\"\n\n return this.value\n }\n\n /**\n * Get the value and set this as moved or throw if not owned\n * @returns T\n * @throws BoxMovedError if not owned\n */\n unwrapOrThrow(): T {\n if (this.borrowed)\n throw new BorrowedError()\n if (this.moved)\n throw new MovedError()\n\n this.#state = \"moved\"\n\n return this.value\n }\n\n /**\n * Move the value to a new box and set this one as moved or null-like if already moved\n * @returns Box<T> or null-like if moved\n */\n moveOrNull(): Nullable<Box<T>> {\n if (this.borrowed)\n return\n if (this.moved)\n return\n\n this.#state = \"moved\"\n\n return new Box(this.value, this.clean)\n }\n\n /**\n * Move the value to a new box and set this one as moved or throw if already moved\n * @returns Box<T>\n * @throws BoxMovedError if already moved\n */\n moveOrThrow(): Box<T> {\n if (this.borrowed)\n throw new BorrowedError()\n if (this.moved)\n throw new MovedError()\n\n this.#state = \"moved\"\n\n return new Box(this.value, this.clean)\n }\n\n borrowOrNull(): Nullable<Ref<T>> {\n if (this.borrowed)\n return\n if (this.moved)\n return\n\n this.#state = \"borrowed\"\n\n const dispose = () => { this.#state = \"owned\" }\n\n return new Ref(this.value, new Deferred(dispose))\n }\n\n borrowOrThrow(): Ref<T> {\n if (this.borrowed)\n throw new BorrowedError()\n if (this.moved)\n throw new MovedError()\n\n this.#state = \"borrowed\"\n\n const dispose = () => { this.#state = \"owned\" }\n\n return new Ref(this.value, new Deferred(dispose))\n }\n\n}"],"names":[],"mappings":"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"}