import type { OrchModel } from '../model' import type { PayloadFunc } from '../utility-types' export type Performer = PayloadFunc export type PerformerFactory = () => { next: (payload: P) => R dispose: () => void } export function performer( model: OrchModel, factory: PerformerFactory, ): Performer { let current: ReturnType> | null = null const dispose = () => { current?.dispose() current = null } const setup = () => { dispose() current = factory() } model.on.activate(setup) model.on.deactivate(dispose) if (model.status === 'active') { setup() } return ((payload) => { if (!current) { throw new Error( `Cannot trigger a performer, since the model [${model.constructor.name}] is in "${model.status}" status`, ) } return current.next(payload) }) as Performer }