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.
- package/README.md +1 -1
- package/dist/devTools/overlay.d.ts.map +1 -1
- package/dist/devTools/overlay.js +19 -39
- package/dist/runtime/runtime.d.ts +10 -10
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +3 -2
- package/dist/runtime/subscription.d.ts +139 -19
- package/dist/runtime/subscription.d.ts.map +1 -1
- package/dist/runtime/subscription.js +90 -9
- package/dist/subscription/animationFrame.d.ts +23 -26
- package/dist/subscription/animationFrame.d.ts.map +1 -1
- package/dist/subscription/animationFrame.js +17 -18
- package/dist/subscription/public.d.ts +2 -2
- package/dist/subscription/public.d.ts.map +1 -1
- package/dist/subscription/public.js +1 -1
- package/dist/ui/dragAndDrop/index.d.ts +383 -101
- package/dist/ui/dragAndDrop/index.d.ts.map +1 -1
- package/dist/ui/dragAndDrop/index.js +19 -24
- package/dist/ui/dragAndDrop/public.d.ts +1 -1
- package/dist/ui/dragAndDrop/public.d.ts.map +1 -1
- package/dist/ui/dragAndDrop/public.js +1 -1
- package/dist/ui/slider/index.d.ts +193 -87
- package/dist/ui/slider/index.d.ts.map +1 -1
- package/dist/ui/slider/index.js +12 -19
- package/dist/ui/slider/public.d.ts +1 -1
- package/dist/ui/slider/public.d.ts.map +1 -1
- package/dist/ui/slider/public.js +1 -1
- package/dist/ui/virtualList/index.d.ts +45 -39
- package/dist/ui/virtualList/index.d.ts.map +1 -1
- package/dist/ui/virtualList/index.js +5 -12
- package/dist/ui/virtualList/public.d.ts +1 -1
- package/dist/ui/virtualList/public.d.ts.map +1 -1
- package/dist/ui/virtualList/public.js +1 -1
- 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
|
|
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;;
|
|
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"}
|
package/dist/devTools/overlay.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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":"AACA,OAAO,EAGL,OAAO,EAEP,MAAM,EAGN,KAAK,EAEL,MAAM,EAON,MAAM,EAIP,MAAM,QAAQ,CAAA;AAGf,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AASlD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,GAAG,EAA+B,MAAM,iBAAiB,CAAA;AAalE,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAetD,0DAA0D;AAC1D,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,YAAY,GACZ,UAAU,GACV,SAAS,CAAA;AAEb,wCAAwC;AACxC,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,QAAQ,CAAA;AAEjD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,CAAA;AAEnD;;;;sEAIsE;AACtE,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,QAAQ,CAAC;IAAE,WAAW,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,YAAY,CAAA;CAAE,CAAC,CAAA;AAErE;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,cAAc,GACtB,KAAK,GACL,QAAQ,CAAC;IACP,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;IAC3B,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;CACnD,CAAC,CAAA;AAgBN,sFAAsF;AACtF,MAAM,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IACrD,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAC,CAAA;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,IACrC,KAAK,GACL,QAAQ,CAAC;IACP,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CAChE,CAAC,CAAA;;4BA6BsB,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;2BAC1C,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI;;AALrD,8EAA8E;AAC9E,qBAAa,QAAS,SAAQ,aAMN;CAAG;AAE3B,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,oFAAoF;AACpF,MAAM,MAAM,aAAa,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC5C,YAAY,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAA;IAC9C,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAA;CACnC,CAAC,CAAA;AAEF,0GAA0G;AAC1G,MAAM,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IAClD,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB,CAAC,CAAA;AAEF,iFAAiF;AACjF,MAAM,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAA;IAC1D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACzD,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/runtime.js
CHANGED
|
@@ -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, {
|
|
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 =
|
|
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,
|
|
2
|
-
type
|
|
3
|
-
|
|
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
|
|
10
|
-
readonly
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
readonly modelToDependencies: (model: Model) =>
|
|
19
|
-
readonly
|
|
20
|
-
readonly dependenciesToStream: (
|
|
21
|
-
};
|
|
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,
|
|
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
|
-
/**
|
|
3
|
-
|
|
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(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
*
|
|
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
|
|
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
|
|
49
|
-
*
|
|
50
|
-
*
|
|
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>) =>
|
|
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;
|
|
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"}
|