foldkit 0.82.2 → 0.82.3
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/store.d.ts +1 -0
- package/dist/devTools/store.d.ts.map +1 -1
- package/dist/devTools/store.js +13 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ Built on [Effect](https://effect.website/). Architected like [Elm](https://guide
|
|
|
25
25
|
|
|
26
26
|
## Who It's For
|
|
27
27
|
|
|
28
|
-
Foldkit is for developers who want their
|
|
28
|
+
Foldkit is for developers who want to build their product with confidence instead of fighting their architecture. If you want a single pattern that scales from a counter to a multiplayer game without complexity creep, this is it.
|
|
29
29
|
|
|
30
30
|
It's not incremental. There's no React interop, no escape hatch from Effect, no way to "just use hooks for this one part." You're all in or you're not.
|
|
31
31
|
|
package/dist/devTools/store.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/devTools/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EACN,OAAO,EACP,OAAO,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/devTools/store.ts"],"names":[],"mappings":"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"}
|
package/dist/devTools/store.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Array, Effect, HashMap, HashSet, Option, Predicate, Record, String as String_, SubscriptionRef, pipe, } from 'effect';
|
|
1
|
+
import { Array, Effect, HashMap, HashSet, Match, Option, Predicate, Record, String as String_, SubscriptionRef, pipe, } from 'effect';
|
|
2
2
|
export const INIT_INDEX = -1;
|
|
3
3
|
const KEYFRAME_INTERVAL = 31;
|
|
4
4
|
const DEFAULT_MAX_ENTRIES = 500;
|
|
@@ -71,6 +71,7 @@ const emptyState = {
|
|
|
71
71
|
startIndex: 0,
|
|
72
72
|
isPaused: false,
|
|
73
73
|
pausedAtIndex: 0,
|
|
74
|
+
maybeLatestModel: Option.none(),
|
|
74
75
|
};
|
|
75
76
|
export const createDevToolsStore = (bridge, maxEntries = DEFAULT_MAX_ENTRIES) => Effect.gen(function* () {
|
|
76
77
|
const stateRef = yield* SubscriptionRef.make(emptyState);
|
|
@@ -101,6 +102,7 @@ export const createDevToolsStore = (bridge, maxEntries = DEFAULT_MAX_ENTRIES) =>
|
|
|
101
102
|
maybeInitModel: Option.some(model),
|
|
102
103
|
initCommandNames: commandNames,
|
|
103
104
|
keyframes: HashMap.set(state.keyframes, 0, model),
|
|
105
|
+
maybeLatestModel: Option.some(model),
|
|
104
106
|
}));
|
|
105
107
|
const recordMessage = (message, modelBeforeUpdate, modelAfterUpdate, commandNames, isModelChanged) => SubscriptionRef.update(stateRef, state => {
|
|
106
108
|
const absoluteIndex = state.startIndex + state.entries.length;
|
|
@@ -119,14 +121,20 @@ export const createDevToolsStore = (bridge, maxEntries = DEFAULT_MAX_ENTRIES) =>
|
|
|
119
121
|
diff,
|
|
120
122
|
}),
|
|
121
123
|
keyframes: addKeyframeIfNeeded(state.keyframes, absoluteIndex + 1, modelAfterUpdate),
|
|
124
|
+
maybeLatestModel: Option.some(modelAfterUpdate),
|
|
122
125
|
};
|
|
123
126
|
return nextState.entries.length > maxEntries
|
|
124
127
|
? evictOldestSegment(nextState)
|
|
125
128
|
: nextState;
|
|
126
129
|
});
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
:
|
|
130
|
+
const latestEntryIndex = (state) => Array.match(state.entries, {
|
|
131
|
+
onEmpty: () => INIT_INDEX,
|
|
132
|
+
onNonEmpty: entries => state.startIndex + entries.length - 1,
|
|
133
|
+
});
|
|
134
|
+
// NOTE: maybeLatestModel must be stamped atomically with the entries
|
|
135
|
+
// append in recordMessage. The follow-latest fast-path below depends on
|
|
136
|
+
// that invariant.
|
|
137
|
+
const resolveModel = (state, index) => Match.value(index).pipe(Match.when(INIT_INDEX, () => Option.getOrThrow(state.maybeInitModel)), Match.when(latestEntryIndex(state), () => Option.getOrThrow(state.maybeLatestModel)), Match.orElse(() => replayToIndex(state, index)));
|
|
130
138
|
const getModelAtIndex = (index) => pipe(stateRef, SubscriptionRef.get, Effect.map(state => resolveModel(state, index)));
|
|
131
139
|
const getMessageAtIndex = (index) => Effect.gen(function* () {
|
|
132
140
|
if (index === INIT_INDEX) {
|
|
@@ -160,6 +168,7 @@ export const createDevToolsStore = (bridge, maxEntries = DEFAULT_MAX_ENTRIES) =>
|
|
|
160
168
|
onNone: () => HashMap.empty(),
|
|
161
169
|
onSome: model => HashMap.set(HashMap.empty(), 0, model),
|
|
162
170
|
}),
|
|
171
|
+
maybeLatestModel: state.maybeInitModel,
|
|
163
172
|
}));
|
|
164
173
|
const getDiffAtIndex = (index) => Effect.gen(function* () {
|
|
165
174
|
if (index === INIT_INDEX) {
|