UNPKG

softkave-js-utils

Version:

JavaScript & Typescript utility functions, types, and classes

92 lines 3.4 kB
import { convertToArray } from '../array/convertToArray.js'; export class DisposablesStore { constructor(promises) { this.promises = promises; this.disposablesMap = new Map(); this.get = (key) => { return this.disposablesMap.get(key); }; this.has = (key) => { return this.disposablesMap.has(key); }; this.getMap = () => { return this.disposablesMap; }; this.getList = () => { return Array.from(this.disposablesMap.values()); }; this.forgetDisposeAll = () => { this.disposablesMap.forEach(disposable => { if (disposable.dispose) { this.promises.callAndForget(disposable.dispose.bind(disposable)); } }); this.disposablesMap.clear(); }; this.awaitDisposeAll = async () => { const promises = []; this.disposablesMap.forEach(disposable => { if (disposable.dispose) { promises.push(disposable.dispose()); } }); await Promise.all(promises); this.disposablesMap.clear(); }; /** * if an individual key is an array, i.e. you called `add` with an array as * the key, e.g. `add([1, 2, 3], disposable)`, then use `removeOne` instead of * `remove` */ this.remove = (key) => { convertToArray(key).forEach(next => this.disposablesMap.delete(next)); }; this.removeOne = (key) => { this.disposablesMap.delete(key); }; this.awaitDisposeOne = async (key) => { const disposable = this.disposablesMap.get(key); if (disposable && disposable.dispose) { await disposable.dispose(); this.disposablesMap.delete(key); } }; this.forgetDisposeOne = (key) => { const disposable = this.disposablesMap.get(key); if (disposable && disposable.dispose) { this.promises.callAndForget(disposable.dispose.bind(disposable)); this.disposablesMap.delete(key); } }; this.awaitDisposeMany = async (keys) => { const promises = []; keys.forEach(key => { const disposable = this.disposablesMap.get(key); if (disposable && disposable.dispose) { promises.push(disposable.dispose()); this.disposablesMap.delete(key); } }); await Promise.all(promises); }; this.forgetDisposeMany = (keys) => { keys.forEach(key => { const disposable = this.disposablesMap.get(key); if (disposable && disposable.dispose) { this.promises.callAndForget(disposable.dispose.bind(disposable)); this.disposablesMap.delete(key); } }); }; this.add = this.add.bind(this); } add(...args) { if (args.length === 1) { convertToArray(args[0]).forEach(next => this.disposablesMap.set(next, next)); } else { this.disposablesMap.set(args[0], args[1]); } } } //# sourceMappingURL=disposables.js.map