softkave-js-utils
Version:
JavaScript & Typescript utility functions, types, and classes
92 lines • 3.4 kB
JavaScript
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