import { map, Subject, type Observable } from 'rxjs' import type { OrchModel } from '../model' import { epic } from './epic' import { Performer } from './performer' export type SignalFactory = (payload$: Observable

) => Observable export type SignalPerformer = Performer & { signal$: Observable } export function signal

( model: OrchModel, factory?: SignalFactory, ): SignalPerformer export function signal( model: OrchModel, factory?: SignalFactory, ): SignalPerformer { const signalSource = new Subject() return Object.assign( epic( model, ({ payload$, action }) => (factory ? factory(payload$) : payload$).pipe( map((value) => action(() => signalSource.next(value))), ), { factoryToLog: factory, }, ), { signal$: signalSource.asObservable() }, ) }