import {Listener} from './interfaces'; export class TagMap { private _tagToListeners = new WeakMap>>(); private _listenerToTags = new WeakMap, Set>(); public setListeners(listener: Listener, ...tags: any[]) { const tagSet = this._listenerToTags.get(listener) || new Set(); tags.forEach(tag => { const listenerSet = this._tagToListeners.get(tag) || new Set(); listenerSet.add(listener); tagSet.add(tag); this._tagToListeners.set(tag, listenerSet); }); this._listenerToTags.set(listener, tagSet); } public getListeners(tag: any): Set> { return this._tagToListeners.get(tag) || new Set(); } public getTags(listener: Listener): Set { return this._listenerToTags.get(listener) || new Set(); } public clearListener(listener: Listener) { const tags = this.getTags(listener); this._listenerToTags.delete(listener); tags.forEach(tag => { const listenerSet = this.getListeners(tag); listenerSet.delete(listener); if (listenerSet.size === 0) { this._tagToListeners.delete(tag); } }); } }