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};