foldkit 0.140.1 → 0.141.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -182,24 +182,8 @@ export declare function define<const Name extends string, const Messages extends
182
182
  * see the child's raw Message instead of the wrapped one. Lift result Messages
183
183
  * with {@link mapMessage} / {@link mapMessages}, which record the lift. */
184
184
  export declare const mapEffect: {
185
- <A, E1, R1, B, E2, R2>(f: (effect: Effect.Effect<A, E1, R1>) => Effect.Effect<B, E2, R2>): (command: Readonly<{
186
- name: string;
187
- args?: Record<string, unknown>;
188
- effect: Effect.Effect<A, E1, R1>;
189
- }>) => Readonly<{
190
- name: string;
191
- args?: Record<string, unknown>;
192
- effect: Effect.Effect<B, E2, R2>;
193
- }>;
194
- <A, E1, R1, B, E2, R2>(command: Readonly<{
195
- name: string;
196
- args?: Record<string, unknown>;
197
- effect: Effect.Effect<A, E1, R1>;
198
- }>, f: (effect: Effect.Effect<A, E1, R1>) => Effect.Effect<B, E2, R2>): Readonly<{
199
- name: string;
200
- args?: Record<string, unknown>;
201
- effect: Effect.Effect<B, E2, R2>;
202
- }>;
185
+ <A, E1, R1, B, E2, R2>(f: (effect: Effect.Effect<A, E1, R1>) => Effect.Effect<B, E2, R2>): (command: Command<A, E1, R1>) => Command<B, E2, R2>;
186
+ <A, E1, R1, B, E2, R2>(command: Command<A, E1, R1>, f: (effect: Effect.Effect<A, E1, R1>) => Effect.Effect<B, E2, R2>): Command<B, E2, R2>;
203
187
  };
204
188
  /** Lifts a single Command's result Message through `f`, transforming
205
189
  * `FromMessage` to `ToMessage`. The singular complement to
@@ -217,26 +201,14 @@ export declare const mapEffect: {
217
201
  * Preserves the Command's `name` and `args` so traces still attribute
218
202
  * it to the originating Submodel. When you need to transform the
219
203
  * Effect itself (not just the result Message), reach for
220
- * {@link mapEffect} instead. */
204
+ * {@link mapEffect} instead.
205
+ *
206
+ * Typed against {@link Command} in argument and result positions, so a
207
+ * generic combinator over a type-parameter Message unifies with
208
+ * `Command.Command<Message>` directly. */
221
209
  export declare const mapMessage: {
222
- <FromMessage, ToMessage, E = never, R = never>(command: Readonly<{
223
- name: string;
224
- args?: Record<string, unknown>;
225
- effect: Effect.Effect<FromMessage, E, R>;
226
- }>, f: (message: FromMessage) => ToMessage): Readonly<{
227
- name: string;
228
- args?: Record<string, unknown>;
229
- effect: Effect.Effect<ToMessage, E, R>;
230
- }>;
231
- <FromMessage, ToMessage>(f: (message: FromMessage) => ToMessage): <E = never, R = never>(command: Readonly<{
232
- name: string;
233
- args?: Record<string, unknown>;
234
- effect: Effect.Effect<FromMessage, E, R>;
235
- }>) => Readonly<{
236
- name: string;
237
- args?: Record<string, unknown>;
238
- effect: Effect.Effect<ToMessage, E, R>;
239
- }>;
210
+ <FromMessage, ToMessage, E = never, R = never>(command: Command<FromMessage, E, R>, f: (message: FromMessage) => ToMessage): Command<ToMessage, E, R>;
211
+ <FromMessage, ToMessage>(f: (message: FromMessage) => ToMessage): <E = never, R = never>(command: Command<FromMessage, E, R>) => Command<ToMessage, E, R>;
240
212
  };
