@hazae41/box
Version:
Rust-like Box and similar objects for TypeScript
87 lines (83 loc) • 2.02 kB
JavaScript
'use strict';
var index = require('../deferred/index.cjs');
var index$1 = require('../ref/index.cjs');
var _a;
class BorrowedError extends Error {
#class = _a;
name = this.#class.name;
constructor() {
super(`Resource is borrowed`);
}
}
_a = BorrowedError;
/**
* A borrowable reference
* @param value
*/
class Borrow {
value;
clean;
#borrowed = false;
constructor(value, clean) {
this.value = value;
this.clean = clean;
}
static wrap(value) {
return new Borrow(value, value);
}
static from(value) {
return new Borrow(value.get(), value);
}
static with(value, clean) {
return new Borrow(value, new index.Deferred(() => clean(value)));
}
[Symbol.dispose]() {
this.clean[Symbol.dispose]();
}
async [Symbol.asyncDispose]() {
this[Symbol.dispose]();
}
get borrowed() {
return this.#borrowed;
}
get() {
return this.value;
}
getOrNull() {
if (this.#borrowed)
return;
return this.value;
}
getOrThrow() {
if (this.#borrowed)
throw new BorrowedError();
return this.value;
}
checkOrNull() {
if (this.#borrowed)
return;
return this;
}
checkOrThrow() {
if (this.#borrowed)
throw new BorrowedError();
return this;
}
borrowOrNull() {
if (this.#borrowed)
return;
this.#borrowed = true;
const dispose = () => { this.#borrowed = false; };
return new index$1.Ref(this.value, new index.Deferred(dispose));
}
borrowOrThrow() {
if (this.#borrowed)
throw new BorrowedError();
this.#borrowed = true;
const dispose = () => { this.#borrowed = false; };
return new index$1.Ref(this.value, new index.Deferred(dispose));
}
}
exports.Borrow = Borrow;
exports.BorrowedError = BorrowedError;
//# sourceMappingURL=index.cjs.map