UNPKG

@hazae41/box

Version:

Rust-like Box and similar objects for TypeScript

1 lines 5.27 kB
{"version":3,"file":"index.cjs","sources":["../../../../../src/mods/borrow/index.ts"],"sourcesContent":["import { Nullable } from \"libs/nullable/index.js\"\n\nexport class OwnedError extends Error {\n readonly #class = OwnedError\n readonly name = this.#class.name\n\n constructor() {\n super(`Resource is owned`)\n }\n}\n\nexport class BorrowedError extends Error {\n readonly #class = BorrowedError\n readonly name = this.#class.name\n\n constructor() {\n super(`Resource is borrowed`)\n }\n}\n\nexport class DroppedError extends Error {\n readonly #class = DroppedError\n readonly name = this.#class.name\n\n constructor() {\n super(`Resource is dropped`)\n }\n}\n\nexport interface Borrowable<T extends Disposable> {\n readonly value: T\n\n readonly owned: boolean\n\n readonly borrowed: boolean\n\n readonly dropped: boolean\n\n borrowOrNull(): Nullable<Borrow<T>>\n borrowOrThrow(): Borrow<T>\n\n returnOrThrow(): void\n}\n\nexport type BorrowState =\n | \"owned\"\n | \"borrowed\"\n | \"dropped\"\n\nexport class Borrow<T extends Disposable> {\n\n #state: BorrowState = \"owned\"\n\n constructor(\n readonly parent: Borrowable<T>\n ) { }\n\n [Symbol.dispose]() {\n if (this.dropped)\n return\n\n if (this.owned)\n this.parent.returnOrThrow()\n\n this.#state = \"dropped\"\n }\n\n async [Symbol.asyncDispose]() {\n this[Symbol.dispose]()\n }\n\n get value() {\n return this.parent.value\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 get() {\n return this.value\n }\n\n getOrNull(): Nullable<T> {\n if (!this.owned)\n return\n return this.value\n }\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 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.parent.returnOrThrow()\n\n return\n }\n\n}"],"names":[],"mappings":"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"}