From 2c4a886e270b3d882cbf92430f0f69d0074fc802 Mon Sep 17 00:00:00 2001 From: Alexander Zinn Date: Sat, 25 Oct 2025 16:31:39 -0400 Subject: [PATCH] Add Disposable and DisposableList --- src/lang/Disposable.ts | 24 ++++++++++++++++++++++++ src/lang/DisposableList.ts | 21 +++++++++++++++++++++ src/lang/IDisposable.ts | 3 +++ 3 files changed, 48 insertions(+) create mode 100644 src/lang/Disposable.ts create mode 100644 src/lang/DisposableList.ts create mode 100644 src/lang/IDisposable.ts diff --git a/src/lang/Disposable.ts b/src/lang/Disposable.ts new file mode 100644 index 0000000..0b322b2 --- /dev/null +++ b/src/lang/Disposable.ts @@ -0,0 +1,24 @@ +import IDisposable from "./IDisposable"; + +export default class Disposable implements IDisposable { + private readonly _cleanup: () => void; + private _isDisposed: boolean; + + constructor(cleanup: () => void) { + this._cleanup = cleanup; + this._isDisposed = false; + } + + get isDisposed() { + return this._isDisposed; + } + + public dispose(): void { + if (this._isDisposed) { + return; + } + + this._cleanup(); + this._isDisposed = true; + } +} diff --git a/src/lang/DisposableList.ts b/src/lang/DisposableList.ts new file mode 100644 index 0000000..8d8ff2e --- /dev/null +++ b/src/lang/DisposableList.ts @@ -0,0 +1,21 @@ +import IDisposable from "./IDisposable"; + +export default class DisposableList implements IDisposable { + private readonly _list: IDisposable[]; + + constructor() { + this._list = []; + } + + public add(disposable: IDisposable): void { + this._list.push(disposable); + } + + public dispose(): void { + while (this._list.length) { + const disposable = this._list.shift(); + + disposable.dispose(); + } + } +} diff --git a/src/lang/IDisposable.ts b/src/lang/IDisposable.ts new file mode 100644 index 0000000..8917250 --- /dev/null +++ b/src/lang/IDisposable.ts @@ -0,0 +1,3 @@ +export default interface IDisposable { + dispose(): void; +}