@hazae41/box
Version:
Rust-like Box and similar objects for TypeScript
1 lines • 5.62 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../../src/mods/move/index.ts"],"sourcesContent":["import { Nullable } from \"libs/nullable/index.js\"\nimport { Deferred } from \"mods/deferred/index.js\"\nimport { Wrap } from \"mods/wrap/index.js\"\n\nexport class MovedError extends Error {\n readonly #class = MovedError\n readonly name = this.#class.name\n\n constructor() {\n super(`Resource is moved`)\n }\n}\n\nexport interface Movable<T> {\n\n readonly moved: boolean\n\n get(): T\n\n getOrNull(): Nullable<T>\n\n getOrThrow(): T\n\n checkOrNull(): Nullable<this>\n\n checkOrThrow(): this\n\n unwrapOrNull(): Nullable<T>\n\n unwrapOrThrow(): T\n\n moveOrNull(): Nullable<Move<T>>\n\n moveOrThrow(): Move<T>\n\n}\n\n/**\n * A movable reference\n */\nexport class Move<T> implements Disposable, Movable<T> {\n\n #moved = false\n\n /**\n * An movable 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 Move(value, value)\n }\n\n static from<T>(value: Wrap<T>) {\n return new Move(value.get(), value)\n }\n\n static with<T>(value: T, clean: (value: T) => void) {\n return new Move(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 moved() {\n return this.#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.#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.#moved)\n throw new MovedError()\n\n return this.value\n }\n\n checkOrNull(): Nullable<this> {\n if (this.#moved)\n return\n\n return this\n }\n\n checkOrThrow(): this {\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.#moved)\n return\n\n this.#moved = true\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 DroppedError if not owned\n */\n unwrapOrThrow(): T {\n if (this.#moved)\n throw new MovedError()\n\n this.#moved = true\n\n return this.value\n }\n\n /**\n * Move the value to a new Unpin and set this one as moved or null-like if already moved\n * @returns Unpin<T> or null-like if moved\n */\n moveOrNull(): Nullable<Move<T>> {\n if (this.#moved)\n return\n\n this.#moved = true\n\n return new Move(this.value, this.clean)\n }\n\n /**\n * Move the value to a new Unpin and set this one as moved or throw if already moved\n * @returns Unpin<T>\n * @throws DroppedError if already moved\n */\n moveOrThrow(): Move<T> {\n if (this.#moved)\n throw new MovedError()\n\n this.#moved = true\n\n return new Move(this.value, this.clean)\n }\n\n}"],"names":["Deferred"],"mappings":"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"}