import Singleton from '../Base/Singleton'; import { EventEnum } from '../Enum'; interface IItem { func: Function; ctx: unknown; } export default class EventManager extends Singleton { static get Instance() { return super.GetInstance(); } private eventMap: Map> = new Map(); on(event: EventEnum, func: Function, ctx?: unknown) { if (this.eventMap.has(event)) { this.eventMap.get(event).push({ func, ctx }); } else { this.eventMap.set(event, [{ func, ctx }]); } } off(event: EventEnum, func: Function, ctx?: unknown) { if (this.eventMap.has(event)) { const index = this.eventMap.get(event).findIndex(i => func === i.func && i.ctx === ctx); index > -1 && this.eventMap.get(event).splice(index, 1); } } emit(event: EventEnum, ...params: unknown[]) { if (this.eventMap.has(event)) { this.eventMap.get(event).forEach(({ func, ctx }) => { ctx ? func.apply(ctx, params) : func(...params); }); } } clear() { this.eventMap.clear(); } }