import { Map, Collection, OrderedMap } from "immutable"; import { Unit } from "../fun/domains/unit/state"; import { BasicUpdater } from "../fun/domains/updater/state"; import { BasicFun } from "../fun/state"; import { Template, createTemplate } from "../template/state"; import { Coroutine, InboundEventFromContext, InboundKindFromContext, } from "./state"; import { CoroutineComponentOptions, CoroutineTemplate } from "./template"; import { Guid } from "../baseEntity/domains/identifiable/state"; import { SimpleCallback } from "../fun/domains/simpleCallback/state"; export const CoTypedFactory = Object.assign( () => ({ Seq: Coroutine.Seq, GetState: Coroutine.GetState, SetState: Coroutine.SetState, UpdateState: Coroutine.UpdateState, Any: Coroutine.Any, All: (ps: Array>) => Coroutine.All(ps), Yield: Coroutine.Yield, Wait: Coroutine.Wait, Await: ( p: BasicFun>, onErr: BasicFun, debugName?: string, ) => Coroutine.Await(p, onErr, debugName), Repeat: Coroutine.Repeat, Return: (res: r) => Coroutine.Return(res), While: Coroutine.While, For: (collection: Collection) => (p: BasicFun>) => Coroutine.For(collection, p), Embed: ( p: Coroutine, narrow: BasicFun, widen: BasicFun, BasicUpdater>, ): Coroutine => Coroutine.Embed(p, narrow, widen), Template: ( initialCoroutine: Coroutine, options?: CoroutineComponentOptions, ): Template => createTemplate((props) => (options?.runFilter || ((_) => true))({ ...props, foreignMutations: {}, }) ? ( CoroutineTemplate()({ ...props, context: { ...props.context, initialCoroutine, options, }, }) ) : ( <> ), ), Trigger: ( event: event, ): Coroutine< c & s & { outboundEvents: Map> }, s & { outboundEvents: Map> }, Unit > => Coroutine.Trigger< c & s & { outboundEvents: Map> }, s & { outboundEvents: Map> }, event, kind >(event), Do: (action: SimpleCallback): Coroutine => Coroutine.Do(action), }), { withOn: < eventKind, event, c, s extends { inboundEvents: Map> }, >() => ({ ...CoTypedFactory(), On: >( kind: matchedEvent, filter?: BasicFun< [InboundEventFromContext & { kind: matchedEvent }, c & s], boolean >, ): Coroutine< c & s, s, InboundEventFromContext & { kind: matchedEvent } > => { return Coroutine.On( kind, filter, ); }, }), }, );