foldkit 0.100.1 → 0.101.0

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.
Files changed (34) hide show
  1. package/README.md +1 -1
  2. package/dist/devTools/overlay.d.ts.map +1 -1
  3. package/dist/devTools/overlay.js +19 -39
  4. package/dist/runtime/runtime.d.ts +10 -10
  5. package/dist/runtime/runtime.d.ts.map +1 -1
  6. package/dist/runtime/runtime.js +3 -2
  7. package/dist/runtime/subscription.d.ts +139 -19
  8. package/dist/runtime/subscription.d.ts.map +1 -1
  9. package/dist/runtime/subscription.js +90 -9
  10. package/dist/subscription/animationFrame.d.ts +23 -26
  11. package/dist/subscription/animationFrame.d.ts.map +1 -1
  12. package/dist/subscription/animationFrame.js +17 -18
  13. package/dist/subscription/public.d.ts +2 -2
  14. package/dist/subscription/public.d.ts.map +1 -1
  15. package/dist/subscription/public.js +1 -1
  16. package/dist/ui/dragAndDrop/index.d.ts +383 -101
  17. package/dist/ui/dragAndDrop/index.d.ts.map +1 -1
  18. package/dist/ui/dragAndDrop/index.js +19 -24
  19. package/dist/ui/dragAndDrop/public.d.ts +1 -1
  20. package/dist/ui/dragAndDrop/public.d.ts.map +1 -1
  21. package/dist/ui/dragAndDrop/public.js +1 -1
  22. package/dist/ui/slider/index.d.ts +193 -87
  23. package/dist/ui/slider/index.d.ts.map +1 -1
  24. package/dist/ui/slider/index.js +12 -19
  25. package/dist/ui/slider/public.d.ts +1 -1
  26. package/dist/ui/slider/public.d.ts.map +1 -1
  27. package/dist/ui/slider/public.js +1 -1
  28. package/dist/ui/virtualList/index.d.ts +45 -39
  29. package/dist/ui/virtualList/index.d.ts.map +1 -1
  30. package/dist/ui/virtualList/index.js +5 -12
  31. package/dist/ui/virtualList/public.d.ts +1 -1
  32. package/dist/ui/virtualList/public.d.ts.map +1 -1
  33. package/dist/ui/virtualList/public.js +1 -1
  34. package/package.json +1 -1
package/README.md CHANGED
@@ -31,7 +31,7 @@ It's not incremental. There's no React interop, no escape hatch from Effect, no
31
31
 
32
32
  ## Built on Effect
33
33
 
34
- Every Foldkit application is an [Effect](https://effect.website/) program. Your Model is a [Schema](https://effect.website/docs/schema/introduction/). Side effects are values you return, not callbacks you fire — the runtime handles when and how. If you already know Effect, Foldkit feels natural. If you're new to Effect, Foldkit is a great way to immerse yourself in it.
34
+ Every Foldkit application is an [Effect](https://effect.website/) program. Your Model is a [Schema](https://effect.website/docs/schema/introduction/). Side effects are values you return as Commands to the runtime, not callbacks you fire. If you already know Effect, Foldkit feels natural. If you're new to Effect, Foldkit is a great way to immerse yourself in it.
35
35
 
36
36
  ## Coming from React?
37
37
 
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/devTools/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EACP,MAAM,EAGN,OAAO,EAGP,MAAM,EAKN,MAAM,IAAI,CAAC,EAGX,eAAe,EAEhB,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAA;AAa9C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAQ3E,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAElB,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAA;;oFAiakC,CAAC;;;;;;;;;;;;;;AAhItD,cAAM,YAAa,SAAQ,iBAE1B;CAAG;;AAEJ,cAAM,iBAAkB,SAAQ,sBAGC;CAAG;AAEpC,eAAO,MAAM,UAAU;;iBAGsB,CAAA;AAE7C,eAAO,MAAM,YAAY;;iBAGwB,CAAA;AAWjD,eAAO,MAAM,MAAM;;;;wBAUlB,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;wBAIqB,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;;;wBAYzB,CAAA;AAED,eAAO,MAAM,MAAM;;wBASlB,CAAA;AAED,eAAO,MAAM,KAAK;;wBASjB,CAAA;AAED,eAAO,MAAM,WAAW;;6BAYvB,CAAA;AAqsDD,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,UAAU,gBAAgB,EAC1B,MAAM,YAAY,EAClB,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,sCAmEhC,CAAA"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/devTools/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EACP,MAAM,EAGN,OAAO,EAGP,MAAM,EAKN,MAAM,IAAI,CAAC,EAGX,eAAe,EAEhB,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAA;AAa9C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAQ3E,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAElB,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAA;;oFAiasC,CAAC;;;;;;;;;;;;;;AAhI1D,cAAM,YAAa,SAAQ,iBAE1B;CAAG;;AAEJ,cAAM,iBAAkB,SAAQ,sBAGC;CAAG;AAEpC,eAAO,MAAM,UAAU;;iBAGsB,CAAA;AAE7C,eAAO,MAAM,YAAY;;iBAGwB,CAAA;AAWjD,eAAO,MAAM,MAAM;;;;wBAUlB,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;wBAIqB,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;;;wBAYzB,CAAA;AAED,eAAO,MAAM,MAAM;;wBASlB,CAAA;AAED,eAAO,MAAM,KAAK;;wBASjB,CAAA;AAED,eAAO,MAAM,WAAW;;6BAYvB,CAAA;AAwqDD,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,UAAU,gBAAgB,EAC1B,MAAM,YAAY,EAClB,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,sCAmEhC,CAAA"}
@@ -6,7 +6,7 @@ import { OptionExt } from '../effectExtensions/index.js';
6
6
  import { DEVTOOLS_HOST_ID, createKeyedLazy, createLazy, html, } from '../html/index.js';
7
7
  import { m } from '../message/index.js';
8
8
  import { makeProgram } from '../runtime/runtime.js';
9
- import { makeSubscriptions } from '../runtime/subscription.js';
9
+ import * as Subscription from '../runtime/subscription.js';
10
10
  import { evo } from '../struct/index.js';
11
11
  import * as Listbox from '../ui/listbox/public.js';
12
12
  import * as Slider from '../ui/slider/public.js';
@@ -457,47 +457,27 @@ const makeUpdate = (store, shadow, mode) => {
457
457
  }), M.tag('CompletedJump', 'CompletedResume', 'CompletedClear', 'LockedScroll', 'UnlockedScroll', 'ScrolledToTop', () => [model, []]), M.exhaustive);
