/** * Disposables allow you to manage resources that can be cleaned up. Each helper * function returns a dispose function to clean up the resource. * * The `dispose` method can be called to clean up all resources at once. */ export class Disposables { // Track all disposables #disposables = new Set([]) /** * Enqueue a callback in the macrotasks queue. */ queueMacrotask(cb: () => void) { let timer = setTimeout(cb, 0) return this.add(() => { clearTimeout(timer) }) } /** * General purpose disposable function that can be cleaned up. */ add(dispose: () => void) { this.#disposables.add(dispose) return () => { this.#disposables.delete(dispose) dispose() } } /** * Dispose all disposables at once. */ dispose() { for (let dispose of this.#disposables) { dispose() } this.#disposables.clear() } }