@hazae41/box
Version:
Rust-like Box and similar objects for TypeScript
1 lines • 4.39 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../src/mods/borrow/index.ts"],"sourcesContent":["import { Nullable } from \"libs/nullable/index.js\"\nimport { Deferred } from \"mods/deferred/index.js\"\nimport { Ref } from \"mods/ref/index.js\"\nimport { Wrap } from \"mods/wrap/index.js\"\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 interface Borrowable<T> {\n\n readonly borrowed: 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 borrowOrNull(): Nullable<Ref<T>>\n\n borrowOrThrow(): Ref<T>\n\n}\n\n/**\n * A borrowable reference\n * @param value \n */\nexport class Borrow<T> implements Disposable, Borrowable<T> {\n\n #borrowed = false\n\n constructor(\n readonly value: T,\n readonly clean: Disposable\n ) { }\n\n static wrap<T extends Disposable>(value: T) {\n return new Borrow(value, value)\n }\n\n static from<T>(value: Wrap<T>) {\n return new Borrow(value.get(), value)\n }\n\n static with<T>(value: T, clean: (value: T) => void) {\n return new Borrow(value, new Deferred(() => clean(value)))\n }\n\n [Symbol.dispose]() {\n this.clean[Symbol.dispose]()\n }\n\n async [Symbol.asyncDispose]() {\n this[Symbol.dispose]()\n }\n\n get borrowed() {\n return this.#borrowed\n }\n\n get() {\n return this.value\n }\n\n getOrNull(): Nullable<T> {\n if (this.#borrowed)\n return\n\n return this.value\n }\n\n getOrThrow(): T {\n if (this.#borrowed)\n throw new BorrowedError()\n\n return this.value\n }\n\n checkOrNull(): Nullable<this> {\n if (this.#borrowed)\n return\n\n return this\n }\n\n checkOrThrow(): this {\n if (this.#borrowed)\n throw new BorrowedError()\n\n return this\n }\n\n borrowOrNull(): Nullable<Ref<T>> {\n if (this.#borrowed)\n return\n\n this.#borrowed = true\n\n const dispose = () => { this.#borrowed = false }\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\n this.#borrowed = true\n\n const dispose = () => { this.#borrowed = false }\n\n return new Ref(this.value, new Deferred(dispose))\n }\n\n}"],"names":[],"mappings":";;;;AAKM,MAAO,aAAc,SAAQ,KAAK,CAAA;IAC7B,MAAM,GAAG,EAAa,CAAA;AACtB,IAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;AAEhC,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,CAAsB,oBAAA,CAAA,CAAC,CAAA;KAC9B;AACF,CAAA;;AAsBD;;;AAGG;MACU,MAAM,CAAA;AAKN,IAAA,KAAA,CAAA;AACA,IAAA,KAAA,CAAA;IAJX,SAAS,GAAG,KAAK,CAAA;IAEjB,WACW,CAAA,KAAQ,EACR,KAAiB,EAAA;QADjB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAG;QACR,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;KACvB;IAEL,OAAO,IAAI,CAAuB,KAAQ,EAAA;AACxC,QAAA,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;KAChC;IAED,OAAO,IAAI,CAAI,KAAc,EAAA;QAC3B,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAA;KACtC;AAED,IAAA,OAAO,IAAI,CAAI,KAAQ,EAAE,KAAyB,EAAA;AAChD,QAAA,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;KAC3D;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,GAAA;QACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;KAC7B;AAED,IAAA,OAAO,MAAM,CAAC,YAAY,CAAC,GAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;KACvB;AAED,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;KACtB;IAED,GAAG,GAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;KAClB;IAED,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,SAAS;YAChB,OAAM;QAER,OAAO,IAAI,CAAC,KAAK,CAAA;KAClB;IAED,UAAU,GAAA;QACR,IAAI,IAAI,CAAC,SAAS;YAChB,MAAM,IAAI,aAAa,EAAE,CAAA;QAE3B,OAAO,IAAI,CAAC,KAAK,CAAA;KAClB;IAED,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,SAAS;YAChB,OAAM;AAER,QAAA,OAAO,IAAI,CAAA;KACZ;IAED,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,SAAS;YAChB,MAAM,IAAI,aAAa,EAAE,CAAA;AAE3B,QAAA,OAAO,IAAI,CAAA;KACZ;IAED,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,SAAS;YAChB,OAAM;AAER,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AAErB,QAAA,MAAM,OAAO,GAAG,MAAQ,EAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA,EAAE,CAAA;AAEhD,QAAA,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;KAClD;IAED,aAAa,GAAA;QACX,IAAI,IAAI,CAAC,SAAS;YAChB,MAAM,IAAI,aAAa,EAAE,CAAA;AAE3B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AAErB,QAAA,MAAM,OAAO,GAAG,MAAQ,EAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA,EAAE,CAAA;AAEhD,QAAA,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;KAClD;AAEF;;;;"}