| export { aggregate, lift, make, persistent } from './subscription.js'; | ||
| export type { EntryWithoutKeepAlive, Subscription, Subscriptions, } from './subscription.js'; | ||
| export type { EntryWithoutKeepAlive, GatedDependencies, Subscription, Subscriptions, } from './subscription.js'; | ||
| export { animationFrame } from './animationFrame.js'; | ||
@@ -4,0 +4,0 @@ export type { AnimationFrameConfig } from './animationFrame.js'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/subscription/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAErE,YAAY,EACV,qBAAqB,EACrB,YAAY,EACZ,aAAa,GACd,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE/D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAE9D,YAAY,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA"} | ||
| {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/subscription/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAErE,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,aAAa,GACd,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE/D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAE9D,YAAY,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA"} |
@@ -1,2 +0,2 @@ | ||
| import { type Equivalence, Schema, Stream } from 'effect'; | ||
| import { type Equivalence, Option, Schema, Stream } from 'effect'; | ||
| type SubscriptionBrand = { | ||
@@ -137,2 +137,49 @@ readonly __subscription: never; | ||
| /** | ||
| * The dependencies of a Subscription lifted through a parent's `when` gate: | ||
| * the child entry's own dependencies under `maybeDependencies`, and `None` | ||
| * for as long as the parent holds the gate closed. | ||
| * | ||
| * A closed gate is a real teardown rather than a paused Stream. The entry's | ||
| * Stream is torn down, and the child's `modelToDependencies` does not run | ||
| * again until the parent reopens the gate, so child state that changes behind | ||
| * a closed gate causes no restarts. | ||
| */ | ||
| export type GatedDependencies<Dependencies> = Readonly<{ | ||
| maybeDependencies: Option.Option<Dependencies>; | ||
| }>; | ||
| type WhenPredicate<ParentModel> = (parentModel: ParentModel) => boolean; | ||
| /** | ||
| * The per-entry form of a lift's `when`: a partial map from entry name to | ||
| * gate. Entries the map names are gated, and entries it omits are lifted | ||
| * ungated. | ||
| */ | ||
| export type EntryGates<ParentModel, Subscriptions> = Readonly<Partial<Record<keyof Subscriptions, WhenPredicate<ParentModel>>>>; | ||
| type LiftConfig<ParentModel, ParentMessage, Subscriptions> = Readonly<{ | ||
| toChildModel: (parentModel: ParentModel) => ChildModelOf<Subscriptions>; | ||
| toParentMessage: (message: ChildMessageOf<Subscriptions>) => ParentMessage; | ||
| }>; | ||
| type GatedLiftConfig<ParentModel, ParentMessage, Subscriptions> = LiftConfig<ParentModel, ParentMessage, Subscriptions> & Readonly<{ | ||
| when: WhenPredicate<ParentModel>; | ||
| }>; | ||
| type PerEntryGatedLiftConfig<ParentModel, ParentMessage, Subscriptions, Gates> = LiftConfig<ParentModel, ParentMessage, Subscriptions> & Readonly<{ | ||
| when: Gates; | ||
| }>; | ||
| type LiftedSubscriptions<ParentModel, ParentMessage, Subscriptions> = { | ||
| readonly [K in keyof Subscriptions]: Subscriptions[K] extends Subscription<any, any, infer Dependencies, infer Services> ? Subscription<ParentModel, ParentMessage, Dependencies, Services> : never; | ||
| }; | ||
| type GatedLiftedSubscriptions<ParentModel, ParentMessage, Subscriptions> = { | ||
| readonly [K in keyof Subscriptions]: Subscriptions[K] extends Subscription<any, any, infer Dependencies, infer Services> ? Subscription<ParentModel, ParentMessage, GatedDependencies<Dependencies>, Services> : never; | ||
| }; | ||
| /** | ||
| * The lifted record for a per-entry `when`. An entry the gate map names | ||
| * carries {@link GatedDependencies}; an entry it omits keeps the child's own | ||
| * dependencies. When the gate map's own type is not precise enough to say | ||
| * which is which, because the call passed explicit `ParentModel` and | ||
| * `ParentMessage` type arguments and so suppressed inference on it, the entry | ||
| * carries both possibilities. | ||
| */ | ||
| type PerEntryGatedLiftedSubscriptions<ParentModel, ParentMessage, Subscriptions, Gates> = { | ||
| readonly [K in keyof Subscriptions]: Subscriptions[K] extends Subscription<any, any, infer Dependencies, infer Services> ? K extends keyof Gates ? undefined extends Gates[K] ? Subscription<ParentModel, ParentMessage, Dependencies | GatedDependencies<Dependencies>, Services> : Subscription<ParentModel, ParentMessage, GatedDependencies<Dependencies>, Services> : Subscription<ParentModel, ParentMessage, Dependencies, Services> : never; | ||
| }; | ||
| /** | ||
| * Lifts a record of child Subscriptions into a parent's Model and Message | ||
@@ -143,8 +190,53 @@ * context, applying a Model accessor and a Message wrapper uniformly to | ||
| * `readDependencies`) matches its source entry's. | ||
| * | ||
| * The optional `when` is the parent's own gate. The parent writes it here on | ||
| * its `lift` call and answers it from the parent Model, which is what makes | ||
| * it useful: it carries the half of a condition the child cannot see, such as | ||
| * the route a page Submodel sits behind. The child neither declares nor sees | ||
| * the gate, and keeps holding its own half in `modelToDependencies`. A gated | ||
| * entry runs only while its gate returns `true`, and a closed gate tears it | ||
| * down. | ||
| * | ||
| * `when` takes either shape: | ||
| * | ||
| * - One predicate gates every entry in the record, for the common case where | ||
| * the whole child answers to one parent condition. | ||
| * - An {@link EntryGates} map gates entries by name, for a child whose | ||
| * Subscriptions answer to different parent conditions. Entries the map | ||
| * omits are lifted ungated. A child never has to organize its records | ||
| * around its parent's gating. | ||
| * | ||
| * Gating rewrites a gated entry's dependencies to {@link GatedDependencies}, | ||
| * so its `readDependencies` returns the last dependencies seen through an | ||
| * open gate. Ungated entries keep the child's dependencies untouched. Passing | ||
| * `ParentModel` and `ParentMessage` explicitly suppresses inference on the | ||
| * gate map, which leaves each named entry's dependencies as either shape; let | ||
| * both infer from an annotated `toChildModel` when you want the exact per | ||
| * entry types. | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * const homeSubscriptions = Subscription.lift(Home.subscriptions)< | ||
| * Model, | ||
| * Message | ||
| * >({ | ||
| * toChildModel: model => model.home, | ||
| * toParentMessage: message => GotHomeMessage({ message }), | ||
| * when: ({ route }) => route._tag === 'Home', | ||
| * }) | ||
| * | ||
| * const roomSubscriptions = Subscription.lift(Room.subscriptions)({ | ||
| * toChildModel: (model: Model) => model.room, | ||
| * toParentMessage: (message: Room.Message.Message): Message => | ||
| * GotRoomMessage({ message }), | ||
| * when: { roomKeyboard: ({ route }) => route._tag === 'Room' }, | ||
| * }) | ||
| * ``` | ||
| */ | ||
| export declare const lift: <Subscriptions extends Readonly<Record<string, Subscription<any, any, any, any>>>>(subscriptions: Subscriptions) => <ParentModel, ParentMessage>(config: { | ||
| readonly toChildModel: (parentModel: ParentModel) => ChildModelOf<Subscriptions>; | ||
| readonly toParentMessage: (message: ChildMessageOf<Subscriptions>) => ParentMessage; | ||
| }) => { readonly [K in keyof Subscriptions]: Subscriptions[K] extends Subscription<any, any, infer Dependencies, infer Services> ? Subscription<ParentModel, ParentMessage, Dependencies, Services> : never; }; | ||
| export declare const lift: <Subscriptions extends Readonly<Record<string, Subscription<any, any, any, any>>>>(subscriptions: Subscriptions) => { | ||
| <ParentModel, ParentMessage>(config: GatedLiftConfig<ParentModel, ParentMessage, Subscriptions>): GatedLiftedSubscriptions<ParentModel, ParentMessage, Subscriptions>; | ||
| <ParentModel, ParentMessage_1, Gates extends EntryGates<ParentModel, Subscriptions> = EntryGates<ParentModel, Subscriptions>>(config: PerEntryGatedLiftConfig<ParentModel, ParentMessage_1, Subscriptions, Gates>): PerEntryGatedLiftedSubscriptions<ParentModel, ParentMessage_1, Subscriptions, Gates>; | ||
| <ParentModel, ParentMessage_2>(config: LiftConfig<ParentModel, ParentMessage_2, Subscriptions>): LiftedSubscriptions<ParentModel, ParentMessage_2, Subscriptions>; | ||
| }; | ||
| export {}; | ||
| //# sourceMappingURL=subscription.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/subscription/subscription.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/subscription/subscription.ts"],"names":[],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| import { Record, Schema, Stream } from 'effect'; | ||
| import { Option, Record, Schema, Stream, pipe } from 'effect'; | ||
| /** | ||
@@ -66,14 +66,16 @@ * Declares a Subscriptions record. The Model, Message, and optional Services | ||
| }); | ||
| /** | ||
| * Lifts a record of child Subscriptions into a parent's Model and Message | ||
| * context, applying a Model accessor and a Message wrapper uniformly to | ||
| * every entry. Per-entry dependency types, schemas, and `keepAliveEquivalence` | ||
| * settings are preserved; each lifted entry's variant (with or without | ||
| * `readDependencies`) matches its source entry's. | ||
| */ | ||
| export const lift = (subscriptions) => (config) => | ||
| /* eslint-disable @typescript-eslint/consistent-type-assertions */ | ||
| Record.map(subscriptions, subscription => { | ||
| const toEntryWhen = (when, key) => { | ||
| if (when === undefined) { | ||
| return Option.none(); | ||
| } | ||
| else if (typeof when === 'function') { | ||
| return Option.some(when); | ||
| } | ||
| else { | ||
| return pipe(Record.get(when, key), Option.flatMap(Option.fromNullishOr)); | ||
| } | ||
| }; | ||
| const toParentStream = (config, stream) => Stream.map(stream, config.toParentMessage); | ||
| const toLiftedEntry = (subscription, config) => { | ||
| const modelToDependencies = (parentModel) => subscription.modelToDependencies(config.toChildModel(parentModel)); | ||
| const wrapStream = (stream) => Stream.map(stream, config.toParentMessage); | ||
| if (subscription.keepAliveEquivalence !== undefined) { | ||
@@ -84,3 +86,3 @@ return { | ||
| keepAliveEquivalence: subscription.keepAliveEquivalence, | ||
| dependenciesToStream: (dependencies, readDependencies) => wrapStream(subscription.dependenciesToStream(dependencies, readDependencies)), | ||
| dependenciesToStream: (dependencies, readDependencies) => toParentStream(config, subscription.dependenciesToStream(dependencies, readDependencies)), | ||
| }; | ||
@@ -91,5 +93,89 @@ } | ||
| modelToDependencies, | ||
| dependenciesToStream: (dependencies) => wrapStream(subscription.dependenciesToStream(dependencies)), | ||
| dependenciesToStream: (dependencies) => toParentStream(config, subscription.dependenciesToStream(dependencies)), | ||
| }; | ||
| }); | ||
| /* eslint-enable @typescript-eslint/consistent-type-assertions */ | ||
| }; | ||
| const toGatedEntry = (subscription, config, when) => { | ||
| const dependenciesSchema = Schema.Struct({ | ||
| maybeDependencies: Schema.Option(subscription.dependenciesSchema), | ||
| }); | ||
| const modelToDependencies = (parentModel) => ({ | ||
| maybeDependencies: pipe(parentModel, Option.liftPredicate(when), Option.map(config.toChildModel), Option.map(subscription.modelToDependencies)), | ||
| }); | ||
| if (subscription.keepAliveEquivalence !== undefined) { | ||
| const maybeKeepAliveEquivalence = Option.makeEquivalence(subscription.keepAliveEquivalence); | ||
| return { | ||
| dependenciesSchema, | ||
| modelToDependencies, | ||
| keepAliveEquivalence: (left, right) => maybeKeepAliveEquivalence(left.maybeDependencies, right.maybeDependencies), | ||
| dependenciesToStream: (gatedDependencies, readGatedDependencies) => Option.match(gatedDependencies.maybeDependencies, { | ||
| onNone: () => Stream.empty, | ||
| onSome: dependencies => toParentStream(config, subscription.dependenciesToStream(dependencies, () => Option.getOrElse(readGatedDependencies().maybeDependencies, () => dependencies))), | ||
| }), | ||
| }; | ||
| } | ||
| return { | ||
| dependenciesSchema, | ||
| modelToDependencies, | ||
| dependenciesToStream: (gatedDependencies) => Option.match(gatedDependencies.maybeDependencies, { | ||
| onNone: () => Stream.empty, | ||
| onSome: dependencies => toParentStream(config, subscription.dependenciesToStream(dependencies)), | ||
| }), | ||
| }; | ||
| }; | ||
| /** | ||
| * Lifts a record of child Subscriptions into a parent's Model and Message | ||
| * context, applying a Model accessor and a Message wrapper uniformly to | ||
| * every entry. Per-entry dependency types, schemas, and `keepAliveEquivalence` | ||
| * settings are preserved; each lifted entry's variant (with or without | ||
| * `readDependencies`) matches its source entry's. | ||
| * | ||
| * The optional `when` is the parent's own gate. The parent writes it here on | ||
| * its `lift` call and answers it from the parent Model, which is what makes | ||
| * it useful: it carries the half of a condition the child cannot see, such as | ||
| * the route a page Submodel sits behind. The child neither declares nor sees | ||
| * the gate, and keeps holding its own half in `modelToDependencies`. A gated | ||
| * entry runs only while its gate returns `true`, and a closed gate tears it | ||
| * down. | ||
| * | ||
| * `when` takes either shape: | ||
| * | ||
| * - One predicate gates every entry in the record, for the common case where | ||
| * the whole child answers to one parent condition. | ||
| * - An {@link EntryGates} map gates entries by name, for a child whose | ||
| * Subscriptions answer to different parent conditions. Entries the map | ||
| * omits are lifted ungated. A child never has to organize its records | ||
| * around its parent's gating. | ||
| * | ||
| * Gating rewrites a gated entry's dependencies to {@link GatedDependencies}, | ||
| * so its `readDependencies` returns the last dependencies seen through an | ||
| * open gate. Ungated entries keep the child's dependencies untouched. Passing | ||
| * `ParentModel` and `ParentMessage` explicitly suppresses inference on the | ||
| * gate map, which leaves each named entry's dependencies as either shape; let | ||
| * both infer from an annotated `toChildModel` when you want the exact per | ||
| * entry types. | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * const homeSubscriptions = Subscription.lift(Home.subscriptions)< | ||
| * Model, | ||
| * Message | ||
| * >({ | ||
| * toChildModel: model => model.home, | ||
| * toParentMessage: message => GotHomeMessage({ message }), | ||
| * when: ({ route }) => route._tag === 'Home', | ||
| * }) | ||
| * | ||
| * const roomSubscriptions = Subscription.lift(Room.subscriptions)({ | ||
| * toChildModel: (model: Model) => model.room, | ||
| * toParentMessage: (message: Room.Message.Message): Message => | ||
| * GotRoomMessage({ message }), | ||
| * when: { roomKeyboard: ({ route }) => route._tag === 'Room' }, | ||
| * }) | ||
| * ``` | ||
| */ | ||
| export const lift = (subscriptions) => (config) => | ||
| /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */ | ||
| Record.map(subscriptions, (subscription, key) => Option.match(toEntryWhen(config.when, key), { | ||
| onNone: () => toLiftedEntry(subscription, config), | ||
| onSome: entryWhen => toGatedEntry(subscription, config, entryWhen), | ||
| })); |
@@ -1,3 +0,3 @@ | ||
| export { combine, foldChild, refresh } from './index.js'; | ||
| export type { Commands, Return, ReturnWithOutMessage, Step, StepWithOutMessage, Refreshable, ChildFold, ChildFoldWithOutMessage, ChildFoldWithParentOutMessage, Fold, FoldWithOutMessage, } from './index.js'; | ||
| export { combine, foldChild, foldChildStep, refresh } from './index.js'; | ||
| export type { Commands, Return, ReturnWithOutMessage, Step, StepWithOutMessage, Refreshable, ChildFold, ChildFoldWithOutMessage, ChildFoldWithParentOutMessage, ChildStepFold, ChildStepFoldWithOutMessage, FoldContext, Fold, FoldWithOutMessage, } from './index.js'; | ||
| //# sourceMappingURL=public.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/update/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAExD,YAAY,EACV,QAAQ,EACR,MAAM,EACN,oBAAoB,EACpB,IAAI,EACJ,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,uBAAuB,EACvB,6BAA6B,EAC7B,IAAI,EACJ,kBAAkB,GACnB,MAAM,YAAY,CAAA"} | ||
| {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/update/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEvE,YAAY,EACV,QAAQ,EACR,MAAM,EACN,oBAAoB,EACpB,IAAI,EACJ,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,uBAAuB,EACvB,6BAA6B,EAC7B,aAAa,EACb,2BAA2B,EAC3B,WAAW,EACX,IAAI,EACJ,kBAAkB,GACnB,MAAM,YAAY,CAAA"} |
@@ -1,1 +0,1 @@ | ||
| export { combine, foldChild, refresh } from './index.js'; | ||
| export { combine, foldChild, foldChildStep, refresh } from './index.js'; |
+113
-3
@@ -122,2 +122,43 @@ import { Option } from 'effect'; | ||
| }>; | ||
| /** The lifters a `foldOutMessage` receives as its second parameter, | ||
| * already bound to the fold config's `toParentMessage`. | ||
| * | ||
| * The fold lifts the Commands the child's `update` returns on its own. | ||
| * This covers the other case: a Command the parent returns on the | ||
| * child's behalf from the OutMessage Step, whose result Message is the | ||
| * child's and therefore still needs wrapping, such as a parent handling | ||
| * a child's `Requested*` fact by returning the child's Command that | ||
| * fulfills it, built with context only the parent holds. | ||
| * | ||
| * The lifters apply the same lift the fold gives the child's own | ||
| * Commands, so the Step writes no `Command.mapMessage` call and keeps | ||
| * no second copy of the wrapper, and the mapping stays recorded on the | ||
| * Command for `Story.Command.resolve` and `Scene.Command.resolve`. | ||
| * | ||
| * The annotated standalone const takes both parameters, so the match | ||
| * moves from `M.type` to `M.value` on the OutMessage: | ||
| * | ||
| * ```ts | ||
| * const foldLoginOutMessage: ( | ||
| * outMessage: Login.OutMessage, | ||
| * context: Update.FoldContext<Login.Message, Message>, | ||
| * ) => Update.Step<Model, Message> = (outMessage, { liftCommand }) => | ||
| * M.value(outMessage).pipe( | ||
| * M.withReturnType<Update.Step<Model, Message>>(), | ||
| * M.tagsExhaustive({ | ||
| * RequestedMagicLink: ({ email }) => model => [ | ||
| * model, | ||
| * [ | ||
| * liftCommand( | ||
| * Login.SendMagicLink({ email, redirectRoute: model.route }), | ||
| * ), | ||
| * ], | ||
| * ], | ||
| * }), | ||
| * ) | ||
| * ``` */ | ||
| export type FoldContext<ChildMessage, ParentMessage> = Readonly<{ | ||
| liftCommand: <E = never, R = never>(command: Command<ChildMessage, E, R>) => Command<ParentMessage, E, R>; | ||
| liftCommands: <E = never, R = never>(commands: ReadonlyArray<Command<ChildMessage, E, R>>) => ReadonlyArray<Command<ParentMessage, E, R>>; | ||
| }>; | ||
| /** {@link ChildFold} for a child whose update returns | ||
@@ -131,3 +172,5 @@ * {@link ReturnWithOutMessage}, adding the fifth capability: | ||
| * (`M.tagsExhaustive`), and build a multi-step fold with | ||
| * {@link combine}. */ | ||
| * {@link combine}. Takes an optional second parameter, a | ||
| * {@link FoldContext} of lifters bound to `toParentMessage`, for a | ||
| * Command the Step returns whose result is the child's Message. */ | ||
| export type ChildFoldWithOutMessage<ParentModel, ParentMessage, ChildModel, Input, ChildMessage, ChildOutMessage, R = never> = Readonly<{ | ||
@@ -138,3 +181,3 @@ update: (childModel: ChildModel, input: Input) => ReturnWithOutMessage<ChildModel, ChildMessage, ChildOutMessage, R>; | ||
| toParentMessage: (message: ChildMessage) => ParentMessage; | ||
| foldOutMessage: (outMessage: ChildOutMessage) => Step<ParentModel, ParentMessage, R>; | ||
| foldOutMessage: (outMessage: ChildOutMessage, context: FoldContext<ChildMessage, ParentMessage>) => Step<ParentModel, ParentMessage, R>; | ||
| }>; | ||
@@ -160,3 +203,3 @@ /** {@link ChildFoldWithOutMessage} for a parent that is itself a | ||
| toParentOutMessage: (outMessage: ChildOutMessage) => Option.Option<ParentOutMessage>; | ||
| foldOutMessage?: (outMessage: ChildOutMessage) => Step<ParentModel, ParentMessage, R>; | ||
| foldOutMessage?: (outMessage: ChildOutMessage, context: FoldContext<ChildMessage, ParentMessage>) => Step<ParentModel, ParentMessage, R>; | ||
| }>; | ||
@@ -209,2 +252,8 @@ /** {@link Step} for an update that also surfaces an OutMessage to its | ||
| * | ||
| * `foldOutMessage` takes an optional second parameter, a | ||
| * {@link FoldContext} carrying `liftCommand` and `liftCommands` bound to | ||
| * this config's `toParentMessage`. Reach for it when the Step returns a | ||
| * Command that produces the child's Message, such as an animating | ||
| * component's overridable leave Command. | ||
| * | ||
| * A parent that is itself a Submodel passes a | ||
@@ -215,2 +264,6 @@ * {@link ChildFoldWithParentOutMessage} and receives a | ||
| * | ||
| * An entry point that takes nothing but the child Model, such as | ||
| * `Dialog.close`, has no input to pass: fold it with | ||
| * {@link foldChildStep}, which returns the {@link Step} directly. | ||
| * | ||
| * `update` closes over per-dispatch context, and the data-last form | ||
@@ -238,2 +291,59 @@ * composes with {@link combine}, here to put a navigation Command ahead | ||
| }; | ||
| /** {@link ChildFold} for an entry point that takes nothing but the child | ||
| * Model, such as `Dialog.close` or a Submodel's `informRouteChanged` that | ||
| * derives everything it needs from its own state. There is no `input`, so | ||
| * {@link foldChildStep} returns the {@link Step} itself rather than a dual | ||
| * {@link Fold}. */ | ||
| export type ChildStepFold<ParentModel, ParentMessage, ChildModel, ChildMessage, R = never> = Readonly<{ | ||
| update: (childModel: ChildModel) => Return<ChildModel, ChildMessage, R>; | ||
| read: (model: ParentModel) => Option.Option<ChildModel>; | ||
| write: (model: ParentModel, nextChildModel: ChildModel) => ParentModel; | ||
| toParentMessage: (message: ChildMessage) => ParentMessage; | ||
| }>; | ||
| /** {@link ChildStepFold} for an entry point whose return carries the child's | ||
| * OutMessage channel, adding `foldOutMessage`. It behaves exactly as it does | ||
| * in {@link ChildFoldWithOutMessage}, down to the optional second parameter, | ||
| * a {@link FoldContext} of lifters bound to `toParentMessage`. */ | ||
| export type ChildStepFoldWithOutMessage<ParentModel, ParentMessage, ChildModel, ChildMessage, ChildOutMessage, R = never> = Readonly<{ | ||
| update: (childModel: ChildModel) => ReturnWithOutMessage<ChildModel, ChildMessage, ChildOutMessage, R>; | ||
| read: (model: ParentModel) => Option.Option<ChildModel>; | ||
| write: (model: ParentModel, nextChildModel: ChildModel) => ParentModel; | ||
| toParentMessage: (message: ChildMessage) => ParentMessage; | ||
| foldOutMessage: (outMessage: ChildOutMessage, context: FoldContext<ChildMessage, ParentMessage>) => Step<ParentModel, ParentMessage, R>; | ||
| }>; | ||
| /** Folds a child entry point that takes nothing but the child Model, and | ||
| * returns the {@link Step} directly. Everything else matches | ||
| * {@link foldChild}: the child is read, updated, and written back, its | ||
| * Commands are lifted through `toParentMessage`, a `None` from `read` makes | ||
| * the Step a no-op, and `foldOutMessage` runs against the Model with the | ||
| * child already written back. | ||
| * | ||
| * Reach for it wherever a Submodel exposes a no-argument entry point, so the | ||
| * call site composes with {@link combine} as a plain Step and never invents | ||
| * an input the child does not take: | ||
| * | ||
| * ```ts | ||
| * const foldMobileMenuDialogClose = Update.foldChildStep({ | ||
| * update: Dialog.close, | ||
| * read: readMobileMenuDialog, | ||
| * write: writeMobileMenuDialog, | ||
| * toParentMessage: toGotMobileMenuDialogMessage, | ||
| * foldOutMessage: foldMobileMenuDialogOutMessage, | ||
| * }) | ||
| * | ||
| * // in the parent update | ||
| * Update.combine(model, [writeRouteFields, foldMobileMenuDialogClose]) | ||
| * ``` | ||
| * | ||
| * `foldOutMessage` takes the same optional second parameter `foldChild`'s | ||
| * does, a {@link FoldContext} carrying `liftCommand` and `liftCommands` bound | ||
| * to this config's `toParentMessage`, for a Command the Step returns whose | ||
| * result is the child's Message. | ||
| * | ||
| * A parent that is itself a Submodel, and so needs its own OutMessage | ||
| * channel on the result, uses {@link foldChild}. */ | ||
| export declare const foldChildStep: { | ||
| <ParentModel, ParentMessage, ChildModel, ChildMessage, ChildOutMessage, R = never>(childFold: ChildStepFoldWithOutMessage<ParentModel, ParentMessage, ChildModel, ChildMessage, ChildOutMessage, R>): Step<ParentModel, ParentMessage, R>; | ||
| <ParentModel, ParentMessage, ChildModel, ChildMessage, R = never>(childFold: ChildStepFold<ParentModel, ParentMessage, ChildModel, ChildMessage, R>): Step<ParentModel, ParentMessage, R>; | ||
| }; | ||
| //# sourceMappingURL=update.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/update/update.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/update/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,EAAQ,MAAM,QAAQ,CAAA;AAEtD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,KAAK,OAAO,EAA2B,MAAM,qBAAqB,CAAA;AAE3E;;;;;;;;;UASU;AACV,MAAM,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,IAAI,aAAa,CACtD,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAC3B,CAAA;AAED;;;;;;;;;UASU;AACV,MAAM,MAAM,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,IAAI,SAAS;IACvD,KAAK;IACL,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;CACrB,CAAA;AAED;;;;yDAIyD;AACzD,MAAM,MAAM,oBAAoB,CAC9B,KAAK,EACL,OAAO,EACP,UAAU,EACV,CAAC,GAAG,KAAK,IACP,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;AAErE;;mEAEmE;AACnE,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,IAAI,CAC5C,KAAK,EAAE,KAAK,KACT,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;UAwBU;AACV,eAAO,MAAM,OAAO,EAAE;IACpB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,EACxB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAC5C,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IAC1B,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,EACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAC5C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;CAa7B,CAAA;AAED;;;;;;;;;;qDAUqD;AACrD,MAAM,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,QAAQ,CAAC;IAClE,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACtD,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACxE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAA;IACrD,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;CACjC,CAAC,CAAA;AAEF;;;;;;;;;;;;;;;UAeU;AACV,eAAO,MAAM,OAAO,GACjB,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,EAC9B,aAAa,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAChD,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAStB,CAAA;AAEL;;;;;;;;;;;;;4EAa4E;AAC5E,MAAM,MAAM,SAAS,CACnB,WAAW,EACX,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,EACZ,CAAC,GAAG,KAAK,IACP,QAAQ,CAAC;IACX,MAAM,EAAE,CACN,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,KACT,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACvD,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,KAAK,WAAW,CAAA;IACtE,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,aAAa,CAAA;CAC1D,CAAC,CAAA;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAoCU;AACV,MAAM,MAAM,WAAW,CAAC,YAAY,EAAE,aAAa,IAAI,QAAQ,CAAC;IAC9D,WAAW,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAChC,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,KACjC,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACjC,YAAY,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EACjC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KACjD,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;CACjD,CAAC,CAAA;AAEF;;;;;;;;;;sEAUsE;AACtE,MAAM,MAAM,uBAAuB,CACjC,WAAW,EACX,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,EACZ,eAAe,EACf,CAAC,GAAG,KAAK,IACP,QAAQ,CAAC;IACX,MAAM,EAAE,CACN,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,KACT,oBAAoB,CAAC,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,CAAA;IACvE,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACvD,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,KAAK,WAAW,CAAA;IACtE,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,aAAa,CAAA;IACzD,cAAc,EAAE,CACd,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC,KAC9C,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;CACzC,CAAC,CAAA;AAEF;;;;;;;;;;;;2DAY2D;AAC3D,MAAM,MAAM,6BAA6B,CACvC,WAAW,EACX,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,CAAC,GAAG,KAAK,IACP,QAAQ,CAAC;IACX,MAAM,EAAE,CACN,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,KACT,oBAAoB,CAAC,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,CAAA;IACvE,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACvD,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,KAAK,WAAW,CAAA;IACtE,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,aAAa,CAAA;IACzD,kBAAkB,EAAE,CAClB,UAAU,EAAE,eAAe,KACxB,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACpC,cAAc,CAAC,EAAE,CACf,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC,KAC9C,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;CACzC,CAAC,CAAA;AAsBF;;aAEa;AACb,MAAM,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,KAAK,IAAI,CACtE,KAAK,EAAE,KAAK,KACT,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;AAExD;;;wBAGwB;AACxB,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI;IAC/D,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;IACzE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;CACpD,CAAA;AAED;;;wDAGwD;AACxD,MAAM,MAAM,kBAAkB,CAC5B,WAAW,EACX,aAAa,EACb,KAAK,EACL,gBAAgB,EAChB,CAAC,GAAG,KAAK,IACP;IACF,CACE,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,KAAK,GACX,oBAAoB,CAAC,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAA;IACxE,CACE,KAAK,EAAE,KAAK,GACX,kBAAkB,CAAC,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAA;CACvE,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAyDU;AACV,eAAO,MAAM,SAAS,EAAE;IACtB,CACE,WAAW,EACX,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,CAAC,GAAG,KAAK,EAET,SAAS,EAAE,6BAA6B,CACtC,WAAW,EACX,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,CAAC,CACF,GACA,kBAAkB,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAA;IAC7E,CACE,WAAW,EACX,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,EACZ,eAAe,EACf,CAAC,GAAG,KAAK,EAET,SAAS,EAAE,uBAAuB,CAChC,WAAW,EACX,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,EACZ,eAAe,EACf,CAAC,CACF,GACA,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IAC7C,CAAC,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,GAAG,KAAK,EACrE,SAAS,EAAE,SAAS,CAClB,WAAW,EACX,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,EACZ,CAAC,CACF,GACA,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;CAO9C,CAAA;AA0DD;;;;oBAIoB;AACpB,MAAM,MAAM,aAAa,CACvB,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,CAAC,GAAG,KAAK,IACP,QAAQ,CAAC;IACX,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IACvE,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACvD,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,KAAK,WAAW,CAAA;IACtE,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,aAAa,CAAA;CAC1D,CAAC,CAAA;AAEF;;;mEAGmE;AACnE,MAAM,MAAM,2BAA2B,CACrC,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,CAAC,GAAG,KAAK,IACP,QAAQ,CAAC;IACX,MAAM,EAAE,CACN,UAAU,EAAE,UAAU,KACnB,oBAAoB,CAAC,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,CAAA;IACvE,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACvD,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,KAAK,WAAW,CAAA;IACtE,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,aAAa,CAAA;IACzD,cAAc,EAAE,CACd,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC,KAC9C,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;CACzC,CAAC,CAAA;AAkBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qDA8BqD;AACrD,eAAO,MAAM,aAAa,EAAE;IAC1B,CACE,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,CAAC,GAAG,KAAK,EAET,SAAS,EAAE,2BAA2B,CACpC,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,CAAC,CACF,GACA,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;IACtC,CAAC,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,GAAG,KAAK,EAC9D,SAAS,EAAE,aAAa,CACtB,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,CAAC,CACF,GACA,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;CAKvC,CAAA"} |
| import { Array, Function, Option, pipe } from 'effect'; | ||
| import { mapMessages } from '../command/index.js'; | ||
| import { mapMessage, mapMessages } from '../command/index.js'; | ||
| /** Composes a list of update steps into one. Each step runs against the | ||
@@ -81,2 +81,8 @@ * Model the previous step produced, and every step's Commands are | ||
| * | ||
| * `foldOutMessage` takes an optional second parameter, a | ||
| * {@link FoldContext} carrying `liftCommand` and `liftCommands` bound to | ||
| * this config's `toParentMessage`. Reach for it when the Step returns a | ||
| * Command that produces the child's Message, such as an animating | ||
| * component's overridable leave Command. | ||
| * | ||
| * A parent that is itself a Submodel passes a | ||
@@ -87,2 +93,6 @@ * {@link ChildFoldWithParentOutMessage} and receives a | ||
| * | ||
| * An entry point that takes nothing but the child Model, such as | ||
| * `Dialog.close`, has no input to pass: fold it with | ||
| * {@link foldChildStep}, which returns the {@link Step} directly. | ||
| * | ||
| * `update` closes over per-dispatch context, and the data-last form | ||
@@ -105,3 +115,11 @@ * composes with {@link combine}, here to put a navigation Command ahead | ||
| * ``` */ | ||
| export const foldChild = (childFold) => Function.dual(2, (model, input) => pipe(model, childFold.read, Option.match({ | ||
| export const foldChild = (childFold) => { | ||
| const context = makeFoldContext(childFold.toParentMessage); | ||
| return Function.dual(2, (model, input) => runChildFold(childFold, context, model, input)); | ||
| }; | ||
| const makeFoldContext = (toParentMessage) => ({ | ||
| liftCommand: command => mapMessage(command, toParentMessage), | ||
| liftCommands: commands => mapMessages(commands, toParentMessage), | ||
| }); | ||
| const runChildFold = (childFold, context, model, input) => pipe(model, childFold.read, Option.match({ | ||
| onNone: () => childFold.toParentOutMessage === undefined | ||
@@ -118,3 +136,3 @@ ? [model, []] | ||
| ? [modelWithChild, mappedCommands] | ||
| : appendOutMessageStep(childFold.foldOutMessage, maybeOutMessage.value, modelWithChild, mappedCommands); | ||
| : appendOutMessageStep(childFold.foldOutMessage, maybeOutMessage.value, context, modelWithChild, mappedCommands); | ||
| if (childFold.toParentOutMessage === undefined) { | ||
@@ -128,6 +146,41 @@ return [nextModel, commands]; | ||
| }, | ||
| }))); | ||
| const appendOutMessageStep = (foldOutMessage, outMessage, modelWithChild, mappedCommands) => { | ||
| const [nextModel, outCommands] = foldOutMessage(outMessage)(modelWithChild); | ||
| })); | ||
| /** Folds a child entry point that takes nothing but the child Model, and | ||
| * returns the {@link Step} directly. Everything else matches | ||
| * {@link foldChild}: the child is read, updated, and written back, its | ||
| * Commands are lifted through `toParentMessage`, a `None` from `read` makes | ||
| * the Step a no-op, and `foldOutMessage` runs against the Model with the | ||
| * child already written back. | ||
| * | ||
| * Reach for it wherever a Submodel exposes a no-argument entry point, so the | ||
| * call site composes with {@link combine} as a plain Step and never invents | ||
| * an input the child does not take: | ||
| * | ||
| * ```ts | ||
| * const foldMobileMenuDialogClose = Update.foldChildStep({ | ||
| * update: Dialog.close, | ||
| * read: readMobileMenuDialog, | ||
| * write: writeMobileMenuDialog, | ||
| * toParentMessage: toGotMobileMenuDialogMessage, | ||
| * foldOutMessage: foldMobileMenuDialogOutMessage, | ||
| * }) | ||
| * | ||
| * // in the parent update | ||
| * Update.combine(model, [writeRouteFields, foldMobileMenuDialogClose]) | ||
| * ``` | ||
| * | ||
| * `foldOutMessage` takes the same optional second parameter `foldChild`'s | ||
| * does, a {@link FoldContext} carrying `liftCommand` and `liftCommands` bound | ||
| * to this config's `toParentMessage`, for a Command the Step returns whose | ||
| * result is the child's Message. | ||
| * | ||
| * A parent that is itself a Submodel, and so needs its own OutMessage | ||
| * channel on the result, uses {@link foldChild}. */ | ||
| export const foldChildStep = (childFold) => { | ||
| const context = makeFoldContext(childFold.toParentMessage); | ||
| return model => runChildFold(childFold, context, model, undefined); | ||
| }; | ||
| const appendOutMessageStep = (foldOutMessage, outMessage, context, modelWithChild, mappedCommands) => { | ||
| const [nextModel, outCommands] = foldOutMessage(outMessage, context)(modelWithChild); | ||
| return [nextModel, [...mappedCommands, ...outCommands]]; | ||
| }; |
+1
-1
| { | ||
| "name": "foldkit", | ||
| "version": "0.141.2", | ||
| "version": "0.142.0", | ||
| "description": "A TypeScript frontend framework, built on Effect and architected like Elm", | ||
@@ -5,0 +5,0 @@ "type": "module", |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
1659503
1.36%28258
1.23%