458
458
  };
459
459
  // SUBSCRIPTION
460
- const ScrubberDragActivity = S.Literals(['Idle', 'Active']);
461
- const SubscriptionDependencies = S.Struct({
462
- storeUpdates: S.Boolean,
463
- mobileBreakpoint: S.Null,
464
- scrubberPointer: S.Struct({
465
- dragActivity: ScrubberDragActivity,
466
- id: S.String,
467
- min: S.Number,
468
- max: S.Number,
469
- }),
470
- scrubberEscape: S.Struct({
471
- dragActivity: ScrubberDragActivity,
472
- }),
473
- });
474
460
  const makeOverlaySubscriptions = (store, shadow) => {
475
461
  const sliderSubscriptions = Slider.subscriptionsForRoot(() => shadow);
476
- return makeSubscriptions(SubscriptionDependencies)({
477
- storeUpdates: {
478
- modelToDependencies: () => true,
479
- dependenciesToStream: () => Stream.concat(Stream.fromEffect(SubscriptionRef.get(store.stateRef).pipe(Effect.map(state => ReceivedStoreUpdate(toDisplayState(state))))), Stream.map(SubscriptionRef.changes(store.stateRef), state => ReceivedStoreUpdate(toDisplayState(state)))),
480
- },
481
- mobileBreakpoint: {
482
- modelToDependencies: () => null,
483
- dependenciesToStream: () => Stream.callback(queue => Effect.acquireRelease(Effect.sync(() => {
484
- const mediaQuery = window.matchMedia(MOBILE_BREAKPOINT_QUERY);
485
- const handler = (event) => {
486
- Queue.offerUnsafe(queue, CrossedMobileBreakpoint({ isMobile: event.matches }));
487
- };
488
- mediaQuery.addEventListener('change', handler);
489
- return { mediaQuery, handler };
490
- }), ({ mediaQuery, handler }) => Effect.sync(() => mediaQuery.removeEventListener('change', handler))).pipe(Effect.flatMap(() => Effect.never))),
491
- },
492
- scrubberPointer: {
493
- modelToDependencies: model => sliderSubscriptions.dragPointer.modelToDependencies(model.scrubberSlider),
494
- dependenciesToStream: (deps, readDeps) => Stream.map(sliderSubscriptions.dragPointer.dependenciesToStream(deps, readDeps), message => GotScrubberSliderMessage({ message })),
495
- },
496
- scrubberEscape: {
497
- modelToDependencies: model => sliderSubscriptions.dragEscape.modelToDependencies(model.scrubberSlider),
498
- dependenciesToStream: (deps, readDeps) => Stream.map(sliderSubscriptions.dragEscape.dependenciesToStream(deps, readDeps), message => GotScrubberSliderMessage({ message })),
499
- },
462
+ const scrubberSubscriptions = Subscription.lift({
463
+ scrubberPointer: sliderSubscriptions.dragPointer,
464
+ scrubberEscape: sliderSubscriptions.dragEscape,
465
+ })({
466
+ toChildModel: model => model.scrubberSlider,
467
+ toParentMessage: message => GotScrubberSliderMessage({ message }),
500
468
  });
469
+ const ownSubscriptions = Subscription.make()(_entry => ({
470
+ storeUpdates: Subscription.persistent(Stream.concat(Stream.fromEffect(SubscriptionRef.get(store.stateRef).pipe(Effect.map(state => ReceivedStoreUpdate(toDisplayState(state))))), Stream.map(SubscriptionRef.changes(store.stateRef), state => ReceivedStoreUpdate(toDisplayState(state))))),
471
+ mobileBreakpoint: Subscription.persistent(Stream.callback(queue => Effect.acquireRelease(Effect.sync(() => {
472
+ const mediaQuery = window.matchMedia(MOBILE_BREAKPOINT_QUERY);
473
+ const handler = (event) => {
474
+ Queue.offerUnsafe(queue, CrossedMobileBreakpoint({ isMobile: event.matches }));
475
+ };
476
+ mediaQuery.addEventListener('change', handler);
477
+ return { mediaQuery, handler };
478
+ }), ({ mediaQuery, handler }) => Effect.sync(() => mediaQuery.removeEventListener('change', handler))).pipe(Effect.flatMap(() => Effect.never)))),
479
+ }));
480
+ return Subscription.aggregate()(ownSubscriptions, scrubberSubscriptions);
501
481
  };
502
482
  // VIEW
503
483
  const indexClass = 'text-2xs text-dt-muted font-mono min-w-5';
@@ -99,14 +99,14 @@ export type CrashConfig<Model, Message> = Readonly<{
99
99
  view?: (context: CrashContext<Model, Message>) => Document;
100
100
  report?: (context: CrashContext<Model, Message>) => void;
101
101
  }>;
102
- type BaseProgramConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never, ManagedResourceServices = never> = Readonly<{
102
+ type BaseProgramConfig<Model, Message, Resources = never, ManagedResourceServices = never> = Readonly<{
103
103
  Model: Schema.Codec<Model, any, unknown, unknown>;
104
104
  update: (model: Model, message: Message) => readonly [
105
105
  Model,
106
106
  ReadonlyArray<Command<Message, never, Resources | ManagedResourceServices>>
107
107
  ];
108
108
  view: (model: Model) => Document;
109
- subscriptions?: Subscriptions<Model, Message, StreamDepsMap, Resources | ManagedResourceServices>;
109
+ subscriptions?: Subscriptions<Model, Message, Resources | ManagedResourceServices>;
110
110
  container: HTMLElement | null;
111
111
  crash?: CrashConfig<Model, Message>;
112
112
  slowView?: SlowViewConfig<Model, Message>;
@@ -116,7 +116,7 @@ type BaseProgramConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schem
116
116
  devTools?: DevToolsConfig;
117
117
  }>;
118
118
  /** Configuration for `makeProgram` with flags and URL routing. */
119
- export type RoutingProgramConfigWithFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags, Resources = never, ManagedResourceServices = never> = BaseProgramConfig<Model, Message, StreamDepsMap, Resources, ManagedResourceServices> & Readonly<{
119
+ export type RoutingProgramConfigWithFlags<Model, Message, Flags, Resources = never, ManagedResourceServices = never> = BaseProgramConfig<Model, Message, Resources, ManagedResourceServices> & Readonly<{
120
120
  Flags: Schema.Codec<Flags, any, unknown, unknown>;
121
121
  flags: Effect.Effect<Flags>;
122
122
  routing: RoutingConfig<Message>;
@@ -126,7 +126,7 @@ export type RoutingProgramConfigWithFlags<Model, Message, StreamDepsMap extends
126
126
  ];
127
127
  }>;
128
128
  /** Configuration for `makeProgram` with URL routing but no flags. */
129
- export type RoutingProgramConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never, ManagedResourceServices = never> = BaseProgramConfig<Model, Message, StreamDepsMap, Resources, ManagedResourceServices> & Readonly<{
129
+ export type RoutingProgramConfig<Model, Message, Resources = never, ManagedResourceServices = never> = BaseProgramConfig<Model, Message, Resources, ManagedResourceServices> & Readonly<{
130
130
  routing: RoutingConfig<Message>;
131
131
  init: (url: Url) => readonly [
132
132
  Model,
@@ -134,7 +134,7 @@ export type RoutingProgramConfig<Model, Message, StreamDepsMap extends Schema.St
134
134
  ];
135
135
  }>;
136
136
  /** Configuration for `makeProgram` with flags but no URL routing. */
137
- export type ProgramConfigWithFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags, Resources = never, ManagedResourceServices = never> = BaseProgramConfig<Model, Message, StreamDepsMap, Resources, ManagedResourceServices> & Readonly<{
137
+ export type ProgramConfigWithFlags<Model, Message, Flags, Resources = never, ManagedResourceServices = never> = BaseProgramConfig<Model, Message, Resources, ManagedResourceServices> & Readonly<{
138
138
  Flags: Schema.Codec<Flags, any, unknown, unknown>;
139
139
  flags: Effect.Effect<Flags>;
140
140
  init: (flags: Flags) => readonly [
@@ -143,7 +143,7 @@ export type ProgramConfigWithFlags<Model, Message, StreamDepsMap extends Schema.
143
143
  ];
144
144
  }>;
145
145
  /** Configuration for `makeProgram` without flags or URL routing. */
146
- export type ProgramConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never, ManagedResourceServices = never> = BaseProgramConfig<Model, Message, StreamDepsMap, Resources, ManagedResourceServices> & Readonly<{
146
+ export type ProgramConfig<Model, Message, Resources = never, ManagedResourceServices = never> = BaseProgramConfig<Model, Message, Resources, ManagedResourceServices> & Readonly<{
147
147
  init: () => readonly [
148
148
  Model,
149
149
  ReadonlyArray<Command<Message, never, Resources | ManagedResourceServices>>
@@ -173,16 +173,16 @@ export type MakeRuntimeReturn = Readonly<{
173
173
  /** Creates a Foldkit program and returns a runtime that can be passed to `run`. Add a `routing` config for URL routing. */
174
174
  export declare function makeProgram<Model, Message extends {
175
175
  _tag: string;
176
- }, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags, Resources = never, ManagedResourceServices = never>(config: RoutingProgramConfigWithFlags<Model, Message, StreamDepsMap, Flags, Resources, ManagedResourceServices>): MakeRuntimeReturn;
176
+ }, Flags, Resources = never, ManagedResourceServices = never>(config: RoutingProgramConfigWithFlags<Model, Message, Flags, Resources, ManagedResourceServices>): MakeRuntimeReturn;
177
177
  export declare function makeProgram<Model, Message extends {
178
178
  _tag: string;
179
- }, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never, ManagedResourceServices = never>(config: RoutingProgramConfig<Model, Message, StreamDepsMap, Resources, ManagedResourceServices>): MakeRuntimeReturn;
179
+ }, Resources = never, ManagedResourceServices = never>(config: RoutingProgramConfig<Model, Message, Resources, ManagedResourceServices>): MakeRuntimeReturn;
180
180
  export declare function makeProgram<Model, Message extends {
181
181
  _tag: string;
182
- }, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags, Resources = never, ManagedResourceServices = never>(config: ProgramConfigWithFlags<Model, Message, StreamDepsMap, Flags, Resources, ManagedResourceServices>): MakeRuntimeReturn;
182
+ }, Flags, Resources = never, ManagedResourceServices = never>(config: ProgramConfigWithFlags<Model, Message, Flags, Resources, ManagedResourceServices>): MakeRuntimeReturn;
183
183
  export declare function makeProgram<Model, Message extends {
184
184
  _tag: string;
185
- }, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never, ManagedResourceServices = never>(config: ProgramConfig<Model, Message, StreamDepsMap, Resources, ManagedResourceServices>): MakeRuntimeReturn;
185
+ }, Resources = never, ManagedResourceServices = never>(config: ProgramConfig<Model, Message, Resources, ManagedResourceServices>): MakeRuntimeReturn;
186
186
  /** Starts a Foldkit runtime, with HMR support for development. */
187
187
  export declare const run: (program: MakeRuntimeReturn) => void;
188
188
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
@@ -385,9 +385,10 @@ const makeRuntime = ({ Model, flags: resolveFlags, init, update, view, subscript
385
385
  yield* Effect.forkDetach(renderLoop);
386
386
  addBfcacheRestoreListener();
387
387
  if (subscriptions) {
388
- yield* pipe(subscriptions, Record.toEntries, Effect.forEach(([_key, { schema, modelToDependencies, equivalence: customEquivalence, dependenciesToStream, },]) => Effect.gen(function* () {
388
+ yield* pipe(subscriptions, Record.toEntries, Effect.forEach(([_key, { dependenciesSchema, modelToDependencies, keepAliveEquivalence, dependenciesToStream, },]) => Effect.gen(function* () {
389
389
  const latestDependenciesRef = yield* Ref.make(modelToDependencies(initModel));
390
- const equivalence = customEquivalence ?? Schema.toEquivalence(schema);
390
+ const equivalence = keepAliveEquivalence ??
391
+ Schema.toEquivalence(dependenciesSchema);
391
392
  const modelStream = Stream.concat(Stream.make(initModel), Stream.fromPubSub(modelPubSub));
392
393
  yield* Effect.forkDetach(modelStream.pipe(
393
394
  // NOTE: Ref.set runs upstream of Stream.changesWith on
@@ -1,23 +1,143 @@
1
- import { type Equivalence, type Schema, type Stream } from 'effect';
2
- type ResolveMessage<T> = T extends Schema.Top ? Schema.Schema.Type<T> : T;
3
- /** A reactive binding between Model state and a long-running stream of Messages. */
4
- export type Subscription<Model, Message, StreamDeps, Resources = never> = {
5
- readonly modelToDependencies: (model: Model) => StreamDeps;
6
- readonly equivalence?: Equivalence.Equivalence<StreamDeps>;
7
- readonly dependenciesToStream: (deps: StreamDeps, readDependencies: () => StreamDeps) => Stream.Stream<ResolveMessage<Message>, never, Resources>;
1
+ import { type Equivalence, Schema, Stream } from 'effect';
2
+ type SubscriptionBrand = {
3
+ readonly __subscription: never;
8
4
  };
9
- type SubscriptionConfig<Model, Message, StreamDeps, Resources = never> = {
10
- readonly schema: Schema.Schema<StreamDeps>;
11
- } & Subscription<Model, Message, StreamDeps, Resources>;
12
- /** A record of named subscription configurations, keyed by dependency field name. */
13
- export type Subscriptions<Model, Message, SubscriptionDependencies extends Schema.Struct<any>, Resources = never> = {
14
- readonly [K in keyof Schema.Schema.Type<SubscriptionDependencies>]: SubscriptionConfig<Model, Message, Schema.Schema.Type<SubscriptionDependencies>[K], Resources>;
5
+ type DependenciesSchema<Dependencies> = Schema.Schema<Dependencies> & {
6
+ readonly fields: Schema.Struct.Fields;
15
7
  };
16
- /** Creates type-safe subscription configurations from a dependency schema. */
17
- export declare const makeSubscriptions: <SubscriptionDependencies extends Schema.Struct<any>>(SubscriptionDependencies: SubscriptionDependencies) => <Model, Message, Resources = never>(configs: { readonly [K in keyof Schema.Schema.Type<SubscriptionDependencies>]: {
18
- readonly modelToDependencies: (model: Model) => Schema.Schema.Type<SubscriptionDependencies>[K];
19
- readonly equivalence?: Equivalence.Equivalence<Schema.Schema.Type<SubscriptionDependencies>[K]> | undefined;
20
- readonly dependenciesToStream: (deps: Schema.Schema.Type<SubscriptionDependencies>[K], readDependencies: () => Schema.Schema.Type<SubscriptionDependencies>[K]) => Stream.Stream<ResolveMessage<Message>, never, Resources>;
21
- }; }) => Subscriptions<Model, Message, SubscriptionDependencies, Resources>;
8
+ type EntryWithoutKeepAlive<Model, Message, Dependencies, Services> = {
9
+ readonly dependenciesSchema: DependenciesSchema<Dependencies>;
10
+ readonly modelToDependencies: (model: Model) => Dependencies;
11
+ readonly keepAliveEquivalence?: never;
12
+ readonly dependenciesToStream: (dependencies: Dependencies) => Stream.Stream<Message, never, Services>;
13
+ };
14
+ type EntryWithKeepAlive<Model, Message, Dependencies, Services> = {
15
+ readonly dependenciesSchema: DependenciesSchema<Dependencies>;
16
+ readonly modelToDependencies: (model: Model) => Dependencies;
17
+ readonly keepAliveEquivalence: Equivalence.Equivalence<Dependencies>;
18
+ readonly dependenciesToStream: (dependencies: Dependencies, readDependencies: () => Dependencies) => Stream.Stream<Message, never, Services>;
19
+ };
20
+ type Entry<Model, Message, Dependencies, Services = never> = EntryWithoutKeepAlive<Model, Message, Dependencies, Services> | EntryWithKeepAlive<Model, Message, Dependencies, Services>;
21
+ /**
22
+ * A single subscription entry produced by `Subscription.make`,
23
+ * `Subscription.lift`, or `Subscription.aggregate`. The brand field is
24
+ * `never`, so application code cannot manually construct a `Subscription`
25
+ * value: it must go through one of those constructors (or a helper like
26
+ * `Subscription.persistent` that returns an entry shape, then through
27
+ * `make`).
28
+ *
29
+ * Two variants by `keepAliveEquivalence` presence:
30
+ *
31
+ * - Without `keepAliveEquivalence` (the common case), every Model change recomputes
32
+ * the dependencies. Equivalent dependencies leave the Stream alone; any
33
+ * change tears it down and restarts. `dependenciesToStream` takes a single
34
+ * argument: the latest dependencies.
35
+ * - With `keepAliveEquivalence` (an escape hatch), Model changes that the
36
+ * equivalence treats as equal leave the Stream running, but the running
37
+ * Stream can still read the latest dependencies via the second
38
+ * `readDependencies` argument. Use this when the Stream needs mid-flight
39
+ * access to data that changes often but shouldn't trigger restarts
40
+ * (Foldkit UI's `Ui.DragAndDrop.autoScroll` reading the latest pointer
41
+ * `clientY` each rAF tick is the canonical example).
42
+ *
43
+ * `dependenciesSchema` must be a `Schema.Struct` so every dependency is
44
+ * explicitly named at the schema level.
45
+ */
46
+ export type Subscription<Model, Message, Dependencies, Services = never> = Entry<Model, Message, Dependencies, Services> & SubscriptionBrand;
47
+ /** A record of named Subscriptions keyed by dependency field name. */
48
+ export type Subscriptions<Model, Message, Services = never> = Readonly<Record<string, Subscription<Model, Message, any, Services>>>;
49
+ /**
50
+ * Callbacks for a subscription entry without `keepAliveEquivalence`. Dependencies
51
+ * are inferred from the field map passed to `entry`.
52
+ */
53
+ type EntryCallbacksWithoutKeepAlive<Model, Message, Dependencies, Services> = {
54
+ readonly modelToDependencies: (model: Model) => Dependencies;
55
+ readonly keepAliveEquivalence?: never;
56
+ readonly dependenciesToStream: (dependencies: Dependencies) => Stream.Stream<Message, never, Services>;
57
+ };
58
+ /**
59
+ * Callbacks for a subscription entry with `keepAliveEquivalence`. Dependencies
60
+ * are inferred from the field map passed to `entry`.
61
+ */
62
+ type EntryCallbacksWithKeepAlive<Model, Message, Dependencies, Services> = {
63
+ readonly modelToDependencies: (model: Model) => Dependencies;
64
+ readonly keepAliveEquivalence: Equivalence.Equivalence<Dependencies>;
65
+ readonly dependenciesToStream: (dependencies: Dependencies, readDependencies: () => Dependencies) => Stream.Stream<Message, never, Services>;
66
+ };
67
+ /**
68
+ * Builds a single subscription entry from a field map and callbacks.
69
+ *
70
+ * The field map is the same shape you would pass to `S.Struct`. Reading the
71
+ * schema as a positional argument (rather than a property on the entry
72
+ * literal) lets TypeScript fully resolve the `Dependencies` type before
73
+ * contextually typing `modelToDependencies` and `dependenciesToStream`, so
74
+ * destructuring patterns like `({ maybeMapHostId })` are inferred correctly
75
+ * even when the field schemas use transforms (e.g. `S.Option`).
76
+ *
77
+ * Two overloads, one per `keepAliveEquivalence` presence:
78
+ *
79
+ * - Without `keepAliveEquivalence`, `dependenciesToStream` takes a single
80
+ * `dependencies` argument.
81
+ * - With `keepAliveEquivalence`, `dependenciesToStream` also receives a
82
+ * `readDependencies` thunk for accessing the latest value while the Stream
83
+ * stays running across Model changes the equivalence accepts as equal.
84
+ */
85
+ export type EntryBuilder<Model, Message, Services> = <const Fields extends Schema.Struct.Fields, Callbacks extends EntryCallbacksWithoutKeepAlive<Model, Message, Schema.Struct.Type<Fields>, Services> | EntryCallbacksWithKeepAlive<Model, Message, Schema.Struct.Type<Fields>, Services>>(fields: Fields, callbacks: Callbacks) => Callbacks extends {
86
+ readonly keepAliveEquivalence: Equivalence.Equivalence<any>;
87
+ } ? EntryWithKeepAlive<Model, Message, Schema.Struct.Type<Fields>, Services> : EntryWithoutKeepAlive<Model, Message, Schema.Struct.Type<Fields>, Services>;
88
+ /**
89
+ * Declares a Subscriptions record. The Model, Message, and optional Services
90
+ * generics are provided up front; the entries record follows, built from
91
+ * calls to the `entry` builder passed into the inner function.
92
+ *
93
+ * Reach for `Subscription.aggregate` to combine multiple records, and
94
+ * `Subscription.lift` to translate a child Submodel's record into a parent
95
+ * context.
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * Subscription.make<Model, Message>()(entry => ({
100
+ * tick: entry(
101
+ * { isRunning: S.Boolean },
102
+ * {
103
+ * modelToDependencies: model => ({ isRunning: model.isRunning }),
104
+ * dependenciesToStream: ({ isRunning }) =>
105
+ * Stream.when(..., Effect.sync(() => isRunning)),
106
+ * },
107
+ * ),
108
+ * }))
109
+ * ```
110
+ */
111
+ export declare const make: <Model, Message, Services = never>() => <Entries extends Readonly<Record<string, Entry<Model, Message, any, Services>>>>(build: (entry: EntryBuilder<Model, Message, Services>) => Entries) => { readonly [K in keyof Entries]: Entries[K] & SubscriptionBrand; };
112
+ /**
113
+ * Combines multiple Subscriptions records into one. Throws on duplicate
114
+ * keys so a misconfigured aggregate fails loudly at startup rather than
115
+ * silently overriding.
116
+ */
117
+ export declare const aggregate: <Model, Message, Services = never>() => (...records: ReadonlyArray<Subscriptions<Model, Message, Services>>) => Subscriptions<Model, Message, Services>;
118
+ /**
119
+ * Wraps a Stream as a Subscription entry whose lifecycle is independent of
120
+ * the Model. The Stream runs for the lifetime of the Subscriptions record;
121
+ * no Model change tears it down or restarts it. Use for any Stream whose
122
+ * work doesn't depend on Model state, such as system theme listeners,
123
+ * viewport width observers, or route-independent timers.
124
+ *
125
+ * Returns an entry shape, not a branded Subscription. Pass it into `make`
126
+ * as an entry value.
127
+ */
128
+ export declare const persistent: <Message, Services = never>(stream: Stream.Stream<Message, never, Services>) => EntryWithoutKeepAlive<unknown, Message, Record<string, never>, Services>;
129
+ type ChildModelOf<ChildSubscriptions> = ChildSubscriptions[keyof ChildSubscriptions] extends Subscription<infer ChildModel, any, any, any> ? ChildModel : never;
130
+ type ChildMessageOf<ChildSubscriptions> = ChildSubscriptions[keyof ChildSubscriptions] extends Subscription<any, infer ChildMessage, any, any> ? ChildMessage : never;
131
+ /**
132
+ * Lifts a record of child Subscriptions into a parent's Model and Message
133
+ * context, applying a Model accessor and a Message wrapper uniformly to
134
+ * every entry. Per-entry dependency types, schemas, and `keepAliveEquivalence`
135
+ * settings are preserved; each lifted entry's variant (with or without
136
+ * `readDependencies`) matches its source entry's.
137
+ */
138
+ export declare const lift: <Subscriptions extends Readonly<Record<string, Subscription<any, any, any, any>>>>(subscriptions: Subscriptions) => <ParentModel, ParentMessage>(config: {
139
+ readonly toChildModel: (parentModel: ParentModel) => ChildModelOf<Subscriptions>;
140
+ readonly toParentMessage: (message: ChildMessageOf<Subscriptions>) => ParentMessage;
141
+ }) => { readonly [K in keyof Subscriptions]: Subscriptions[K] extends Subscription<any, any, infer Dependencies, infer Services> ? Subscription<ParentModel, ParentMessage, Dependencies, Services> : never; };
22
142
  export {};
23
143
  //# sourceMappingURL=subscription.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/runtime/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAU,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE3E,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAEzE,oFAAoF;AACpF,MAAM,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,GAAG,KAAK,IAAI;IACxE,QAAQ,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,UAAU,CAAA;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IAC1D,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,IAAI,EAAE,UAAU,EAChB,gBAAgB,EAAE,MAAM,UAAU,KAC/B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;CAC9D,CAAA;AAED,KAAK,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,GAAG,KAAK,IAAI;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;CAC3C,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAA;AAEvD,qFAAqF;AACrF,MAAM,MAAM,aAAa,CACvB,KAAK,EACL,OAAO,EACP,wBAAwB,SAAS,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EACnD,SAAS,GAAG,KAAK,IACf;IACF,QAAQ,EAAE,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,kBAAkB,CACpF,KAAK,EACL,OAAO,EACP,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,EAC/C,SAAS,CACV;CACF,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,GAC3B,wBAAwB,SAAS,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAClD,0BAA0B,wBAAwB,MAEnD,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,EAC3C,QAAQ,EAAE,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG;IAClE,QAAQ,CAAC,mBAAmB,EAAE,CAC5B,KAAK,EAAE,KAAK,KACT,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAA;IACpD,QAAQ,CAAC,WAAW,CAAC,EACjB,WAAW,CAAC,WAAW,CACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAChD,GACD,SAAS,CAAA;IACb,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,EACrD,gBAAgB,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,KACpE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;CAC9D,GACF,KAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,wBAAwB,EAAE,SAAS,CAelE,CAAA"}
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/runtime/subscription.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,92 @@
1
- import { Record } from 'effect';
2
- /** Creates type-safe subscription configurations from a dependency schema. */
3
- export const makeSubscriptions = (SubscriptionDependencies) => (configs) =>
1
+ import { Record, Schema, Stream } from 'effect';
2
+ /**
3
+ * Declares a Subscriptions record. The Model, Message, and optional Services
4
+ * generics are provided up front; the entries record follows, built from
5
+ * calls to the `entry` builder passed into the inner function.
6
+ *
7
+ * Reach for `Subscription.aggregate` to combine multiple records, and
8
+ * `Subscription.lift` to translate a child Submodel's record into a parent
9
+ * context.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * Subscription.make<Model, Message>()(entry => ({
14
+ * tick: entry(
15
+ * { isRunning: S.Boolean },
16
+ * {
17
+ * modelToDependencies: model => ({ isRunning: model.isRunning }),
18
+ * dependenciesToStream: ({ isRunning }) =>
19
+ * Stream.when(..., Effect.sync(() => isRunning)),
20
+ * },
21
+ * ),
22
+ * }))
23
+ * ```
24
+ */
25
+ export const make = () => (build) => {
26
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
27
+ const entryBuilder = ((fields, callbacks) => ({
28
+ dependenciesSchema: Schema.Struct(fields),
29
+ ...callbacks,
30
+ }));
31
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
32
+ return build(entryBuilder);
33
+ };
34
+ /**
35
+ * Combines multiple Subscriptions records into one. Throws on duplicate
36
+ * keys so a misconfigured aggregate fails loudly at startup rather than
37
+ * silently overriding.
38
+ */
39
+ export const aggregate = () => (...records) => {
40
+ const result = {};
41
+ for (const record of records) {
42
+ for (const key of Object.keys(record)) {
43
+ if (key in result) {
44
+ throw new Error(`Subscription.aggregate: duplicate key "${key}" across records`);
45
+ }
46
+ result[key] = record[key];
47
+ }
48
+ }
49
+ return result;
50
+ };
51
+ /**
52
+ * Wraps a Stream as a Subscription entry whose lifecycle is independent of
53
+ * the Model. The Stream runs for the lifetime of the Subscriptions record;
54
+ * no Model change tears it down or restarts it. Use for any Stream whose
55
+ * work doesn't depend on Model state, such as system theme listeners,
56
+ * viewport width observers, or route-independent timers.
57
+ *
58
+ * Returns an entry shape, not a branded Subscription. Pass it into `make`
59
+ * as an entry value.
60
+ */
61
+ export const persistent = (stream) => ({
62
+ dependenciesSchema: Schema.Struct({}),
63
+ modelToDependencies: () => ({}),
64
+ dependenciesToStream: () => stream,
65
+ });
66
+ /**
67
+ * Lifts a record of child Subscriptions into a parent's Model and Message
68
+ * context, applying a Model accessor and a Message wrapper uniformly to
69
+ * every entry. Per-entry dependency types, schemas, and `keepAliveEquivalence`
70
+ * settings are preserved; each lifted entry's variant (with or without
71
+ * `readDependencies`) matches its source entry's.
72
+ */
73
+ export const lift = (subscriptions) => (config) =>
4
74
  /* eslint-disable @typescript-eslint/consistent-type-assertions */
5
- Record.map(configs, ({ modelToDependencies, equivalence, dependenciesToStream }, key) => ({
6
- schema: SubscriptionDependencies.fields[key],
7
- modelToDependencies,
8
- equivalence,
9
- dependenciesToStream,
10
- }));
75
+ Record.map(subscriptions, subscription => {
76
+ const modelToDependencies = (parentModel) => subscription.modelToDependencies(config.toChildModel(parentModel));
77
+ const wrapStream = (stream) => Stream.map(stream, config.toParentMessage);
78
+ if (subscription.keepAliveEquivalence !== undefined) {
79
+ return {
80
+ dependenciesSchema: subscription.dependenciesSchema,
81
+ modelToDependencies,
82
+ keepAliveEquivalence: subscription.keepAliveEquivalence,
83
+ dependenciesToStream: (dependencies, readDependencies) => wrapStream(subscription.dependenciesToStream(dependencies, readDependencies)),
84
+ };
85
+ }
86
+ return {
87
+ dependenciesSchema: subscription.dependenciesSchema,
88
+ modelToDependencies,
89
+ dependenciesToStream: (dependencies) => wrapStream(subscription.dependenciesToStream(dependencies)),
90
+ };
91
+ });
11
92
  /* eslint-enable @typescript-eslint/consistent-type-assertions */
@@ -1,4 +1,4 @@
1
- import { Stream } from 'effect';
1
+ import { Schema as S, Stream } from 'effect';
2
2
  /**
3
3
  * Configuration for the `animationFrame` Subscription helper.
4
4
  *
@@ -13,41 +13,38 @@ export type AnimationFrameConfig<Model, Message> = Readonly<{
13
13
  toMessage: (deltaTime: number) => Message;
14
14
  }>;
15
15
  /**
16
- * The subscription record returned by `animationFrame`. Shape matches the
17
- * `{ modelToDependencies, dependenciesToStream }` form expected by
18
- * `Subscription.makeSubscriptions` field configs.
19
- */
20
- export type AnimationFrameSubscription<Model, Message> = Readonly<{
21
- modelToDependencies: (model: Model) => boolean;
22
- dependenciesToStream: (isActive: boolean) => Stream.Stream<Message>;
23
- }>;
24
- /**
25
- * Build a Subscription field config that emits a Message on every
16
+ * Build a Subscription that emits a Message on every
26
17
  * `requestAnimationFrame` tick, with the inter-frame delta in milliseconds.
27
18
  *
28
- * Pair with `S.Boolean` in the `SubscriptionDependencies` schema:
29
- *
30
19
  * @example
31
20
  * ```typescript
32
- * const SubscriptionDependencies = S.Struct({
33
- * frame: S.Boolean,
34
- * })
35
- *
36
- * const subscriptions = Subscription.makeSubscriptions(SubscriptionDependencies)<
37
- * Model,
38
- * Message
39
- * >({
21
+ * const subscriptions = Subscription.make<Model, Message>()(_entry => ({
40
22
  * frame: Subscription.animationFrame({
41
23
  * isActive: model => model.isPlaying,
42
24
  * toMessage: deltaTime => Tick({ deltaTime }),
43
25
  * }),
44
- * })
26
+ * }))
45
27
  * ```
46
28
  *
47
29
  * The browser pauses `requestAnimationFrame` when the tab is hidden, so
48
- * `deltaTime` may spike on the first frame after the tab regains focus.
49
- * Clamp it in the update function if your simulation is sensitive to large
50
- * jumps.
30
+ * `deltaTime` may spike to several seconds on the first frame after the
31
+ * tab regains focus. If your `update` function multiplies `deltaTime`
32
+ * against motion or physics, cap it to a reasonable maximum (32ms is
33
+ * typical) before using it. Otherwise a multi-second `deltaTime` can send
34
+ * moving objects flying across the screen in one frame.
35
+ *
36
+ * Returns an entry shape, not a branded Subscription. Pass it into
37
+ * `Subscription.make` as an entry value.
51
38
  */
52
- export declare const animationFrame: <Model, Message>(config: AnimationFrameConfig<Model, Message>) => AnimationFrameSubscription<Model, Message>;
39
+ export declare const animationFrame: <Model, Message>(config: AnimationFrameConfig<Model, Message>) => {
40
+ dependenciesSchema: S.Struct<{
41
+ readonly isActive: S.Boolean;
42
+ }>;
43
+ modelToDependencies: (model: Model) => {
44
+ isActive: boolean;
45
+ };
46
+ dependenciesToStream: ({ isActive }: {
47
+ readonly isActive: boolean;
48
+ }) => Stream.Stream<Message, never, never>;
49
+ };
53
50
  //# sourceMappingURL=animationFrame.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"animationFrame.d.ts","sourceRoot":"","sources":["../../src/subscription/animationFrame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE9C;;;;;;;;GAQG;AACH,MAAM,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IAC1D,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAA;IACnC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;CAC1C,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IAChE,mBAAmB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAA;IAC9C,oBAAoB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;CACpE,CAAC,CAAA;AA2BF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,EAAE,OAAO,EAC3C,QAAQ,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,KAC3C,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAO1C,CAAA"}
1
+ {"version":3,"file":"animationFrame.d.ts","sourceRoot":"","sources":["../../src/subscription/animationFrame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE3D;;;;;;;;GAQG;AACH,MAAM,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IAC1D,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAA;IACnC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;CAC1C,CAAC,CAAA;AA2BF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,EAAE,OAAO,EAC3C,QAAQ,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC;;;;iCAGf,KAAK;;;yCAGG;QAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;KAAE;CAKnE,CAAA"}