synstate 6.0.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.
Files changed (64) hide show
  1. package/README.md +4 -3
  2. package/dist/core/class/manager-observable-class.d.mts.map +1 -1
  3. package/dist/core/class/manager-observable-class.mjs +6 -0
  4. package/dist/core/class/manager-observable-class.mjs.map +1 -1
  5. package/dist/core/class/observable-base-class.d.mts +8 -0
  6. package/dist/core/class/observable-base-class.d.mts.map +1 -1
  7. package/dist/core/class/observable-base-class.mjs +16 -1
  8. package/dist/core/class/observable-base-class.mjs.map +1 -1
  9. package/dist/core/class/propagation-state.d.mts +6 -3
  10. package/dist/core/class/propagation-state.d.mts.map +1 -1
  11. package/dist/core/class/propagation-state.mjs +4 -0
  12. package/dist/core/class/propagation-state.mjs.map +1 -1
  13. package/dist/core/combine/combine.d.mts.map +1 -1
  14. package/dist/core/combine/combine.mjs +3 -43
  15. package/dist/core/combine/combine.mjs.map +1 -1
  16. package/dist/core/combine/derive.d.mts +63 -0
  17. package/dist/core/combine/derive.d.mts.map +1 -0
  18. package/dist/core/combine/derive.mjs +124 -0
  19. package/dist/core/combine/derive.mjs.map +1 -0
  20. package/dist/core/combine/index.d.mts +1 -0
  21. package/dist/core/combine/index.d.mts.map +1 -1
  22. package/dist/core/combine/index.mjs +1 -0
  23. package/dist/core/combine/index.mjs.map +1 -1
  24. package/dist/core/types/id.d.mts +2 -1
  25. package/dist/core/types/id.d.mts.map +1 -1
  26. package/dist/core/types/observable-family.d.mts +3 -0
  27. package/dist/core/types/observable-family.d.mts.map +1 -1
  28. package/dist/core/types/observable-family.mjs.map +1 -1
  29. package/dist/core/types/observable.d.mts +2 -1
  30. package/dist/core/types/observable.d.mts.map +1 -1
  31. package/dist/core/types/observable.mjs.map +1 -1
  32. package/dist/core/utils/id-maker.d.mts +7 -0
  33. package/dist/core/utils/id-maker.d.mts.map +1 -1
  34. package/dist/core/utils/id-maker.mjs +9 -0
  35. package/dist/core/utils/id-maker.mjs.map +1 -1
  36. package/dist/utils/create-reducer.d.mts +2 -2
  37. package/dist/utils/create-reducer.d.mts.map +1 -1
  38. package/dist/utils/create-reducer.mjs +4 -16
  39. package/dist/utils/create-reducer.mjs.map +1 -1
  40. package/dist/utils/create-state.d.mts +1 -1
  41. package/dist/utils/create-state.d.mts.map +1 -1
  42. package/dist/utils/create-state.mjs +10 -13
  43. package/dist/utils/create-state.mjs.map +1 -1
  44. package/dist/utils/state-source.d.mts +19 -0
  45. package/dist/utils/state-source.d.mts.map +1 -0
  46. package/dist/utils/state-source.mjs +31 -0
  47. package/dist/utils/state-source.mjs.map +1 -0
  48. package/package.json +13 -11
  49. package/src/core/class/manager-observable-class.mts +7 -0
  50. package/src/core/class/observable-base-class.mts +22 -2
  51. package/src/core/class/propagation-state.mts +11 -7
  52. package/src/core/class/unobserved-write.test.mts +194 -0
  53. package/src/core/combine/combine.mts +7 -72
  54. package/src/core/combine/derive.mts +172 -0
  55. package/src/core/combine/derive.test.mts +190 -0
  56. package/src/core/combine/index.mts +1 -0
  57. package/src/core/types/id.mts +2 -1
  58. package/src/core/types/observable-family.mts +18 -0
  59. package/src/core/types/observable.mts +2 -1
  60. package/src/core/utils/id-maker.mts +10 -0
  61. package/src/utils/create-reducer.mts +9 -24
  62. package/src/utils/create-state.mts +12 -29
  63. package/src/utils/create-state.test.mts +18 -0
  64. package/src/utils/state-source.mts +48 -0
@@ -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
+ };