import { BehaviorCatcher } from './behaviorCatchers'; export class BehaviorCatcherMap> { catcherMap = new Map(); constructor(private Catcher: new (...args: any) => T) {} /** 注册元素,将其加入到 catcherMap 中,或者更新其 extInfo */ register(el: EL, extInfo?: Record, config?: Record) { const catcher = this.catcherMap.get(el); if (catcher) { catcher.updateExtInfo(extInfo); if (config) { catcher.updateConfig(config); } return catcher; } const newCatcher = new this.Catcher({ el, extInfo, ...config, }); this.catcherMap.set(el, newCatcher); return newCatcher; } /** 注销元素,既从 catcherMap 中删去,也销毁 catcher 自身 */ deregister(el: EL) { const catcher = this.catcherMap.get(el); if (!catcher) return; catcher.destroy(); this.catcherMap.delete(el); } /** 通过 el 拿到 catcher */ get(el: EL) { return this.catcherMap.get(el); } has(el: EL) { return this.catcherMap.has(el); } /** 通过 catcher 字段拿到 catcher */ find(predicate: (value: T) => boolean) { for (const catcher of this.catcherMap.values()) { if (predicate(catcher)) return catcher; } return undefined; } /** 销毁,会调用所有 Catcher 的 destroy 方法 */ settle() { this.catcherMap.forEach((catcher, el) => { catcher.destroy(); this.catcherMap.delete(el); }); } }