@hazae41/box
Version:
Rust-like Box and similar objects for TypeScript
113 lines (109 loc) • 2.48 kB
JavaScript
'use strict';
var index = require('../deferred/index.cjs');
var _a;
class DisposedError extends Error {
#class = _a;
name = this.#class.name;
constructor() {
super(`Reference has been disposed`);
}
}
_a = DisposedError;
/**
* A reference that can only be disposed once
*/
class Once {
value;
clean;
#disposed = false;
/**
* A reference that can only be disposed once
* @param value
*/
constructor(value, clean) {
this.value = value;
this.clean = clean;
}
static wrap(value) {
return new Once(value, value);
}
static from(value) {
return new Once(value.get(), value);
}
static with(value, clean) {
return new Once(value, new index.Deferred(() => clean(value)));
}
[Symbol.dispose]() {
if (this.#disposed)
return;
this.#disposed = true;
this.clean[Symbol.dispose]();
}
async [Symbol.asyncDispose]() {
this[Symbol.dispose]();
}
get disposed() {
return this.#disposed;
}
get() {
return this.value;
}
getOrNull() {
if (this.#disposed)
return;
return this.value;
}
getOrThrow() {
if (this.#disposed)
throw new DisposedError();
return this.value;
}
}
class AsyncOnce {
value;
clean;
#disposed = false;
/**
* A reference that can only be disposed once
* @param value
*/
constructor(value, clean) {
this.value = value;
this.clean = clean;
}
static wrap(value) {
return new AsyncOnce(value, value);
}
static from(value) {
return new AsyncOnce(value.get(), value);
}
static with(value, clean) {
return new AsyncOnce(value, new index.Deferred(() => clean(value)));
}
async [Symbol.asyncDispose]() {
if (this.#disposed)
return;
this.#disposed = true;
await this.clean[Symbol.asyncDispose]();
}
get disposed() {
return this.#disposed;
}
get() {
return this.value;
}
getOrNull() {
if (this.#disposed)
return;
return this.value;
}
async getOrThrow() {
if (this.#disposed)
throw new DisposedError();
return this.value;
}
}
exports.AsyncOnce = AsyncOnce;
exports.DisposedError = DisposedError;
exports.Once = Once;
//# sourceMappingURL=index.cjs.map