import {EventObject} from "xstate"; /* * Important! * * filter ts playground, filterAsync, filterEventAsync that in used are in ./monads.ts * */ type When boolean> = T extends Predicate ? T : never; type Filtered boolean, TIn =Parameters[0], TOut = When >= { in: TIn, out: TOut } export async function * filterAsync boolean, T extends Filtered["in"]=Filtered["in"]>(stream: AsyncIterable, filterFn: TFilter ): AsyncGenerator["out"]> { for await (const event of stream) { if (filterFn(event)) { yield event as Filtered["out"]; } } } export async function * filterEventAsync(stream: AsyncIterable, ...type: TType[]) { function isType(event: T): event is T & { type: TType } { return type.includes(event.type as TType); } yield* filterAsync(stream, isType); }