import { EVENT_EMITTER_KEY } from '../../event/constants/event-keys'; import type { AnyEventMap } from '../../event/types/event-map.type'; import type { AnyList } from '../../utils/types/utility.type'; import type { UsecaseSymbolEventMap } from '../types/usecase-symbol-event.type'; import type { UsecaseSymbolModel } from '../types/usecase-symbol-model.interface'; /** * Disptaches Target Symbol event. * * @param symbol Target symbol. may be one of the following: Actor, * Role, Usecase, Goal, Boundary * @param type Event type * @param args Parameters of the dispatched event. */ export function emitSymbolEvent< Source extends UsecaseSymbolModel, Type extends keyof UsecaseSymbolEventMap, Params extends UsecaseSymbolEventMap[Type], >( symbol: Source, type: Type, ...args: Params extends AnyList ? [...Params] : [] ): void { symbol[EVENT_EMITTER_KEY].emit(type, ...args); }