import { ActorSystem, AnyEventObject, EventObject, fromEventObservable, fromObservable, NonReducibleUnknown, ObservableActorLogic, ObservableActorRef, Observer, type Subscription, toObserver } from "xstate"; export function fromAsyncGenerator (generatorCreator: ({ input, system, self }: { input: TInput; system: ActorSystem; self: ObservableActorRef; emit: (emitted: TEmitted) => void; }) => AsyncGenerator): ObservableActorLogic { return fromObservable((actionArgs) => { const iterator = generatorCreator(actionArgs); const observers = new Set>(); (async () => { for await (const event of iterator) { for (const observer of observers) { observer.next?.call(observer, event); } } for (const observer of observers) { observer.complete?.call(observer); } })(); return { subscribe(callback ): Subscription { const observer= toObserver(callback); observers.add(observer); return { unsubscribe() { observers.delete(observer); } } } }; }) } export const asyncGenerator = fromAsyncGenerator(async function* ({ input }:{input:AsyncIterable}) { yield* input; }) export function fromEventAsyncGenerator (generatorCreator: ({ input, system, self,emit }: { input: TInput; system: ActorSystem; self: ObservableActorRef; emit: (emitted: TEmitted) => void; }) => AsyncGenerator | Promise>): ObservableActorLogic { return fromEventObservable((actionArgs) => { const iterator = generatorCreator(actionArgs); const observers = new Set>(); (async () => { for await (const event of await iterator) { for (const observer of observers) { observer.next?.call(observer, event); } } for (const observer of observers) { observer.complete?.call(observer); } })(); return { subscribe(callback): Subscription { const observer = toObserver(callback); observers.add(observer); return { unsubscribe() { observers.delete(observer); } } } }; }) } export const asyncEventGenerator = fromEventAsyncGenerator(async function* ({ input }:{input:AsyncIterable}) { yield* input; })