241
213
  /** Lifts every Command in a list through `f`, transforming the result
242
214
  * Message type from `FromMessage` to `ToMessage`. Reach for this at the
@@ -261,25 +233,13 @@ export declare const mapMessage: {
261
233
  * from the matched Command.
262
234
  * Preserves each Command's `name` and `args` so traces still attribute the
263
235
  * Command to the originating Submodel. When you need to transform the Effect
264
- * itself (not just the result Message), reach for {@link mapEffect} instead. */
236
+ * itself (not just the result Message), reach for {@link mapEffect} instead.
237
+ *
238
+ * Typed against {@link Command} in argument and result positions, so a
239
+ * generic combinator over a type-parameter Message unifies with
240
+ * `Command.Command<Message>` directly. */
265
241
  export declare const mapMessages: {
266
- <FromMessage, ToMessage, E = never, R = never>(commands: ReadonlyArray<Readonly<{
267
- name: string;
268
- args?: Record<string, unknown>;
269
- effect: Effect.Effect<FromMessage, E, R>;
270
- }>>, f: (message: FromMessage) => ToMessage): ReadonlyArray<Readonly<{
271
- name: string;
272
- args?: Record<string, unknown>;
273
- effect: Effect.Effect<ToMessage, E, R>;
274
- }>>;
275
- <FromMessage, ToMessage>(f: (message: FromMessage) => ToMessage): <E = never, R = never>(commands: ReadonlyArray<Readonly<{
276
- name: string;
277
- args?: Record<string, unknown>;
278
- effect: Effect.Effect<FromMessage, E, R>;
279
- }>>) => ReadonlyArray<Readonly<{
280
- name: string;
281
- args?: Record<string, unknown>;
282
- effect: Effect.Effect<ToMessage, E, R>;
283
- }>>;
242
+ <FromMessage, ToMessage, E = never, R = never>(commands: ReadonlyArray<Command<FromMessage, E, R>>, f: (message: FromMessage) => ToMessage): ReadonlyArray<Command<ToMessage, E, R>>;
243
+ <FromMessage, ToMessage>(f: (message: FromMessage) => ToMessage): <E = never, R = never>(commands: ReadonlyArray<Command<FromMessage, E, R>>) => ReadonlyArray<Command<ToMessage, E, R>>;
284
244
  };
