import { ITrigger, ITriggerCollection, ITriggerHandler } from './types'; export class TriggerCollection implements ITriggerCollection { /** 当前集合内部维护的触发器列表 */ private readonly triggerList: ITrigger[]; constructor(triggers: Iterable) { this.triggerList = [...triggers]; } count(): number { return this.triggerList.length; } async trigger(handler: ITriggerHandler): Promise { for (const trigger of this.triggerList) { await trigger.trigger(handler); } } async *triggerIter( handler: ITriggerHandler ): AsyncGenerator { let currentHandler = handler; for (const trigger of this.triggerList) { await trigger.trigger(currentHandler); const nextHandler = yield trigger; if (nextHandler) { currentHandler = nextHandler; } else { currentHandler = handler; } } } iterate(): Iterable { return this.triggerList.values(); } push(trigger: ITrigger): void { this.triggerList.push(trigger); } unshift(trigger: ITrigger): void { this.triggerList.unshift(trigger); } concat(...others: ITriggerCollection[]): ITriggerCollection { const merged = [...this.triggerList]; for (const other of others) { merged.push(...other.iterate()); } return new TriggerCollection(merged); } }