synstate 6.1.0 → 6.1.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.
- package/README.md +2 -2
- package/dist/core/class/manager-observable-class.d.mts.map +1 -1
- package/dist/core/class/manager-observable-class.mjs +6 -0
- package/dist/core/class/manager-observable-class.mjs.map +1 -1
- package/dist/core/class/observable-base-class.d.mts +8 -0
- package/dist/core/class/observable-base-class.d.mts.map +1 -1
- package/dist/core/class/observable-base-class.mjs +16 -1
- package/dist/core/class/observable-base-class.mjs.map +1 -1
- package/dist/core/class/propagation-state.d.mts +6 -3
- package/dist/core/class/propagation-state.d.mts.map +1 -1
- package/dist/core/class/propagation-state.mjs +4 -0
- package/dist/core/class/propagation-state.mjs.map +1 -1
- package/dist/core/types/id.d.mts +2 -1
- package/dist/core/types/id.d.mts.map +1 -1
- package/dist/core/types/observable.d.mts +2 -1
- package/dist/core/types/observable.d.mts.map +1 -1
- package/dist/core/types/observable.mjs.map +1 -1
- package/dist/core/utils/id-maker.d.mts +7 -0
- package/dist/core/utils/id-maker.d.mts.map +1 -1
- package/dist/core/utils/id-maker.mjs +9 -0
- package/dist/core/utils/id-maker.mjs.map +1 -1
- package/dist/utils/create-reducer.d.mts +2 -2
- package/dist/utils/create-reducer.d.mts.map +1 -1
- package/dist/utils/create-reducer.mjs +4 -16
- package/dist/utils/create-reducer.mjs.map +1 -1
- package/dist/utils/create-state.d.mts +1 -1
- package/dist/utils/create-state.d.mts.map +1 -1
- package/dist/utils/create-state.mjs +10 -13
- package/dist/utils/create-state.mjs.map +1 -1
- package/dist/utils/state-source.d.mts +19 -0
- package/dist/utils/state-source.d.mts.map +1 -0
- package/dist/utils/state-source.mjs +31 -0
- package/dist/utils/state-source.mjs.map +1 -0
- package/package.json +9 -9
- package/src/core/class/manager-observable-class.mts +7 -0
- package/src/core/class/observable-base-class.mts +20 -0
- package/src/core/class/propagation-state.mts +10 -6
- package/src/core/class/unobserved-write.test.mts +194 -0
- package/src/core/types/id.mts +2 -1
- package/src/core/types/observable.mts +2 -1
- package/src/core/utils/id-maker.mts +10 -0
- package/src/utils/create-reducer.mts +9 -24
- package/src/utils/create-state.mts +12 -29
- package/src/utils/create-state.test.mts +18 -0
- package/src/utils/state-source.mts +48 -0
package/README.md
CHANGED
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
## Features
|
|
23
23
|
|
|
24
24
|
- 🎯 **Simple State Management**: Easy-to-use `createState` and `createReducer` similar to React useState/useReducer for global state
|
|
25
|
-
- ⚡ **
|
|
25
|
+
- ⚡ **Glitch-Free Through Every Operator**: Every update is one depth-ordered pass over what it reaches, the ones `debounce` or `switchMap` start later included, so no subscriber sees a half-updated graph, and its cost grows with the nodes it reaches, never with the paths between them ([why SynState](https://noshiro-pf.github.io/mono/synstate/guides/why-synstate/), [benchmark](https://noshiro-pf.github.io/mono/synstate/guides/library-comparison/benchmark/))
|
|
26
26
|
- 🎨 **Type-Safe**: Full TypeScript support with precise type inference
|
|
27
|
-
- 🚀 **Lightweight**: <!-- bundle-size:synstate -->~6.
|
|
27
|
+
- 🚀 **Lightweight**: <!-- bundle-size:synstate -->~6.8 kB min+gzip<!-- /bundle-size:synstate --> with two external runtime dependencies ([ts-data-forge](https://www.npmjs.com/package/ts-data-forge) and [ts-std-forge](https://www.npmjs.com/package/ts-std-forge), and the first depends on the second)
|
|
28
28
|
- 🌐 **Framework Agnostic**: Works with React, Vue, Svelte, or vanilla JavaScript
|
|
29
29
|
- 🔄 **Reactive Updates**: Automatic propagation of state changes to all subscribers
|
|
30
30
|
- 📡 **Event System**: Built-in `createValueEmitter`, `createEventEmitter` for event-driven architecture
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager-observable-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/manager-observable-class.mts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AASlE;;;;;;;GAOG;AACH,qBAAa,sBAAsB,CACjC,CAAC,EACD,IAAI,SAAS,qBAAqB,EAClC,KAAK,SAAS,MAAM,CACpB,SAAQ,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC;IAC3C,8DAA8D;IAC9D,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"manager-observable-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/manager-observable-class.mts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AASlE;;;;;;;GAOG;AACH,qBAAa,sBAAsB,CACjC,CAAC,EACD,IAAI,SAAS,qBAAqB,EAClC,KAAK,SAAS,MAAM,CACpB,SAAQ,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC;IAC3C,8DAA8D;IAC9D,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CAyBxC;CACF"}
|
|
@@ -11,6 +11,12 @@ import { beginPropagation, closeUpdate, drainUpdate, endPropagation, openUpdate,
|
|
|
11
11
|
export class ManagerObservableClass extends ObservableBaseClass {
|
|
12
12
|
|
|
13
13
|
startUpdate(nextValue) {
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if (this.setNextIfUnobserved(nextValue)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
14
20
|
const updateToken = openUpdate(this.depth);
|
|
15
21
|
beginPropagation(updateToken);
|
|
16
22
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager-observable-class.mjs","sourceRoot":"","sources":["../../../src/core/class/manager-observable-class.mts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,cAAc,EACd,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;GAOG;AACH,MAAM,OAAO,sBAIX,SAAQ,mBAAmC;IAC3C,8DAA8D;IACpD,WAAW,CAAC,SAAY;QAChC,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE3C,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAE9B,uEAAuE;QACvE,yEAAyE;QACzE,mEAAmE;QACnE,uCAAuC;QACvC,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAErC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,WAAW,CAAC,WAAW,CAAC,CAAC;YAEzB,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"manager-observable-class.mjs","sourceRoot":"","sources":["../../../src/core/class/manager-observable-class.mts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,cAAc,EACd,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;GAOG;AACH,MAAM,OAAO,sBAIX,SAAQ,mBAAmC;IAC3C,8DAA8D;IACpD,WAAW,CAAC,SAAY;QAChC,oEAAoE;QACpE,sEAAsE;QACtE,mDAAmD;QACnD,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE3C,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAE9B,uEAAuE;QACvE,yEAAyE;QACzE,mEAAmE;QACnE,uCAAuC;QACvC,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAErC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,WAAW,CAAC,WAAW,CAAC,CAAC;YAEzB,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -52,6 +52,14 @@ export declare class ObservableBaseClass<A, Kind extends ObservableKind, Depth e
|
|
|
52
52
|
* value, is not visited for it again.
|
|
53
53
|
*/
|
|
54
54
|
protected setNext(nextValue: A, updateToken: UpdateToken): void;
|
|
55
|
+
/**
|
|
56
|
+
* Stores `nextValue` and returns `true` when nothing observes this
|
|
57
|
+
* observable — no child to queue and no subscriber to call — so that the
|
|
58
|
+
* caller need not open an update; returns `false`, storing nothing,
|
|
59
|
+
* otherwise. The value still gets a token of its own, so that whoever
|
|
60
|
+
* stored the last one sees that it emitted.
|
|
61
|
+
*/
|
|
62
|
+
protected setNextIfUnobserved(nextValue: A): boolean;
|
|
55
63
|
/**
|
|
56
64
|
* Called with the token of every update that reaches this observable; a
|
|
57
65
|
* parent that did not emit in that update has a different `updateToken`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable-base-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,UAAU,EACV,cAAc,EACd,cAAc,EAGd,YAAY,EACZ,WAAW,EACX,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"observable-base-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,UAAU,EACV,cAAc,EACd,cAAc,EAGd,YAAY,EACZ,WAAW,EACX,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAIL,eAAe,EAGhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,mBAAmB,CAC9B,CAAC,EACD,IAAI,SAAS,cAAc,EAC3B,KAAK,SAAS,MAAM,CACpB,YAAW,cAAc,CAAC,CAAC,CAAC;;IAQ5B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,SAAiB,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC;IAEzC,YAAY,EACV,IAAI,EACJ,KAAK,EACL,YAAY,GACb,EAAE,QAAQ,CAAC;QACV,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,KAAK,CAAC;QACb,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;KAC3B,CAAC,EAoBD;IAED,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,CAEzB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,IAAI,aAAa,IAAI,OAAO,CAI3B;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,cAAc,IAAI,OAAO,CAUxB;IAED,IAAI,SAAS,IAAI,WAAW,GAAG,SAAS,CAEvC;IAED,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAE3C;IAED,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAQ/B;IAED,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAElC;IAED;;;;;OAKG;IACH,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAc9D;IAED;;;;;;OAMG;IACH,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,CAAC,GAAG,OAAO,CAUnD;IAED;;;;;;OAMG;IAEH,SAAS,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI,CAEzC;IAED;;;;OAIG;IAEH,WAAW,IAAI,IAAI,CAAG;IAEtB;;;;;OAKG;IACH,QAAQ,IAAI,IAAI,CAQf;IAED;;;OAGG;IACH,OAAO,IAAI,IAAI,CAkCd;IAED;;;OAGG;IAEH,SAAS,CAAC,KAAK,IAAI,IAAI,CAAG;IAE1B;;;;OAIG;IAEH,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAG;IAE7B,yDAAyD;IAEzD,SAAS,CAAC,MAAM,IAAI,IAAI,CAAG;IAE3B;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI,CAUtC;IAKD,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAE5E,IAAI,CAAC,CAAC,EACJ,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GACxE,UAAU,CAAC,CAAC,CAAC,CAAC;IAUjB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,YAAY,CAuBvE;CACF"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import { Optional } from 'ts-data-forge';
|
|
9
9
|
import { unreachable } from 'ts-std-forge';
|
|
10
|
-
import { getCurrentScopeInternals, notUpdatedYet, observableBrand, toSubscriber, } from '../utils/index.mjs';
|
|
10
|
+
import { getCurrentScopeInternals, issueUnqueuedToken, notUpdatedYet, observableBrand, toSubscriber, } from '../utils/index.mjs';
|
|
11
11
|
import { enqueueChildren } from './propagation-state.mjs';
|
|
12
12
|
|
|
13
13
|
|
|
@@ -123,6 +123,21 @@ export class ObservableBaseClass {
|
|
|
123
123
|
|
|
124
124
|
|
|
125
125
|
|
|
126
|
+
setNextIfUnobserved(nextValue) {
|
|
127
|
+
if (this.hasChild || this.hasSubscriber) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
this.#mut_updateToken = issueUnqueuedToken();
|
|
131
|
+
this.#mut_snapshot = Optional.some(nextValue);
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
126
141
|
|
|
127
142
|
tryUpdate(_updateToken) {
|
|
128
143
|
unreachable();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable-base-class.mjs","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yDAAyD;AACzD,4EAA4E;AAC5E,2CAA2C;AAC3C,gDAAgD;AAChD,0DAA0D;AAC1D,kEAAkE;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAe3C,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,YAAY,GAEb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,mBAAmB;IAK9B,aAAa,CAAc;IAC3B,gBAAgB,CAAU;IAC1B,gBAAgB,CAAc;IAC9B,aAAa,CAAoC;IACjD,gBAAgB,CAAwC;IACxD,UAAU,CAA6B;IACvC,cAAc,CAA0B;IAC/B,IAAI,CAAO;IACX,KAAK,CAAQ;IAGtB,YAAY,EACV,IAAI,EACJ,KAAK,EACL,YAAY,GAKZ;QACA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAElC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAE9B,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC;QAEtC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAEhC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAE/B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAElC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,CACL,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CACtE,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,cAAc;QACZ,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBACnB,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,YAAY,CAAC,WAAwB;QACnC,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,KAAgB;QACvB,yEAAyE;QACzE,4EAA4E;QAC5E,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,WAAW,CAAC,KAAgB;QAC1B,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACO,OAAO,CAAC,SAAY,EAAE,WAAwB;QACtD,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;QAEpC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,qEAAqE;IACrE,SAAS,CAAC,YAAyB;QACjC,WAAW,EAAE,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,qEAAqE;IACrE,WAAW,KAAU,CAAC;IAEtB;;;;;OAKG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,wEAAwE;QACxE,2EAA2E;QAC3E,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE7B,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAE1B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtC,CAAC,CAAC,UAAU,EAAE,CAAC;YACjB,CAAC;YAED,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;QAED,0EAA0E;QAC1E,qCAAqC;QACrC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnC,CAAC,CAAC,WAAW,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,qEAAqE;IAC3D,KAAK,KAAU,CAAC;IAE1B;;;;OAIG;IACH,qEAAqE;IAC3D,QAAQ,KAAU,CAAC;IAE7B,yDAAyD;IACzD,qEAAqE;IAC3D,MAAM,KAAU,CAAC;IAE3B;;;;OAIG;IACO,qBAAqB;QAC7B,MAAM,KAAK,GAAG,wBAAwB,EAAE,CAAC;QAEzC,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAWD,IAAI,CAAI,QAAwB;QAC9B,OAAO,QAAQ;QACb,sEAAsE;QACtE,4DAA4D;QAC5D,IAA2C,CAC5C,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,MAAsB,EAAE,UAAuB;QACvD,aAAa;QACb,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,UAAU,EAAE,EAAE,CAAC;YAEf,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAEpD,IAAI,CAAC,gBAAgB,KAAK,IAAI,GAAG,EAAiB,CAAC;QAEnD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEtC,OAAO;YACL,WAAW,EAAE,GAAG,EAAE;gBAChB,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,gBAAgB,GAAiB,EAAE,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,EAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"observable-base-class.mjs","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"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"}
|
|
@@ -15,11 +15,14 @@ export declare const outermostUpdateToken: () => UpdateToken | undefined;
|
|
|
15
15
|
* passed on (`take`).
|
|
16
16
|
*/
|
|
17
17
|
export declare const runAfterPropagation: (task: () => void) => void;
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Brackets one update a `startUpdate` opens (a write nothing observes opens
|
|
20
|
+
* none); see {@link endPropagation}.
|
|
21
|
+
*/
|
|
19
22
|
export declare const beginPropagation: (updateToken: UpdateToken) => void;
|
|
20
23
|
/**
|
|
21
|
-
* Ends one
|
|
22
|
-
*
|
|
24
|
+
* Ends one update, and runs the deferred work once the outermost one has
|
|
25
|
+
* ended.
|
|
23
26
|
*/
|
|
24
27
|
export declare const endPropagation: () => void;
|
|
25
28
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propagation-state.d.mts","sourceRoot":"","sources":["../../../src/core/class/propagation-state.mts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"propagation-state.d.mts","sourceRoot":"","sources":["../../../src/core/class/propagation-state.mts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAkBvD;;;;GAIG;AACH,eAAO,MAAM,aAAa,QAAO,OAAoC,CAAC;AAEtE,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,QAAO,WAAW,GAAG,SACtB,CAAC;AAEjC;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,SAAU,MAAM,IAAI,KAAG,IAMtD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,gBAAiB,WAAW,KAAG,IAM3D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,IAcjC,CAAC;AAcF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,WAY1C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,eAAO,MAAM,iBAAiB,2RAC2R,CAAC;AAE1T,iEAAiE;AACjE,eAAO,MAAM,WAAW,gBAAiB,WAAW,KAAG,IAEtD,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,WAAW,gBAAiB,WAAW,KAAG,IAItD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,aAChB,WAAW,CAAC,SAAS,CAAC,eACnB,WAAW,KACvB,IAEF,CAAC"}
|
|
@@ -17,6 +17,7 @@ import { panic } from 'ts-std-forge';
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
20
|
+
|
|
20
21
|
const mut_propagation = { depth: 0, outermostToken: undefined };
|
|
21
22
|
|
|
22
23
|
|
|
@@ -46,6 +47,9 @@ export const runAfterPropagation = (task) => {
|
|
|
46
47
|
}
|
|
47
48
|
};
|
|
48
49
|
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
49
53
|
export const beginPropagation = (updateToken) => {
|
|
50
54
|
if (mut_propagation.depth === 0) {
|
|
51
55
|
mut_propagation.outermostToken = updateToken;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propagation-state.mjs","sourceRoot":"","sources":["../../../src/core/class/propagation-state.mts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,gDAAgD;AAChD,0DAA0D;AAC1D,kEAAkE;AAClE;;;;;;;;GAQG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAKrC
|
|
1
|
+
{"version":3,"file":"propagation-state.mjs","sourceRoot":"","sources":["../../../src/core/class/propagation-state.mts"],"names":[],"mappings":"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"}
|
package/dist/core/types/id.d.mts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Brand, UnknownRecord } from 'ts-type-forge';
|
|
2
2
|
/**
|
|
3
3
|
* Identifies one update. Opaque: an object issued per update, which is also
|
|
4
|
-
* that update's queue
|
|
4
|
+
* that update's queue — except for a write nothing observes, which opens no
|
|
5
|
+
* update and is issued a token with no queue behind it.
|
|
5
6
|
*/
|
|
6
7
|
export type UpdateToken = Brand<UnknownRecord, 'update-token'>;
|
|
7
8
|
//# sourceMappingURL=id.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.d.mts","sourceRoot":"","sources":["../../../src/core/types/id.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE1D
|
|
1
|
+
{"version":3,"file":"id.d.mts","sourceRoot":"","sources":["../../../src/core/types/id.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE1D;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC"}
|
|
@@ -32,7 +32,8 @@ type CreateObservableType<A, Kind extends ObservableKind> = Readonly<{
|
|
|
32
32
|
* The token of the update in which this observable last emitted. A child's
|
|
33
33
|
* `tryUpdate` receives the token of the update now propagating; a parent
|
|
34
34
|
* whose token differs did not emit in it. The token is opaque: compare it,
|
|
35
|
-
* store it, or pass
|
|
35
|
+
* store it, or pass the one `tryUpdate` received on to `setNext`. A write
|
|
36
|
+
* nothing observes opens no update, and its token has no queue behind it.
|
|
36
37
|
*/
|
|
37
38
|
updateToken: UpdateToken;
|
|
38
39
|
complete: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable.d.mts","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,IAAI,EACV,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErE;;;;;;;;;;;;GAYG;AAEH,KAAK,oBAAoB,CAAC,CAAC,EAAE,IAAI,SAAS,cAAc,IAAI,QAAQ,CAAC;IACnE,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC;IAExB,IAAI,EAAE,IAAI,CAAC;IAEX;;;;OAIG;IACH,KAAK,EAAE,IAAI,SAAS,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;IAExC,WAAW,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IAErB
|
|
1
|
+
{"version":3,"file":"observable.d.mts","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable.mjs","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,MAAM,EACN,QAAQ,GAGT,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"observable.mjs","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,MAAM,EACN,QAAQ,GAGT,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAsKrD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAgC,EAAE,CAC3E,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,GAAkB,EACW,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;AAE5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAkB,EACQ,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,GAAkB,EACS,EAAE,CAC7B,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC;AAgB1D,sEAAsE;AACtE,uDAAuD;AAEvD,oEAAoE;AACpE,+CAA+C;AAC/C,UAAU,CAYR,GAAG,CAAC,CAAC;AAEP,UAAU,CAGR,GAAG,CAAC,CAAC;AAEP,oEAAoE;AACpE,UAAU,CAGR,KAAK,CAAC,CAAC;AAET,UAAU,CAAsC,GAAG,CAAC,CAAC;AAErD,UAAU,CAAiD,GAAG,CAAC,CAAC;AAEhE,UAAU,CAAgD,GAAG,CAAC,CAAC;AAE/D,UAAU,CAAiD,GAAG,CAAC,CAAC;AAEhE,UAAU,CAA2C,GAAG,CAAC,CAAC;AAE1D,UAAU,CAAuD,GAAG,CAAC,CAAC;AAEtE,UAAU,CAA8C,IAAI,CAAC,CAAC;AAE9D,UAAU,CAA8C,KAAK,CAAC,CAAC;AAE/D,UAAU,CAGR,IAAI,CAAC,CAAC;AAER,UAAU,CAA8C,KAAK,CAAC,CAAC;AAE/D,UAAU,CAGR,IAAI,CAAC,CAAC;AAER,UAAU,CAGR,KAAK,CAAC,CAAC"}
|
|
@@ -5,4 +5,11 @@ import type { UpdateToken } from '../types/index.mjs';
|
|
|
5
5
|
* issues nothing.
|
|
6
6
|
*/
|
|
7
7
|
export declare const notUpdatedYet: UpdateToken;
|
|
8
|
+
/**
|
|
9
|
+
* Issues the token of a write that opens no update, because nothing observes
|
|
10
|
+
* the observable written to (`setNextIfUnobserved`). Nothing is ever queued
|
|
11
|
+
* with it, so it is a token and not a queue, unlike the tokens
|
|
12
|
+
* `openUpdate` issues.
|
|
13
|
+
*/
|
|
14
|
+
export declare const issueUnqueuedToken: () => UpdateToken;
|
|
8
15
|
//# sourceMappingURL=id-maker.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id-maker.d.mts","sourceRoot":"","sources":["../../../src/core/utils/id-maker.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,WAEM,CAAC"}
|
|
1
|
+
{"version":3,"file":"id-maker.d.mts","sourceRoot":"","sources":["../../../src/core/utils/id-maker.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,WAEM,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,QAAO,WAEjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id-maker.mjs","sourceRoot":"","sources":["../../../src/core/utils/id-maker.mts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa;AACxB,4DAA4D;AAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"id-maker.mjs","sourceRoot":"","sources":["../../../src/core/utils/id-maker.mts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa;AACxB,4DAA4D;AAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAgB,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAgB,EAAE;AAClD,4DAA4D;AAC5D,CAAC,EAAE,CAAgB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ReplaceEqualDeepOptions } from 'ts-data-forge';
|
|
2
2
|
import type { Reducer } from 'ts-type-forge';
|
|
3
|
-
import {
|
|
3
|
+
import type { InitializedObservable } from '../core/index.mjs';
|
|
4
4
|
/**
|
|
5
5
|
* Creates a reducer-based state management container following the Redux pattern.
|
|
6
6
|
* Actions are dispatched to update the state according to the reducer function.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-reducer.d.mts","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"create-reducer.d.mts","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,WACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,gBACR,CAAC,YACL,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KACjC,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,QAAQ,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAcH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,QAAQ,CAAC;IACrC;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IAE1C;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,uBAAuB,CAAC;CACpD,CAAC,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { source } from '../core/index.mjs';
|
|
1
|
+
import { createStateSource } from './state-source.mjs';
|
|
3
2
|
|
|
4
3
|
|
|
5
4
|
|
|
@@ -78,22 +77,11 @@ import { source } from '../core/index.mjs';
|
|
|
78
77
|
|
|
79
78
|
|
|
80
79
|
export const createReducer = (reducer, initialState, options) => {
|
|
81
|
-
const state =
|
|
82
|
-
const equals = options?.equals ?? Object.is;
|
|
83
|
-
const keepEqualParts = options?.keepEqualParts ?? false;
|
|
84
|
-
const keepOptions = typeof keepEqualParts === 'boolean' ? undefined : keepEqualParts;
|
|
80
|
+
const { state, getSnapshot, commit } = createStateSource(initialState, options);
|
|
85
81
|
const dispatch = (action) => {
|
|
86
|
-
const currentState =
|
|
87
|
-
|
|
88
|
-
const nextState = keepEqualParts === false
|
|
89
|
-
? reduced
|
|
90
|
-
: replaceEqualDeep(currentState, reduced, keepOptions);
|
|
91
|
-
|
|
92
|
-
return equals(currentState, nextState)
|
|
93
|
-
? currentState
|
|
94
|
-
: state.next(nextState);
|
|
82
|
+
const currentState = getSnapshot();
|
|
83
|
+
return commit(currentState, reducer(currentState, action));
|
|
95
84
|
};
|
|
96
|
-
const getSnapshot = () => state.getSnapshot().value;
|
|
97
85
|
return [state, dispatch, { getSnapshot, initialState }];
|
|
98
86
|
};
|
|
99
87
|
//# sourceMappingURL=create-reducer.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-reducer.mjs","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-reducer.mjs","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAsB,EACtB,YAAe,EACf,OAAkC,EAQlC,EAAE;IACF,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,iBAAiB,CACtD,YAAY,EACZ,OAAO,CACR,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,MAAS,EAAK,EAAE;QAChC,MAAM,YAAY,GAAG,WAAW,EAAE,CAAC;QAEnC,OAAO,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAU,CAAC;AACnE,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { InitializedObservable } from '../core/index.mjs';
|
|
2
|
-
import {
|
|
2
|
+
import type { StateOptions } from './create-reducer.mjs';
|
|
3
3
|
/**
|
|
4
4
|
* Creates a reactive state container with getter and setter methods.
|
|
5
5
|
* Provides a simple state management solution with observable state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-state.d.mts","sourceRoot":"","sources":["../../src/utils/create-state.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,
|
|
1
|
+
{"version":3,"file":"create-state.d.mts","sourceRoot":"","sources":["../../src/utils/create-state.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6HG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,gBACb,CAAC,YACL,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KACjC,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EACrB,KAAK,EAAE,QAAQ,CAAC;IACd,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CA6BH,CAAC"}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
const reducer = (state, action) => {
|
|
3
|
-
switch (action.type) {
|
|
4
|
-
case 'set':
|
|
5
|
-
return action.nextState;
|
|
6
|
-
case 'update':
|
|
7
|
-
return action.updateFn(state);
|
|
8
|
-
}
|
|
9
|
-
};
|
|
1
|
+
import { createStateSource } from './state-source.mjs';
|
|
10
2
|
|
|
11
3
|
|
|
12
4
|
|
|
@@ -134,10 +126,15 @@ const reducer = (state, action) => {
|
|
|
134
126
|
|
|
135
127
|
|
|
136
128
|
export const createState = (initialState, options) => {
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const
|
|
129
|
+
const { state, getSnapshot, commit } = createStateSource(initialState, options);
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
const updateState = (updateFn) => {
|
|
133
|
+
const currentState = getSnapshot();
|
|
134
|
+
return commit(currentState, updateFn(currentState));
|
|
135
|
+
};
|
|
136
|
+
const setState = (nextState) => commit(getSnapshot(), nextState);
|
|
137
|
+
const resetState = () => commit(getSnapshot(), initialState);
|
|
141
138
|
return [
|
|
142
139
|
state,
|
|
143
140
|
setState,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-state.mjs","sourceRoot":"","sources":["../../src/utils/create-state.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-state.mjs","sourceRoot":"","sources":["../../src/utils/create-state.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6HG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,YAAe,EACf,OAAkC,EAUlC,EAAE;IACF,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,iBAAiB,CACtD,YAAY,EACZ,OAAO,CACR,CAAC;IAEF,qEAAqE;IACrE,uCAAuC;IACvC,MAAM,WAAW,GAAG,CAAC,QAAwB,EAAK,EAAE;QAClD,MAAM,YAAY,GAAG,WAAW,EAAE,CAAC;QAEnC,OAAO,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,SAAY,EAAK,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAG,GAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;IAEhE,OAAO;QACL,KAAK;QACL,QAAQ;QACR;YACE,WAAW;YACX,UAAU;YACV,WAAW;YACX,YAAY;SACb;KACO,CAAC;AACb,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type InitializedSourceObservable } from '../core/index.mjs';
|
|
2
|
+
import type { StateOptions } from './create-reducer.mjs';
|
|
3
|
+
/**
|
|
4
|
+
* What `createState` and `createReducer` are both built on: the source
|
|
5
|
+
* holding the state, its current value, and `commit`, the one way either
|
|
6
|
+
* writes it. `commit` writes `reduced` unless `equals` finds it the same as
|
|
7
|
+
* `currentState`, after keeping the parts of `currentState` it did not change
|
|
8
|
+
* when `keepEqualParts` asks for that, and returns the state written, or
|
|
9
|
+
* `currentState` when nothing was.
|
|
10
|
+
*
|
|
11
|
+
* Not part of the package's API: `gen:index:src` leaves this file out of the
|
|
12
|
+
* barrel.
|
|
13
|
+
*/
|
|
14
|
+
export declare const createStateSource: <S>(initialState: S, options: StateOptions<S> | undefined) => Readonly<{
|
|
15
|
+
state: InitializedSourceObservable<S>;
|
|
16
|
+
getSnapshot: () => S;
|
|
17
|
+
commit: (currentState: S, reduced: S) => S;
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=state-source.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-source.d.mts","sourceRoot":"","sources":["../../src/utils/state-source.mts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,gBACnB,CAAC,WACN,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,KACnC,QAAQ,CAAC;IACV,KAAK,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,MAAM,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;CAC5C,CAyBA,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { replaceEqualDeep } from 'ts-data-forge';
|
|
2
|
+
import { source } from '../core/index.mjs';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
export const createStateSource = (initialState, options) => {
|
|
15
|
+
const state = source(initialState);
|
|
16
|
+
const getSnapshot = () => state.getSnapshot().value;
|
|
17
|
+
const equals = options?.equals ?? Object.is;
|
|
18
|
+
const keepEqualParts = options?.keepEqualParts ?? false;
|
|
19
|
+
const keepOptions = typeof keepEqualParts === 'boolean' ? undefined : keepEqualParts;
|
|
20
|
+
const commit = (currentState, reduced) => {
|
|
21
|
+
const nextState = keepEqualParts === false
|
|
22
|
+
? reduced
|
|
23
|
+
: replaceEqualDeep(currentState, reduced, keepOptions);
|
|
24
|
+
|
|
25
|
+
return equals(currentState, nextState)
|
|
26
|
+
? currentState
|
|
27
|
+
: state.next(nextState);
|
|
28
|
+
};
|
|
29
|
+
return { state, getSnapshot, commit };
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=state-source.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-source.mjs","sourceRoot":"","sources":["../../src/utils/state-source.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,MAAM,EAAoC,MAAM,mBAAmB,CAAC;AAG7E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,YAAe,EACf,OAAoC,EAKnC,EAAE;IACH,MAAM,KAAK,GAAG,MAAM,CAAI,YAAY,CAAC,CAAC;IAEtC,MAAM,WAAW,GAAG,GAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;IAEvD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC;IAE5C,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,KAAK,CAAC;IAExD,MAAM,WAAW,GACf,OAAO,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC;IAEnE,MAAM,MAAM,GAAG,CAAC,YAAe,EAAE,OAAU,EAAK,EAAE;QAChD,MAAM,SAAS,GACb,cAAc,KAAK,KAAK;YACtB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAE3D,8DAA8D;QAC9D,OAAO,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC;YACpC,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "synstate",
|
|
3
|
-
"version": "6.1.
|
|
3
|
+
"version": "6.1.1",
|
|
4
4
|
"description": "Type-safe State Management Library for TypeScript/JavaScript",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -36,14 +36,14 @@
|
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@preact/signals-core": "1.14.4",
|
|
38
38
|
"@reduxjs/toolkit": "2.13.0",
|
|
39
|
-
"@sumi-lang/cli": "0.1.
|
|
39
|
+
"@sumi-lang/cli": "0.1.3",
|
|
40
40
|
"@types/react": "19.3.0",
|
|
41
41
|
"@vitest/browser-playwright": "5.0.5",
|
|
42
42
|
"argparse": "3.0.3",
|
|
43
|
-
"eslint-config-typed": "
|
|
44
|
-
"eslint-plugin-ts-data-forge": "0.10.
|
|
45
|
-
"eslint-plugin-ts-fortress": "1.3.
|
|
46
|
-
"eslint-plugin-ts-type-forge": "0.8.
|
|
43
|
+
"eslint-config-typed": "7.1.0",
|
|
44
|
+
"eslint-plugin-ts-data-forge": "0.10.5",
|
|
45
|
+
"eslint-plugin-ts-fortress": "1.3.10",
|
|
46
|
+
"eslint-plugin-ts-type-forge": "0.8.15",
|
|
47
47
|
"jotai": "3.0.1",
|
|
48
48
|
"mobx": "7.1.0",
|
|
49
49
|
"playwright": "1.64.1",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"react": "19.3.1",
|
|
54
54
|
"rxjs": "7.8.2",
|
|
55
55
|
"solid-js": "1.9.17",
|
|
56
|
-
"synstate-react-hooks": "6.1.
|
|
57
|
-
"synstate-react-hooks-compat": "6.1.
|
|
56
|
+
"synstate-react-hooks": "6.1.1",
|
|
57
|
+
"synstate-react-hooks-compat": "6.1.1",
|
|
58
58
|
"ts-repo-utils": "10.7.1",
|
|
59
59
|
"valtio": "2.3.2",
|
|
60
60
|
"zustand": "5.0.15"
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"fmt": "pnpm run fix:fmt",
|
|
86
86
|
"gen": "run-s gen:index gen:readme gen:jsdoc gen:sample-diffs",
|
|
87
87
|
"gen:index": "run-s gen:index:src fix:fmt",
|
|
88
|
-
"gen:index:src": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/gen-index-ts.mts ./src --index-ext .mts --export-ext .mjs --target-ext .mts --target-ext .tsx --exclude entry-point.mts --exclude \"core/class/**\" --exclude \"core/utils/**\"",
|
|
88
|
+
"gen:index:src": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/gen-index-ts.mts ./src --index-ext .mts --export-ext .mjs --target-ext .mts --target-ext .tsx --exclude entry-point.mts --exclude \"core/class/**\" --exclude \"core/utils/**\" --exclude utils/state-source.mts",
|
|
89
89
|
"gen:jsdoc": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/embed-examples-in-jsdoc.mts",
|
|
90
90
|
"gen:readme": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/embed-examples.mts",
|
|
91
91
|
"gen:sample-diffs": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/generate-sample-diffs.mts",
|
|
@@ -26,6 +26,13 @@ export class ManagerObservableClass<
|
|
|
26
26
|
> extends ObservableBaseClass<A, Kind, Depth> {
|
|
27
27
|
/** Emits `nextValue` and propagates it to the descendants. */
|
|
28
28
|
protected startUpdate(nextValue: A): void {
|
|
29
|
+
// Nothing to propagate to (a branch no `switchMap` follows, a state
|
|
30
|
+
// written before anything subscribes): the update is the value alone,
|
|
31
|
+
// and opening one would cost more than storing it.
|
|
32
|
+
if (this.setNextIfUnobserved(nextValue)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
29
36
|
const updateToken = openUpdate(this.depth);
|
|
30
37
|
|
|
31
38
|
beginPropagation(updateToken);
|
|
@@ -23,6 +23,7 @@ import type {
|
|
|
23
23
|
} from '../types/index.mjs';
|
|
24
24
|
import {
|
|
25
25
|
getCurrentScopeInternals,
|
|
26
|
+
issueUnqueuedToken,
|
|
26
27
|
notUpdatedYet,
|
|
27
28
|
observableBrand,
|
|
28
29
|
toSubscriber,
|
|
@@ -178,6 +179,25 @@ export class ObservableBaseClass<
|
|
|
178
179
|
}
|
|
179
180
|
}
|
|
180
181
|
|
|
182
|
+
/**
|
|
183
|
+
* Stores `nextValue` and returns `true` when nothing observes this
|
|
184
|
+
* observable — no child to queue and no subscriber to call — so that the
|
|
185
|
+
* caller need not open an update; returns `false`, storing nothing,
|
|
186
|
+
* otherwise. The value still gets a token of its own, so that whoever
|
|
187
|
+
* stored the last one sees that it emitted.
|
|
188
|
+
*/
|
|
189
|
+
protected setNextIfUnobserved(nextValue: A): boolean {
|
|
190
|
+
if (this.hasChild || this.hasSubscriber) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
this.#mut_updateToken = issueUnqueuedToken();
|
|
195
|
+
|
|
196
|
+
this.#mut_snapshot = Optional.some(nextValue);
|
|
197
|
+
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
|
|
181
201
|
/**
|
|
182
202
|
* Called with the token of every update that reaches this observable; a
|
|
183
203
|
* parent that did not emit in that update has a different `updateToken`.
|
|
@@ -18,8 +18,9 @@ import type { UpdateToken } from '../types/index.mjs';
|
|
|
18
18
|
import type { ChildNode } from './observable-node.mjs';
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
* How many
|
|
22
|
-
*
|
|
21
|
+
* How many updates are propagating, across every observable, and the token
|
|
22
|
+
* of the outermost one. A write nothing observes opens none
|
|
23
|
+
* (`setNextIfUnobserved`).
|
|
23
24
|
*/
|
|
24
25
|
const mut_propagation: {
|
|
25
26
|
depth: number;
|
|
@@ -28,7 +29,7 @@ const mut_propagation: {
|
|
|
28
29
|
|
|
29
30
|
/**
|
|
30
31
|
* Work deferred by {@link runAfterPropagation}, run once the outermost
|
|
31
|
-
*
|
|
32
|
+
* update has reached every descendant.
|
|
32
33
|
*/
|
|
33
34
|
const mut_afterPropagation: (() => void)[] = [];
|
|
34
35
|
|
|
@@ -57,7 +58,10 @@ export const runAfterPropagation = (task: () => void): void => {
|
|
|
57
58
|
}
|
|
58
59
|
};
|
|
59
60
|
|
|
60
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* Brackets one update a `startUpdate` opens (a write nothing observes opens
|
|
63
|
+
* none); see {@link endPropagation}.
|
|
64
|
+
*/
|
|
61
65
|
export const beginPropagation = (updateToken: UpdateToken): void => {
|
|
62
66
|
if (mut_propagation.depth === 0) {
|
|
63
67
|
mut_propagation.outermostToken = updateToken;
|
|
@@ -67,8 +71,8 @@ export const beginPropagation = (updateToken: UpdateToken): void => {
|
|
|
67
71
|
};
|
|
68
72
|
|
|
69
73
|
/**
|
|
70
|
-
* Ends one
|
|
71
|
-
*
|
|
74
|
+
* Ends one update, and runs the deferred work once the outermost one has
|
|
75
|
+
* ended.
|
|
72
76
|
*/
|
|
73
77
|
export const endPropagation = (): void => {
|
|
74
78
|
mut_propagation.depth -= 1;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import type { FixedLengthTuple } from 'ts-type-forge';
|
|
2
|
+
import { createState } from '../../utils/index.mjs';
|
|
3
|
+
import { derive, merge } from '../combine/index.mjs';
|
|
4
|
+
import { source } from '../create/index.mjs';
|
|
5
|
+
import { debounce, map, switchMap } from '../operators/index.mjs';
|
|
6
|
+
import { writeDuringPropagationWarning } from './root-observable-class.mjs';
|
|
7
|
+
|
|
8
|
+
// A write to an observable with no child and no subscriber stores the value
|
|
9
|
+
// without opening an update (`ManagerObservableClass.startUpdate`). These
|
|
10
|
+
// pin what that must not change.
|
|
11
|
+
describe('a write nothing observes', () => {
|
|
12
|
+
test('is held, and a later subscriber receives the last one', () => {
|
|
13
|
+
const s$ = source<number>(0);
|
|
14
|
+
|
|
15
|
+
s$.next(1);
|
|
16
|
+
|
|
17
|
+
s$.next(2);
|
|
18
|
+
|
|
19
|
+
const mut_history: number[] = [];
|
|
20
|
+
|
|
21
|
+
s$.subscribe((v) => {
|
|
22
|
+
mut_history.push(v);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
assert.deepStrictEqual(mut_history, [2]);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('gets a token of its own each time', () => {
|
|
29
|
+
const s$ = source<number>(0);
|
|
30
|
+
|
|
31
|
+
const before = s$.updateToken;
|
|
32
|
+
|
|
33
|
+
s$.next(1);
|
|
34
|
+
|
|
35
|
+
const first = s$.updateToken;
|
|
36
|
+
|
|
37
|
+
s$.next(2);
|
|
38
|
+
|
|
39
|
+
assert.notStrictEqual(first, before);
|
|
40
|
+
|
|
41
|
+
assert.notStrictEqual(s$.updateToken, first);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('is held after the last subscriber leaves', () => {
|
|
45
|
+
const [s$, setS] = createState(0);
|
|
46
|
+
|
|
47
|
+
const subscription = s$.subscribe(() => {});
|
|
48
|
+
|
|
49
|
+
subscription.unsubscribe();
|
|
50
|
+
|
|
51
|
+
assert.strictEqual(setS(5), 5);
|
|
52
|
+
|
|
53
|
+
const mut_history: number[] = [];
|
|
54
|
+
|
|
55
|
+
s$.subscribe((v) => {
|
|
56
|
+
mut_history.push(v);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
assert.deepStrictEqual(mut_history, [5]);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('is where a child created later starts, and later writes reach it', () => {
|
|
63
|
+
const s$ = source<number>(0);
|
|
64
|
+
|
|
65
|
+
s$.next(3);
|
|
66
|
+
|
|
67
|
+
const mut_history: number[] = [];
|
|
68
|
+
|
|
69
|
+
s$.pipe(map((x) => x * 10)).subscribe((v) => {
|
|
70
|
+
mut_history.push(v);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
s$.next(4);
|
|
74
|
+
|
|
75
|
+
assert.deepStrictEqual(mut_history, [30, 40]);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('is not taken for an emission of an update another parent starts', () => {
|
|
79
|
+
const a$ = source<number>(0);
|
|
80
|
+
|
|
81
|
+
const b$ = source<number>(0);
|
|
82
|
+
|
|
83
|
+
a$.next(5);
|
|
84
|
+
|
|
85
|
+
const mut_merged: number[] = [];
|
|
86
|
+
|
|
87
|
+
merge([a$, b$]).subscribe((v) => {
|
|
88
|
+
mut_merged.push(v);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const mut_derived: FixedLengthTuple<2, number>[] = [];
|
|
92
|
+
|
|
93
|
+
derive([a$, b$], (a, b) => [a, b] as const).subscribe((v) => {
|
|
94
|
+
mut_derived.push(v);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
b$.next(1);
|
|
98
|
+
|
|
99
|
+
a$.next(6);
|
|
100
|
+
|
|
101
|
+
// merge passes on the parents that emitted in an update: only b$, then
|
|
102
|
+
// only a$, never the value a$ was given while nothing observed it.
|
|
103
|
+
assert.deepStrictEqual(mut_merged, [1, 6]);
|
|
104
|
+
|
|
105
|
+
assert.deepStrictEqual(mut_derived, [
|
|
106
|
+
[5, 0],
|
|
107
|
+
[5, 1],
|
|
108
|
+
[6, 1],
|
|
109
|
+
]);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('by an async child is held, as a root write is', () => {
|
|
113
|
+
vi.useFakeTimers();
|
|
114
|
+
|
|
115
|
+
const s$ = source<number>(0);
|
|
116
|
+
|
|
117
|
+
const debounced$ = s$.pipe(debounce(100));
|
|
118
|
+
|
|
119
|
+
const subscription = debounced$.subscribe(() => {});
|
|
120
|
+
|
|
121
|
+
subscription.unsubscribe();
|
|
122
|
+
|
|
123
|
+
// debounced$ keeps its parent, but has no observer of its own when the
|
|
124
|
+
// timer fires.
|
|
125
|
+
s$.next(1);
|
|
126
|
+
|
|
127
|
+
vi.runAllTimers();
|
|
128
|
+
|
|
129
|
+
const mut_history: number[] = [];
|
|
130
|
+
|
|
131
|
+
debounced$.subscribe((v) => {
|
|
132
|
+
mut_history.push(v);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
s$.next(2);
|
|
136
|
+
|
|
137
|
+
vi.runAllTimers();
|
|
138
|
+
|
|
139
|
+
assert.deepStrictEqual(mut_history, [1, 2]);
|
|
140
|
+
|
|
141
|
+
vi.useRealTimers();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('by a switchMap inner after the switchMap lost its observers is held', () => {
|
|
145
|
+
const selector$ = source<number>(0);
|
|
146
|
+
|
|
147
|
+
const branch$ = source<number>(10);
|
|
148
|
+
|
|
149
|
+
const switched$ = selector$.pipe(switchMap(() => branch$));
|
|
150
|
+
|
|
151
|
+
const subscription = switched$.subscribe(() => {});
|
|
152
|
+
|
|
153
|
+
// switchMap follows an inner once the selector emits.
|
|
154
|
+
selector$.next(1);
|
|
155
|
+
|
|
156
|
+
subscription.unsubscribe();
|
|
157
|
+
|
|
158
|
+
branch$.next(11);
|
|
159
|
+
|
|
160
|
+
const mut_history: number[] = [];
|
|
161
|
+
|
|
162
|
+
switched$.pipe(map((x) => x * 2)).subscribe((v) => {
|
|
163
|
+
mut_history.push(v);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
branch$.next(12);
|
|
167
|
+
|
|
168
|
+
assert.deepStrictEqual(mut_history, [22, 24]);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test('from a subscriber still warns as a write during propagation', () => {
|
|
172
|
+
const [a$, setA] = createState(0);
|
|
173
|
+
|
|
174
|
+
const [, setB] = createState(0);
|
|
175
|
+
|
|
176
|
+
a$.subscribe((a) => {
|
|
177
|
+
setB(a);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
const warn = vi.fn();
|
|
181
|
+
|
|
182
|
+
vi.stubGlobal('console', { ...console, warn });
|
|
183
|
+
|
|
184
|
+
setA(1);
|
|
185
|
+
|
|
186
|
+
// cspell:disable-next-line
|
|
187
|
+
vi.unstubAllGlobals();
|
|
188
|
+
|
|
189
|
+
assert.deepStrictEqual(
|
|
190
|
+
warn.mock.calls.map((args: readonly unknown[]) => args[0]),
|
|
191
|
+
[writeDuringPropagationWarning],
|
|
192
|
+
);
|
|
193
|
+
});
|
|
194
|
+
});
|
package/src/core/types/id.mts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Brand, UnknownRecord } from 'ts-type-forge';
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Identifies one update. Opaque: an object issued per update, which is also
|
|
5
|
-
* that update's queue
|
|
5
|
+
* that update's queue — except for a write nothing observes, which opens no
|
|
6
|
+
* update and is issued a token with no queue behind it.
|
|
6
7
|
*/
|
|
7
8
|
export type UpdateToken = Brand<UnknownRecord, 'update-token'>;
|
|
@@ -44,7 +44,8 @@ type CreateObservableType<A, Kind extends ObservableKind> = Readonly<{
|
|
|
44
44
|
* The token of the update in which this observable last emitted. A child's
|
|
45
45
|
* `tryUpdate` receives the token of the update now propagating; a parent
|
|
46
46
|
* whose token differs did not emit in it. The token is opaque: compare it,
|
|
47
|
-
* store it, or pass
|
|
47
|
+
* store it, or pass the one `tryUpdate` received on to `setNext`. A write
|
|
48
|
+
* nothing observes opens no update, and its token has no queue behind it.
|
|
48
49
|
*/
|
|
49
50
|
updateToken: UpdateToken;
|
|
50
51
|
|
|
@@ -8,3 +8,13 @@ import type { UpdateToken } from '../types/index.mjs';
|
|
|
8
8
|
export const notUpdatedYet: UpdateToken =
|
|
9
9
|
// @sumi-expect-error banned-syntax/no-unsafe-type-assertion
|
|
10
10
|
Object.freeze({}) as UpdateToken;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Issues the token of a write that opens no update, because nothing observes
|
|
14
|
+
* the observable written to (`setNextIfUnobserved`). Nothing is ever queued
|
|
15
|
+
* with it, so it is a token and not a queue, unlike the tokens
|
|
16
|
+
* `openUpdate` issues.
|
|
17
|
+
*/
|
|
18
|
+
export const issueUnqueuedToken = (): UpdateToken =>
|
|
19
|
+
// @sumi-expect-error banned-syntax/no-unsafe-type-assertion
|
|
20
|
+
({}) as UpdateToken;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ReplaceEqualDeepOptions } from 'ts-data-forge';
|
|
2
2
|
import type { Reducer } from 'ts-type-forge';
|
|
3
|
-
import {
|
|
3
|
+
import type { InitializedObservable } from '../core/index.mjs';
|
|
4
|
+
import { createStateSource } from './state-source.mjs';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Creates a reducer-based state management container following the Redux pattern.
|
|
@@ -91,33 +92,17 @@ export const createReducer = <S, A>(
|
|
|
91
92
|
initialState: S;
|
|
92
93
|
}>,
|
|
93
94
|
] => {
|
|
94
|
-
const state =
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const keepEqualParts = options?.keepEqualParts ?? false;
|
|
99
|
-
|
|
100
|
-
const keepOptions =
|
|
101
|
-
typeof keepEqualParts === 'boolean' ? undefined : keepEqualParts;
|
|
95
|
+
const { state, getSnapshot, commit } = createStateSource(
|
|
96
|
+
initialState,
|
|
97
|
+
options,
|
|
98
|
+
);
|
|
102
99
|
|
|
103
100
|
const dispatch = (action: A): S => {
|
|
104
|
-
const currentState =
|
|
101
|
+
const currentState = getSnapshot();
|
|
105
102
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
const nextState =
|
|
109
|
-
keepEqualParts === false
|
|
110
|
-
? reduced
|
|
111
|
-
: replaceEqualDeep(currentState, reduced, keepOptions);
|
|
112
|
-
|
|
113
|
-
// Once completed, `next` keeps the state held and returns it.
|
|
114
|
-
return equals(currentState, nextState)
|
|
115
|
-
? currentState
|
|
116
|
-
: state.next(nextState);
|
|
103
|
+
return commit(currentState, reducer(currentState, action));
|
|
117
104
|
};
|
|
118
105
|
|
|
119
|
-
const getSnapshot = (): S => state.getSnapshot().value;
|
|
120
|
-
|
|
121
106
|
return [state, dispatch, { getSnapshot, initialState }] as const;
|
|
122
107
|
};
|
|
123
108
|
|
|
@@ -1,26 +1,6 @@
|
|
|
1
1
|
import type { InitializedObservable } from '../core/index.mjs';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
type Action<S> = Readonly<
|
|
5
|
-
| {
|
|
6
|
-
type: 'set';
|
|
7
|
-
nextState: S;
|
|
8
|
-
}
|
|
9
|
-
| {
|
|
10
|
-
type: 'update';
|
|
11
|
-
updateFn: (a: S) => S;
|
|
12
|
-
}
|
|
13
|
-
>;
|
|
14
|
-
|
|
15
|
-
const reducer = <S,>(state: S, action: Action<S>): S => {
|
|
16
|
-
switch (action.type) {
|
|
17
|
-
case 'set':
|
|
18
|
-
return action.nextState;
|
|
19
|
-
|
|
20
|
-
case 'update':
|
|
21
|
-
return action.updateFn(state);
|
|
22
|
-
}
|
|
23
|
-
};
|
|
2
|
+
import type { StateOptions } from './create-reducer.mjs';
|
|
3
|
+
import { createStateSource } from './state-source.mjs';
|
|
24
4
|
|
|
25
5
|
/**
|
|
26
6
|
* Creates a reactive state container with getter and setter methods.
|
|
@@ -161,19 +141,22 @@ export const createState = <S,>(
|
|
|
161
141
|
initialState: S;
|
|
162
142
|
}>,
|
|
163
143
|
] => {
|
|
164
|
-
const
|
|
165
|
-
reducer,
|
|
144
|
+
const { state, getSnapshot, commit } = createStateSource(
|
|
166
145
|
initialState,
|
|
167
146
|
options,
|
|
168
147
|
);
|
|
169
148
|
|
|
170
|
-
|
|
171
|
-
|
|
149
|
+
// Each compares with the state the write started from, as `dispatch`
|
|
150
|
+
// does, and builds nothing on the way.
|
|
151
|
+
const updateState = (updateFn: (prev: S) => S): S => {
|
|
152
|
+
const currentState = getSnapshot();
|
|
153
|
+
|
|
154
|
+
return commit(currentState, updateFn(currentState));
|
|
155
|
+
};
|
|
172
156
|
|
|
173
|
-
const setState = (nextState: S): S =>
|
|
157
|
+
const setState = (nextState: S): S => commit(getSnapshot(), nextState);
|
|
174
158
|
|
|
175
|
-
const resetState = (): S =>
|
|
176
|
-
dispatch({ type: 'set', nextState: initialState });
|
|
159
|
+
const resetState = (): S => commit(getSnapshot(), initialState);
|
|
177
160
|
|
|
178
161
|
return [
|
|
179
162
|
state,
|
|
@@ -77,6 +77,24 @@ describe(createState, () => {
|
|
|
77
77
|
assert.deepStrictEqual(seen, [held]);
|
|
78
78
|
});
|
|
79
79
|
|
|
80
|
+
test('updateState compares the result with the state updateFn was given', () => {
|
|
81
|
+
const [state, setState, { updateState }] = createState(0);
|
|
82
|
+
|
|
83
|
+
const seen = record(state);
|
|
84
|
+
|
|
85
|
+
// updateFn writes the state itself, then returns what it was given:
|
|
86
|
+
// equal to that, so nothing more is written and 5 stays.
|
|
87
|
+
updateState((prev) => {
|
|
88
|
+
setState(5);
|
|
89
|
+
|
|
90
|
+
return prev;
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
assert.deepStrictEqual(seen, [0, 5]);
|
|
94
|
+
|
|
95
|
+
assert.strictEqual(state.getSnapshot().value, 5);
|
|
96
|
+
});
|
|
97
|
+
|
|
80
98
|
describe('keepEqualParts', () => {
|
|
81
99
|
type Report = Readonly<{
|
|
82
100
|
summary: Readonly<{ open: number }>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { replaceEqualDeep } from 'ts-data-forge';
|
|
2
|
+
import { source, type InitializedSourceObservable } from '../core/index.mjs';
|
|
3
|
+
import type { StateOptions } from './create-reducer.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* What `createState` and `createReducer` are both built on: the source
|
|
7
|
+
* holding the state, its current value, and `commit`, the one way either
|
|
8
|
+
* writes it. `commit` writes `reduced` unless `equals` finds it the same as
|
|
9
|
+
* `currentState`, after keeping the parts of `currentState` it did not change
|
|
10
|
+
* when `keepEqualParts` asks for that, and returns the state written, or
|
|
11
|
+
* `currentState` when nothing was.
|
|
12
|
+
*
|
|
13
|
+
* Not part of the package's API: `gen:index:src` leaves this file out of the
|
|
14
|
+
* barrel.
|
|
15
|
+
*/
|
|
16
|
+
export const createStateSource = <S,>(
|
|
17
|
+
initialState: S,
|
|
18
|
+
options: StateOptions<S> | undefined,
|
|
19
|
+
): Readonly<{
|
|
20
|
+
state: InitializedSourceObservable<S>;
|
|
21
|
+
getSnapshot: () => S;
|
|
22
|
+
commit: (currentState: S, reduced: S) => S;
|
|
23
|
+
}> => {
|
|
24
|
+
const state = source<S>(initialState);
|
|
25
|
+
|
|
26
|
+
const getSnapshot = (): S => state.getSnapshot().value;
|
|
27
|
+
|
|
28
|
+
const equals = options?.equals ?? Object.is;
|
|
29
|
+
|
|
30
|
+
const keepEqualParts = options?.keepEqualParts ?? false;
|
|
31
|
+
|
|
32
|
+
const keepOptions =
|
|
33
|
+
typeof keepEqualParts === 'boolean' ? undefined : keepEqualParts;
|
|
34
|
+
|
|
35
|
+
const commit = (currentState: S, reduced: S): S => {
|
|
36
|
+
const nextState =
|
|
37
|
+
keepEqualParts === false
|
|
38
|
+
? reduced
|
|
39
|
+
: replaceEqualDeep(currentState, reduced, keepOptions);
|
|
40
|
+
|
|
41
|
+
// Once completed, `next` keeps the state held and returns it.
|
|
42
|
+
return equals(currentState, nextState)
|
|
43
|
+
? currentState
|
|
44
|
+
: state.next(nextState);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return { state, getSnapshot, commit };
|
|
48
|
+
};
|