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() },
)
}