blob: bcd6e4fd3a7dab532d3e2363b8a4cdfabb78d076 [file] [log] [blame]
export default class LazyFactory<T extends HTMLElement | SVGElement> {
private activeNodes = new Map<
HTMLElement | SVGElement,
{
counter: number;
node: T;
}
>();
private factoryFn: () => T;
constructor(factoryFn: () => T) {
this.factoryFn = factoryFn;
}
createInContainer(container: HTMLElement | SVGElement = document.body) {
if (this.activeNodes.has(container)) {
const entry = this.activeNodes.get(container)!;
entry.counter += 1;
return entry.node;
}
const node = this.factoryFn();
container.append(node);
this.activeNodes.set(container, { counter: 1, node });
return node;
}
removeFromContainer(container: HTMLElement | SVGElement = document.body) {
if (this.activeNodes.has(container)) {
const entry = this.activeNodes.get(container)!;
entry.counter -= 1;
if (entry.counter === 0) {
container.removeChild(entry.node);
this.activeNodes.delete(container);
}
}
}
}