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
}