285
245
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":"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"}
@@ -113,7 +113,11 @@ export const mapEffect = Function.dual(2, (command, f) => ({ ...command, effect:
113
113
  * Preserves the Command's `name` and `args` so traces still attribute
114
114
  * it to the originating Submodel. When you need to transform the
115
115
  * Effect itself (not just the result Message), reach for
116
- * {@link mapEffect} instead. */
116
+ * {@link mapEffect} instead.
117
+ *
118
+ * Typed against {@link Command} in argument and result positions, so a
119
+ * generic combinator over a type-parameter Message unifies with
120
+ * `Command.Command<Message>` directly. */
117
121
  export const mapMessage = Function.dual(2, (command, f) => {
118
122
  /* eslint-disable @typescript-eslint/consistent-type-assertions */
119
123
  const withMappers = command;
@@ -147,5 +151,9 @@ export const mapMessage = Function.dual(2, (command, f) => {
147
151
  * from the matched Command.
148
152
  * Preserves each Command's `name` and `args` so traces still attribute the
149
153
  * Command to the originating Submodel. When you need to transform the Effect
150
- * itself (not just the result Message), reach for {@link mapEffect} instead. */
154
+ * itself (not just the result Message), reach for {@link mapEffect} instead.
155
+ *
156
+ * Typed against {@link Command} in argument and result positions, so a
157
+ * generic combinator over a type-parameter Message unifies with
158
+ * `Command.Command<Message>` directly. */
151
159
  export const mapMessages = Function.dual(2, (commands, f) => Array.map(commands, command => mapMessage(command, f)));
@@ -18,13 +18,28 @@ import { type VNode } from '../vdom.js';
18
18
  * DOM nodes. If the same content needs to appear in multiple positions,
19
19
  * create one slot per position. */
20
20
  export declare const createLazy: () => (<Args extends ReadonlyArray<unknown>>(fn: (...args: Args) => VNode | null, args: Args) => VNode | null);
21
- /** Creates a keyed memoization map for view functions rendered in a loop. Each
22
- * key gets its own independent cache slot. On each render, only entries whose
23
- * function reference, dispatch, or arguments have changed by reference are
24
- * recomputed.
21
+ /** Creates a keyed memoization map for one view function rendered under many
22
+ * keys. Each key gets its own independent cache slot, compared exactly the way
23
+ * `createLazy` compares its single slot: on each render, only the keys whose
24
+ * function reference, dispatch, or arguments changed by reference are
25
+ * recomputed. For example: a list rendering one row view per item, a detail
26
+ * view rendering one entity per route, or one view function rendered at two
27
+ * call sites.
28
+ *
29
+ * Key by the identifier that already gives the rendered thing its DOM
30
+ * identity. A row keyed `todo.id` through `h.keyed` memoizes under `todo.id`;
31
+ * a detail page keyed `post.slug` memoizes under `post.slug`. Reusing that one
32
+ * identifier keeps the memo and the DOM invalidating together.
33
+ *
34
+ * Entries are never evicted, so keys are expected to be bounded, such as an
35
+ * entity registry, a route table, or a fixed set of call sites. A key drawn
36
+ * from something unbounded, such as a search query or a paged cursor, grows
37
+ * the map for the lifetime of the page. If that becomes the shape an app
38
+ * needs, the upgrade path is a variant that drops keys absent from the latest
39
+ * render pass, not a cap on this one.
25
40
  *
26
41
  * Like `createLazy`, each key's cached VNode must be rendered at a single
27
- * position in the tree. If the same item needs to appear in multiple
28
- * positions, create one keyed lazy per position. */
42
+ * position in the tree. If the same content needs to appear in multiple
43
+ * positions, give each position its own key. */
29
44
  export declare const createKeyedLazy: () => (<Args extends ReadonlyArray<unknown>>(key: PropertyKey, fn: (...args: Args) => VNode | null, args: Args) => VNode | null);
30
45
  //# sourceMappingURL=lazy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/html/lazy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAwC,MAAM,YAAY,CAAA;AAmF7E;;;;;;;;;;;;;;;;;oCAiBoC;AACpC,eAAO,MAAM,UAAU,QAAO,CAAC,CAAC,IAAI,SAAS,aAAa,CAAC,OAAO,CAAC,EACjE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,KAAK,GAAG,IAAI,EACnC,IAAI,EAAE,IAAI,KACP,KAAK,GAAG,IAAI,CAUhB,CAAA;AAED;;;;;;;qDAOqD;AACrD,eAAO,MAAM,eAAe,QAAO,CAAC,CAAC,IAAI,SAAS,aAAa,CAAC,OAAO,CAAC,EACtE,GAAG,EAAE,WAAW,EAChB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,KAAK,GAAG,IAAI,EACnC,IAAI,EAAE,IAAI,KACP,KAAK,GAAG,IAAI,CAWhB,CAAA"}
1
+ {"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/html/lazy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAwC,MAAM,YAAY,CAAA;AAmF7E;;;;;;;;;;;;;;;;;oCAiBoC;AACpC,eAAO,MAAM,UAAU,QAAO,CAAC,CAAC,IAAI,SAAS,aAAa,CAAC,OAAO,CAAC,EACjE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,KAAK,GAAG,IAAI,EACnC,IAAI,EAAE,IAAI,KACP,KAAK,GAAG,IAAI,CAUhB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;iDAsBiD;AACjD,eAAO,MAAM,eAAe,QAAO,CAAC,CAAC,IAAI,SAAS,aAAa,CAAC,OAAO,CAAC,EACtE,GAAG,EAAE,WAAW,EAChB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,KAAK,GAAG,IAAI,EACnC,IAAI,EAAE,IAAI,KACP,KAAK,GAAG,IAAI,CAWhB,CAAA"}
package/dist/html/lazy.js CHANGED
@@ -72,14 +72,29 @@ export const createLazy = () => {
72
72
  cached = entry;
73
73
  });
74
74
  };
75
- /** Creates a keyed memoization map for view functions rendered in a loop. Each
76
- * key gets its own independent cache slot. On each render, only entries whose
77
- * function reference, dispatch, or arguments have changed by reference are
78
- * recomputed.
75
+ /** Creates a keyed memoization map for one view function rendered under many
76
+ * keys. Each key gets its own independent cache slot, compared exactly the way
77
+ * `createLazy` compares its single slot: on each render, only the keys whose
78
+ * function reference, dispatch, or arguments changed by reference are
79
+ * recomputed. For example: a list rendering one row view per item, a detail
80
+ * view rendering one entity per route, or one view function rendered at two
81
+ * call sites.
82
+ *
83
+ * Key by the identifier that already gives the rendered thing its DOM
84
+ * identity. A row keyed `todo.id` through `h.keyed` memoizes under `todo.id`;
85
+ * a detail page keyed `post.slug` memoizes under `post.slug`. Reusing that one
86
+ * identifier keeps the memo and the DOM invalidating together.
87
+ *
88
+ * Entries are never evicted, so keys are expected to be bounded, such as an
89
+ * entity registry, a route table, or a fixed set of call sites. A key drawn
90
+ * from something unbounded, such as a search query or a paged cursor, grows
91
+ * the map for the lifetime of the page. If that becomes the shape an app
92
+ * needs, the upgrade path is a variant that drops keys absent from the latest
93
+ * render pass, not a cap on this one.
79
94
  *
80
95
  * Like `createLazy`, each key's cached VNode must be rendered at a single
81
- * position in the tree. If the same item needs to appear in multiple
82
- * positions, create one keyed lazy per position. */
96
+ * position in the tree. If the same content needs to appear in multiple
97
+ * positions, give each position its own key. */
83
98
  export const createKeyedLazy = () => {
84
99
  const cache = new Map();
85
100
  return (key, fn, args) => resolveOrCache(cache.get(key), fn, args, entry => {
@@ -1,3 +1,3 @@
1
- export { combine, refresh } from './index.js';
2
- export type { Commands, Return, ReturnWithOutMessage, Step, Refreshable, } from './index.js';
1
+ export { combine, foldChild, refresh } from './index.js';
2
+ export type { Commands, Return, ReturnWithOutMessage, Step, StepWithOutMessage, Refreshable, ChildFold, ChildFoldWithOutMessage, ChildFoldWithParentOutMessage, Fold, FoldWithOutMessage, } from './index.js';
3
3
  //# sourceMappingURL=public.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/update/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE7C,YAAY,EACV,QAAQ,EACR,MAAM,EACN,oBAAoB,EACpB,IAAI,EACJ,WAAW,GACZ,MAAM,YAAY,CAAA"}
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"}
@@ -1 +1 @@
1
- export { combine, refresh } from './index.js';
1
+ export { combine, foldChild, refresh } from './index.js';
@@ -99,4 +99,134 @@ export type Refreshable<Model, Message, A, E, R = never> = Readonly<{
99
99
  * })
100
100
  * ``` */
101
101
  export declare const refresh: <Model, Message, A, E, R = never>(refreshable: Refreshable<Model, Message, A, E, R>) => Step<Model, Message, R>;
102
+ /** The four capabilities that fold one child Submodel's update into the
103
+ * parent, for a child without an OutMessage channel.
104
+ *
105
+ * - `update`: the child update function to run.
106
+ * - `read`: the getter half of the lens onto the child: reads the child
107
+ * Model from the parent Model. Returns an `Option` because a child
108
+ * may not be mounted (for example a page behind a route or a keyed
109
+ * collection miss); a single always-present field wraps in
110
+ * `Option.some`.
111
+ * - `write`: the setter half of the lens: writes the updated child
112
+ * Model back into the parent Model.
113
+ * - `toParentMessage`: lifts a child Message into the parent's Message,
114
+ * the same contract `h.submodel` takes for the view half. Always the
115
+ * child's `Got*` wrapper: `message => GotSearchMessage({ message })`. */
116
+ export type ChildFold<ParentModel, ParentMessage, ChildModel, Input, ChildMessage, R = never> = Readonly<{
117
+ update: (childModel: ChildModel, input: Input) => Return<ChildModel, ChildMessage, R>;
118
+ read: (model: ParentModel) => Option.Option<ChildModel>;
119
+ write: (model: ParentModel, nextChildModel: ChildModel) => ParentModel;
120
+ toParentMessage: (message: ChildMessage) => ParentMessage;
121
+ }>;
122
+ /** {@link ChildFold} for a child whose update returns
123
+ * {@link ReturnWithOutMessage}, adding the fifth capability:
124
+ *
125
+ * - `foldOutMessage`: folds the child's OutMessage into the parent as a
126
+ * {@link Step}. The Step receives the parent Model with the child
127
+ * already written back, and its Commands follow the child's in the
128
+ * returned batch. Match on the OutMessage tag inside
129
+ * (`M.tagsExhaustive`), and build a multi-step fold with
130
+ * {@link combine}. */
131
+ export type ChildFoldWithOutMessage<ParentModel, ParentMessage, ChildModel, Input, ChildMessage, ChildOutMessage, R = never> = Readonly<{
132
+ update: (childModel: ChildModel, input: Input) => ReturnWithOutMessage<ChildModel, ChildMessage, ChildOutMessage, R>;
133
+ read: (model: ParentModel) => Option.Option<ChildModel>;
134
+ write: (model: ParentModel, nextChildModel: ChildModel) => ParentModel;
135
+ toParentMessage: (message: ChildMessage) => ParentMessage;
136
+ foldOutMessage: (outMessage: ChildOutMessage) => Step<ParentModel, ParentMessage, R>;
137
+ }>;
138
+ /** {@link ChildFoldWithOutMessage} for a parent that is itself a
139
+ * Submodel, so the fold's result carries the parent's own OutMessage
140
+ * channel as a third tuple element. Adds:
141
+ *
142
+ * - `toParentOutMessage`: lifts the child's OutMessage into the
143
+ * parent's own OutMessage; `None` passes nothing upward. When the
144
+ * child returns no OutMessage the fold's third element is `None`.
145
+ * - `foldOutMessage` stays available for a parent that also updates
146
+ * its own state from the child's OutMessage, and is optional here.
147
+ *
148
+ * A parent Submodel embedding a child with no OutMessage channel needs
149
+ * no config at all: spread the plain fold into its return,
150
+ * `[...foldStartDate(model, message), Option.none()]`. */
151
+ export type ChildFoldWithParentOutMessage<ParentModel, ParentMessage, ChildModel, Input, ChildMessage, ChildOutMessage, ParentOutMessage, R = never> = Readonly<{
152
+ update: (childModel: ChildModel, input: Input) => ReturnWithOutMessage<ChildModel, ChildMessage, ChildOutMessage, R>;
153
+ read: (model: ParentModel) => Option.Option<ChildModel>;
154
+ write: (model: ParentModel, nextChildModel: ChildModel) => ParentModel;
155
+ toParentMessage: (message: ChildMessage) => ParentMessage;
156
+ toParentOutMessage: (outMessage: ChildOutMessage) => Option.Option<ParentOutMessage>;
157
+ foldOutMessage?: (outMessage: ChildOutMessage) => Step<ParentModel, ParentMessage, R>;
158
+ }>;
159
+ /** {@link Step} for an update that also surfaces an OutMessage to its
160
+ * parent: maps a Model to a {@link ReturnWithOutMessage} over the same
161
+ * Model. */
162
+ export type StepWithOutMessage<Model, Message, OutMessage, R = never> = (model: Model) => ReturnWithOutMessage<Model, Message, OutMessage, R>;
163
+ /** The dual function {@link foldChild} returns. Data-first runs the
164
+ * fold now (`fold(model, input)` returns a {@link Return}); data-last
165
+ * builds a composable {@link Step} (`fold(input)`, for
166
+ * {@link combine}). */
167
+ export type Fold<ParentModel, ParentMessage, Input, R = never> = {
168
+ (model: ParentModel, input: Input): Return<ParentModel, ParentMessage, R>;
169
+ (input: Input): Step<ParentModel, ParentMessage, R>;
170
+ };
171
+ /** {@link Fold} for a {@link ChildFoldWithParentOutMessage}: the
172
+ * data-first form returns a {@link ReturnWithOutMessage} and the
173
+ * data-last form builds a {@link StepWithOutMessage}, so the fold slots
174
+ * directly into a parent that is itself a Submodel. */
175
+ export type FoldWithOutMessage<ParentModel, ParentMessage, Input, ParentOutMessage, R = never> = {
176
+ (model: ParentModel, input: Input): ReturnWithOutMessage<ParentModel, ParentMessage, ParentOutMessage, R>;
177
+ (input: Input): StepWithOutMessage<ParentModel, ParentMessage, ParentOutMessage, R>;
178
+ };
179
+ /** Folds a child Submodel's update into the parent: the update half of
180
+ * embedding a child, complementing `h.submodel` on the view half. Give
181
+ * it the facts that vary per child (a {@link ChildFold}, or a
182
+ * {@link ChildFoldWithOutMessage} when the child's update returns
183
+ * OutMessages) and it returns a dual {@link Fold}:
184
+ *
185
+ * ```ts
186
+ * const foldSearch = Update.foldChild({
187
+ * update: Search.update,
188
+ * read: (model: Model) => Option.some(model.search),
189
+ * write: (model, nextSearch) => evo(model, { search: () => nextSearch }),
190
+ * toParentMessage: message => GotSearchMessage({ message }),
191
+ * })
192
+ *
193
+ * // in the parent update
194
+ * GotSearchMessage: ({ message }) => foldSearch(model, message),
195
+ * ```
196
+ *
197
+ * The fold runs `update` against the child Model `read` returns, writes
198
+ * the child back, and lifts the child's Commands through
199
+ * `toParentMessage`. When `read` returns `None` the fold returns
200
+ * `[model, []]`: a Message for an unmounted child is a no-op. When the
201
+ * child's update returns an OutMessage, `foldOutMessage` runs against
202
+ * the Model with the child already written back, and its Commands
203
+ * follow the child's in the returned batch.
204
+ *
205
+ * A parent that is itself a Submodel passes a
206
+ * {@link ChildFoldWithParentOutMessage} and receives a
207
+ * {@link FoldWithOutMessage}, whose results carry the parent's own
208
+ * OutMessage channel as a third element.
209
+ *
210
+ * `update` closes over per-dispatch context, and the data-last form
211
+ * composes with {@link combine}, here to put a navigation Command ahead
212
+ * of the child's:
213
+ *
214
+ * ```ts
215
+ * const enterJoinedRoom = (roomId: string, player: Player): UpdateStep =>
216
+ * Update.combine([
217
+ * model => [model, [NavigateToRoom({ roomId })]],
218
+ * Update.foldChild({
219
+ * update: (room: Room.Model, joinedPlayer: Player) =>
220
+ * Room.informJoined(room, joinedPlayer, { roomId }),
221
+ * read: readRoom,
222
+ * write: writeRoom,
223
+ * toParentMessage: toGotRoomMessage,
224
+ * })(player),
225
+ * ])
226
+ * ``` */
227
+ export declare const foldChild: {
228
+ <ParentModel, ParentMessage, ChildModel, Input, ChildMessage, ChildOutMessage, ParentOutMessage, R = never>(childFold: ChildFoldWithParentOutMessage<ParentModel, ParentMessage, ChildModel, Input, ChildMessage, ChildOutMessage, ParentOutMessage, R>): FoldWithOutMessage<ParentModel, ParentMessage, Input, ParentOutMessage, R>;
229
+ <ParentModel, ParentMessage, ChildModel, Input, ChildMessage, ChildOutMessage, R = never>(childFold: ChildFoldWithOutMessage<ParentModel, ParentMessage, ChildModel, Input, ChildMessage, ChildOutMessage, R>): Fold<ParentModel, ParentMessage, Input, R>;
230
+ <ParentModel, ParentMessage, ChildModel, Input, ChildMessage, R = never>(childFold: ChildFold<ParentModel, ParentMessage, ChildModel, Input, ChildMessage, R>): Fold<ParentModel, ParentMessage, Input, R>;
231
+ };
102
232
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"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,EAAE,MAAM,qBAAqB,CAAA;AAElD;;;;;;;;;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"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/update/update.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Array, Function, Option, pipe } from 'effect';
2
+ import { mapMessages } from '../command/index.js';
2
3
  /** Composes a list of update steps into one. Each step runs against the
3
4
  * Model the previous step produced, and every step's Commands are
4
5
  * concatenated into a single batch, in step order.
@@ -51,3 +52,77 @@ export const refresh = (refreshable) => model => pipe(refreshable.read(model), O
51
52
  onNone: () => [model, []],
52
53
  onSome: next => [refreshable.write(model, next), [refreshable.load]],
53
54
  }));
55
+ /** Folds a child Submodel's update into the parent: the update half of
56
+ * embedding a child, complementing `h.submodel` on the view half. Give
57
+ * it the facts that vary per child (a {@link ChildFold}, or a
58
+ * {@link ChildFoldWithOutMessage} when the child's update returns
59
+ * OutMessages) and it returns a dual {@link Fold}:
60
+ *
61
+ * ```ts
62
+ * const foldSearch = Update.foldChild({
63
+ * update: Search.update,
64
+ * read: (model: Model) => Option.some(model.search),
65
+ * write: (model, nextSearch) => evo(model, { search: () => nextSearch }),
66
+ * toParentMessage: message => GotSearchMessage({ message }),
67
+ * })
68
+ *
69
+ * // in the parent update
70
+ * GotSearchMessage: ({ message }) => foldSearch(model, message),
71
+ * ```
72
+ *
73
+ * The fold runs `update` against the child Model `read` returns, writes
74
+ * the child back, and lifts the child's Commands through
75
+ * `toParentMessage`. When `read` returns `None` the fold returns
76
+ * `[model, []]`: a Message for an unmounted child is a no-op. When the
77
+ * child's update returns an OutMessage, `foldOutMessage` runs against
78
+ * the Model with the child already written back, and its Commands
79
+ * follow the child's in the returned batch.
80
+ *
81
+ * A parent that is itself a Submodel passes a
82
+ * {@link ChildFoldWithParentOutMessage} and receives a
83
+ * {@link FoldWithOutMessage}, whose results carry the parent's own
84
+ * OutMessage channel as a third element.
85
+ *
86
+ * `update` closes over per-dispatch context, and the data-last form
87
+ * composes with {@link combine}, here to put a navigation Command ahead
88
+ * of the child's:
89
+ *
90
+ * ```ts
91
+ * const enterJoinedRoom = (roomId: string, player: Player): UpdateStep =>
92
+ * Update.combine([
93
+ * model => [model, [NavigateToRoom({ roomId })]],
94
+ * Update.foldChild({
95
+ * update: (room: Room.Model, joinedPlayer: Player) =>
96
+ * Room.informJoined(room, joinedPlayer, { roomId }),
97
+ * read: readRoom,
98
+ * write: writeRoom,
99
+ * toParentMessage: toGotRoomMessage,
100
+ * })(player),
101
+ * ])
102
+ * ``` */
103
+ export const foldChild = (childFold) => Function.dual(2, (model, input) => pipe(model, childFold.read, Option.match({
104
+ onNone: () => childFold.toParentOutMessage === undefined
105
+ ? [model, []]
106
+ : [model, [], Option.none()],
107
+ onSome: childModel => {
108
+ const [nextChildModel, childCommands, maybeOutMessage] = childFold.update(childModel, input);
109
+ const modelWithChild = childFold.write(model, nextChildModel);
110
+ const mappedCommands = mapMessages(childCommands, childFold.toParentMessage);
111
+ const [nextModel, commands] = childFold.foldOutMessage === undefined ||
112
+ maybeOutMessage === undefined ||
113
+ Option.isNone(maybeOutMessage)
114
+ ? [modelWithChild, mappedCommands]
115
+ : appendOutMessageStep(childFold.foldOutMessage, maybeOutMessage.value, modelWithChild, mappedCommands);
116
+ if (childFold.toParentOutMessage === undefined) {
117
+ return [nextModel, commands];
118
+ }
119
+ const maybeParentOutMessage = maybeOutMessage === undefined
120
+ ? Option.none()
121
+ : Option.flatMap(maybeOutMessage, childFold.toParentOutMessage);
122
+ return [nextModel, commands, maybeParentOutMessage];
123
+ },
124
+ })));
125
+ const appendOutMessageStep = (foldOutMessage, outMessage, modelWithChild, mappedCommands) => {
126
+ const [nextModel, outCommands] = foldOutMessage(outMessage)(modelWithChild);
127
+ return [nextModel, [...mappedCommands, ...outCommands]];
128
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foldkit",
3
- "version": "0.140.1",
3
+ "version": "0.141.1",
4
4
  "description": "A TypeScript frontend framework, built on Effect and architected like Elm",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",