From e18e3523e56c151228e43e036f9eabede152bc4a Mon Sep 17 00:00:00 2001 From: Alexander Zinn Date: Thu, 30 Oct 2025 03:13:35 -0400 Subject: [PATCH] Add disposable management classes and interface - Introduced IDisposable interface for defining disposable behavior - Implemented Disposable class for single disposable resources - Created DisposableList class to manage multiple disposables - Updated index file to export the new classes and interface --- src/lang/disposables/Disposable.ts | 23 +++++++++++++++++++++++ src/lang/disposables/DisposableList.ts | 17 +++++++++++++++++ src/lang/disposables/IDisposable.ts | 3 +++ src/lang/disposables/index.ts | 6 ++++++ 4 files changed, 49 insertions(+) create mode 100644 src/lang/disposables/Disposable.ts create mode 100644 src/lang/disposables/DisposableList.ts create mode 100644 src/lang/disposables/IDisposable.ts create mode 100644 src/lang/disposables/index.ts diff --git a/src/lang/disposables/Disposable.ts b/src/lang/disposables/Disposable.ts new file mode 100644 index 0000000..0e3bfb1 --- /dev/null +++ b/src/lang/disposables/Disposable.ts @@ -0,0 +1,23 @@ +import type IDisposable from './IDisposable'; + +export default class Disposable implements IDisposable { + private _isDisposed = false; + private _disposable: () => void; + + constructor(disposable: () => void) { + this._disposable = disposable; + } + + get isDisposed(): boolean { + return this._isDisposed; + } + + public dispose(): void { + if (this._isDisposed) { + return; + } + + this._disposable(); + this._isDisposed = true; + } +} diff --git a/src/lang/disposables/DisposableList.ts b/src/lang/disposables/DisposableList.ts new file mode 100644 index 0000000..98e311f --- /dev/null +++ b/src/lang/disposables/DisposableList.ts @@ -0,0 +1,17 @@ +import type IDisposable from './IDisposable'; + +export default class DisposableList implements IDisposable { + private readonly _disposables: IDisposable[] = []; + + public add(disposable: IDisposable): void { + this._disposables.push(disposable); + } + + public dispose(): void { + while (this._disposables.length) { + const disposable = this._disposables.shift() as IDisposable; + + disposable.dispose(); + } + } +} diff --git a/src/lang/disposables/IDisposable.ts b/src/lang/disposables/IDisposable.ts new file mode 100644 index 0000000..8917250 --- /dev/null +++ b/src/lang/disposables/IDisposable.ts @@ -0,0 +1,3 @@ +export default interface IDisposable { + dispose(): void; +} diff --git a/src/lang/disposables/index.ts b/src/lang/disposables/index.ts new file mode 100644 index 0000000..3665977 --- /dev/null +++ b/src/lang/disposables/index.ts @@ -0,0 +1,6 @@ +import type IDisposable from './IDisposable'; +import Disposable from './Disposable'; +import DisposableList from './DisposableList'; + +export type {IDisposable}; +export {Disposable, DisposableList};