import mitt from 'mitt'; export class HookRegister { hookMap: { [key: string]: Array }; private topic: mitt.Emitter; constructor() { this.topic = mitt(); this.hookMap = {}; } listen(hookName: string, listener: (hook: Hook) => void) { this.topic.on(hookName, event => { listener(event); }) } register(hook: Hook) { let hooks = this.hookMap[hook.name] || []; hooks = [...hooks, hook]; this.hookMap[hook.name] = hooks; this.topic.emit(hook.name, hook); } getHooks(name: string): Array> { return this.hookMap[name] || []; } getHook(name: string): Hook { return this.getHooks(name)[0]; } } export interface Hook { id: string, name: string, hook: T, }