UNPKG

@hazae41/box

Version:

Rust-like Box and similar objects for TypeScript

1 lines 7.24 kB
{"version":3,"file":"index.cjs","sources":["../../../../../src/mods/box/index.ts"],"sourcesContent":["import { Nullable } from \"libs/nullable/index.js\"\nimport { Borrow, BorrowedError, DroppedError, OwnedError } from \"mods/borrow/index.js\"\n\nexport class MovedError extends Error {\n readonly #class = MovedError\n readonly name = this.#class.name\n\n constructor() {\n super(`Resource has been moved`)\n }\n}\n\nexport type BoxState =\n | \"owned\"\n | \"borrowed\"\n | \"dropped\"\n\n/**\n * An ownable and borrowable reference\n */\nexport class Box<T extends Disposable> {\n\n #state: BoxState = \"owned\"\n\n /**\n * An ownable reference\n * @param value \n */\n constructor(\n readonly value: T\n ) { }\n\n [Symbol.dispose]() {\n if (this.dropped)\n return\n\n if (this.owned)\n this.value[Symbol.dispose]()\n\n this.#state = \"dropped\"\n }\n\n async [Symbol.asyncDispose]() {\n this[Symbol.dispose]()\n }\n\n static create<T extends Disposable>(value: T) {\n return new Box(value)\n }\n\n static createAsDropped<T extends Disposable>(value: T) {\n const box = new Box(value)\n box.#state = \"dropped\"\n return box\n }\n\n get owned() {\n return this.#state === \"owned\"\n }\n\n get borrowed() {\n return this.#state === \"borrowed\"\n }\n\n get dropped() {\n return this.#state === \"dropped\"\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.owned)\n return\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.dropped)\n throw new DroppedError()\n return this.value\n }\n\n checkOrNull(): Nullable<this> {\n if (!this.owned)\n return\n return this\n }\n\n checkOrThrow(): this {\n if (this.borrowed)\n throw new BorrowedError()\n if (this.dropped)\n throw new DroppedError()\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.owned)\n return\n this.#state = \"dropped\"\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.dropped)\n throw new DroppedError()\n this.#state = \"dropped\"\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.owned)\n return\n this.#state = \"dropped\"\n\n return new Box(this.value)\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.dropped)\n throw new DroppedError()\n this.#state = \"dropped\"\n\n return new Box(this.value)\n }\n\n borrowOrNull(): Nullable<Borrow<T>> {\n if (!this.owned)\n return\n this.#state = \"borrowed\"\n\n return new Borrow(this)\n }\n\n borrowOrThrow(): Borrow<T> {\n if (this.borrowed)\n throw new BorrowedError()\n if (this.dropped)\n throw new DroppedError()\n this.#state = \"borrowed\"\n\n return new Borrow(this)\n }\n\n returnOrThrow(): void {\n if (this.owned)\n throw new OwnedError()\n\n if (this.borrowed)\n this.#state = \"owned\"\n else if (this.dropped)\n this.value[Symbol.dispose]()\n\n return\n }\n\n}"],"names":["BorrowedError","DroppedError","Borrow","OwnedError"],"mappings":"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"}