synstate 4.1.0 → 5.0.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 (73) hide show
  1. package/README.md +58 -1
  2. package/dist/core/class/child-observable-class.d.mts +30 -14
  3. package/dist/core/class/child-observable-class.d.mts.map +1 -1
  4. package/dist/core/class/child-observable-class.mjs +39 -25
  5. package/dist/core/class/child-observable-class.mjs.map +1 -1
  6. package/dist/core/class/create-child-observable.d.mts +8 -5
  7. package/dist/core/class/create-child-observable.d.mts.map +1 -1
  8. package/dist/core/class/create-child-observable.mjs.map +1 -1
  9. package/dist/core/class/manager-observable-class.d.mts +4 -15
  10. package/dist/core/class/manager-observable-class.d.mts.map +1 -1
  11. package/dist/core/class/manager-observable-class.mjs +5 -91
  12. package/dist/core/class/manager-observable-class.mjs.map +1 -1
  13. package/dist/core/class/observable-base-class.d.mts +9 -2
  14. package/dist/core/class/observable-base-class.d.mts.map +1 -1
  15. package/dist/core/class/observable-base-class.mjs +17 -0
  16. package/dist/core/class/observable-base-class.mjs.map +1 -1
  17. package/dist/core/class/observable-node.d.mts +4 -8
  18. package/dist/core/class/observable-node.d.mts.map +1 -1
  19. package/dist/core/class/observable-node.mjs.map +1 -1
  20. package/dist/core/class/propagation-state.d.mts +26 -0
  21. package/dist/core/class/propagation-state.d.mts.map +1 -1
  22. package/dist/core/class/propagation-state.mjs +190 -0
  23. package/dist/core/class/propagation-state.mjs.map +1 -1
  24. package/dist/core/operators/index.d.mts +1 -0
  25. package/dist/core/operators/index.d.mts.map +1 -1
  26. package/dist/core/operators/index.mjs +1 -0
  27. package/dist/core/operators/index.mjs.map +1 -1
  28. package/dist/core/operators/keep-equal-parts.d.mts +85 -0
  29. package/dist/core/operators/keep-equal-parts.d.mts.map +1 -0
  30. package/dist/core/operators/keep-equal-parts.mjs +129 -0
  31. package/dist/core/operators/keep-equal-parts.mjs.map +1 -0
  32. package/dist/core/operators/merge-map.mjs +1 -3
  33. package/dist/core/operators/merge-map.mjs.map +1 -1
  34. package/dist/core/operators/switch-map.mjs +1 -3
  35. package/dist/core/operators/switch-map.mjs.map +1 -1
  36. package/dist/core/types/id.d.mts +6 -2
  37. package/dist/core/types/id.d.mts.map +1 -1
  38. package/dist/core/types/observable-family.d.mts +1 -0
  39. package/dist/core/types/observable-family.d.mts.map +1 -1
  40. package/dist/core/utils/id-maker.d.mts +0 -8
  41. package/dist/core/utils/id-maker.d.mts.map +1 -1
  42. package/dist/core/utils/id-maker.mjs +1 -11
  43. package/dist/core/utils/id-maker.mjs.map +1 -1
  44. package/dist/utils/create-reducer.d.mts +30 -1
  45. package/dist/utils/create-reducer.d.mts.map +1 -1
  46. package/dist/utils/create-reducer.mjs +8 -1
  47. package/dist/utils/create-reducer.mjs.map +1 -1
  48. package/dist/utils/create-state.d.mts +53 -1
  49. package/dist/utils/create-state.d.mts.map +1 -1
  50. package/dist/utils/create-state.mjs +52 -0
  51. package/dist/utils/create-state.mjs.map +1 -1
  52. package/package.json +14 -14
  53. package/src/core/class/child-observable-class.mts +60 -55
  54. package/src/core/class/create-child-observable.mts +8 -5
  55. package/src/core/class/manager-observable-class.mts +15 -134
  56. package/src/core/class/observable-base-class.mts +23 -2
  57. package/src/core/class/observable-node.mts +5 -11
  58. package/src/core/class/propagation-order.test.mts +107 -0
  59. package/src/core/class/propagation-state.mts +262 -0
  60. package/src/core/class/remove-completed.test.mts +2 -2
  61. package/src/core/class/update-loop.test.mts +104 -0
  62. package/src/core/operators/flat-map-sync-inner.test.mts +90 -0
  63. package/src/core/operators/index.mts +1 -0
  64. package/src/core/operators/keep-equal-parts.mts +167 -0
  65. package/src/core/operators/keep-equal-parts.test.mts +132 -0
  66. package/src/core/operators/merge-map.mts +1 -3
  67. package/src/core/operators/switch-map.mts +1 -3
  68. package/src/core/types/id.mts +6 -2
  69. package/src/core/types/observable-family.mts +5 -0
  70. package/src/core/utils/id-maker.mts +1 -12
  71. package/src/utils/create-reducer.mts +42 -2
  72. package/src/utils/create-state.mts +53 -1
  73. package/src/utils/create-state.test.mts +88 -0
@@ -8,6 +8,7 @@
8
8
  import { Optional } from 'ts-data-forge';
9
9
  import { unreachable } from 'ts-std-forge';
10
10
  import { getCurrentScopeInternals, notUpdatedYet, observableBrand, toSubscriber, } from '../utils/index.mjs';
11
+ import { enqueueChildren } from './propagation-state.mjs';
11
12
 
12
13
 
13
14
 
@@ -38,6 +39,7 @@ export class ObservableBaseClass {
38
39
  #mut_children;
39
40
  #mut_subscribers;
40
41
  #mut_scope;
42
+ #mut_queuedFor;
41
43
  kind;
42
44
  depth;
43
45
  constructor({ kind, depth, initialValue, }) {
@@ -46,6 +48,7 @@ export class ObservableBaseClass {
46
48
  this.#mut_snapshot = initialValue;
47
49
  this.#mut_isCompleted = false;
48
50
  this.#mut_updateToken = notUpdatedYet;
51
+ this.#mut_queuedFor = undefined;
49
52
  this.#mut_children = undefined;
50
53
  this.#mut_subscribers = undefined;
51
54
  this.#mut_scope = undefined;
@@ -76,6 +79,12 @@ export class ObservableBaseClass {
76
79
  }
77
80
  return false;
78
81
  }
82
+ get queuedFor() {
83
+ return this.#mut_queuedFor;
84
+ }
85
+ setQueuedFor(updateToken) {
86
+ this.#mut_queuedFor = updateToken;
87
+ }
79
88
  addChild(child) {
80
89
 
81
90
 
@@ -90,9 +99,17 @@ export class ObservableBaseClass {
90
99
  this.#mut_children?.delete(child);
91
100
  }
92
101
 
102
+
103
+
104
+
105
+
106
+
93
107
  setNext(nextValue, updateToken) {
94
108
  this.#mut_updateToken = updateToken;
95
109
  this.#mut_snapshot = Optional.some(nextValue);
110
+ if (this.#mut_children !== undefined) {
111
+ enqueueChildren(this.#mut_children, updateToken);
112
+ }
96
113
  if (this.#mut_subscribers !== undefined) {
97
114
  for (const s of this.#mut_subscribers) {
98
115
  s.onNext(nextValue);
@@ -1 +1 @@
1
- {"version":3,"file":"observable-base-class.mjs","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observable-base-class.mjs","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"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"}
@@ -14,21 +14,17 @@ type NodeInternals = Readonly<{
14
14
  addChild: (child: ChildNode) => void;
15
15
  deleteChild: (child: ChildNode) => void;
16
16
  /**
17
- * The managers this node's own descendants register to: itself for a
18
- * manager, its parents' for a sync child, shared with its parent when it
19
- * has one. Cached so that creating a child does not walk its ancestors.
17
+ * The last update that queued this node (`propagation-state.mts`). Left in
18
+ * place after the visit: the next update has another token.
20
19
  */
21
- managers: readonly ManagerNode[];
20
+ queuedFor: UpdateToken | undefined;
21
+ setQueuedFor: (updateToken: UpdateToken) => void;
22
22
  }>;
23
23
  /** An observable, as the other nodes of the graph see it. */
24
24
  export type ObservableNode<A = unknown> = NodeInternals & Observable<A>;
25
25
  export type ChildNode = NodeInternals & ObservableBase<unknown> & Readonly<{
26
26
  parents: readonly Observable<unknown>[];
27
27
  }>;
28
- export type ManagerNode = NodeInternals & ObservableBase<unknown> & Readonly<{
29
- addDescendant: (child: ChildNode) => void;
30
- deleteDescendant: (child: ChildNode) => void;
31
- }>;
32
28
  /**
33
29
  * The one place a public observable is seen as the node it is. Every
34
30
  * observable is built by a synstate class, and the public types carry a
@@ -1 +1 @@
1
- {"version":3,"file":"observable-node.d.mts","sourceRoot":"","sources":["../../../src/core/class/observable-node.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,KAAK,aAAa,GAAG,QAAQ,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,OAAO,CAAC;IAC9B,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAExC;;;;OAIG;IACH,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAClC,CAAC,CAAC;AAEH,6DAA6D;AAC7D,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAExE,MAAM,MAAM,SAAS,GAAG,aAAa,GACnC,cAAc,CAAC,OAAO,CAAC,GACvB,QAAQ,CAAC;IACP,OAAO,EAAE,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;CACzC,CAAC,CAAC;AAEL,MAAM,MAAM,WAAW,GAAG,aAAa,GACrC,cAAc,CAAC,OAAO,CAAC,GACvB,QAAQ,CAAC;IACP,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,gBAAgB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CAC9C,CAAC,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,cAAe,UAAU,CAAC,CAAC,CAAC,KAAG,cAAc,CAAC,CAAC,CAEtC,CAAC"}
1
+ {"version":3,"file":"observable-node.d.mts","sourceRoot":"","sources":["../../../src/core/class/observable-node.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,KAAK,aAAa,GAAG,QAAQ,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,OAAO,CAAC;IAC9B,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAExC;;;OAGG;IACH,SAAS,EAAE,WAAW,GAAG,SAAS,CAAC;IAEnC,YAAY,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;CAClD,CAAC,CAAC;AAEH,6DAA6D;AAC7D,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAExE,MAAM,MAAM,SAAS,GAAG,aAAa,GACnC,cAAc,CAAC,OAAO,CAAC,GACvB,QAAQ,CAAC;IACP,OAAO,EAAE,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;CACzC,CAAC,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,cAAe,UAAU,CAAC,CAAC,CAAC,KAAG,cAAc,CAAC,CAAC,CAEtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"observable-node.mjs","sourceRoot":"","sources":["../../../src/core/class/observable-node.mts"],"names":[],"mappings":"AA6CA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAK,UAAyB,EAAqB,EAAE;AACzE,4DAA4D;AAC5D,UAA+B,CAAC"}
1
+ {"version":3,"file":"observable-node.mjs","sourceRoot":"","sources":["../../../src/core/class/observable-node.mts"],"names":[],"mappings":"AAuCA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAK,UAAyB,EAAqB,EAAE;AACzE,4DAA4D;AAC5D,UAA+B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { UpdateToken } from '../types/index.mjs';
2
+ import type { ChildNode } from './observable-node.mjs';
2
3
  /**
3
4
  * Whether some observable's update is propagating right now. A root written
4
5
  * to while one is, is written to from inside a subscriber or a projection
@@ -21,4 +22,29 @@ export declare const beginPropagation: (updateToken: UpdateToken) => void;
21
22
  * has ended.
22
23
  */
23
24
  export declare const endPropagation: () => void;
25
+ /**
26
+ * Opens an update started by a node at `depth`, and returns its token. The
27
+ * token is the update's queue: a node that emits with it puts its children
28
+ * there, whichever copy of synstate the node belongs to, so that an update
29
+ * reaches every node its value reaches, and each once, in ascending depth.
30
+ * Close it with {@link closeUpdate}.
31
+ */
32
+ export declare const openUpdate: (depth: number) => UpdateToken;
33
+ /**
34
+ * How many updates of one copy may be open at once, one inside another. An
35
+ * update opens inside another only when a subscriber or projection writes to
36
+ * a root while the outer one is propagating; a chain of such writes this deep
37
+ * is a loop that would otherwise run until the stack overflows.
38
+ */
39
+ export declare const maxUpdateNesting = 100;
40
+ export declare const updateLoopMessage: `synstate: more than ${string} updates were nested, one started inside another: a subscriber or projection keeps writing to an observable whose update reaches it again. Make the write stop (a condition, or a value equal to the current one), or derive the value with map / combine.`;
41
+ /** Visits every node the update has queued, shallowest first. */
42
+ export declare const drainUpdate: (updateToken: UpdateToken) => void;
43
+ /** Closes an update, emptying what an exception left in its buckets. */
44
+ export declare const closeUpdate: (updateToken: UpdateToken) => void;
45
+ /**
46
+ * Puts the children of a node that emitted with `updateToken` into that
47
+ * update's queue. The update may belong to another copy of synstate.
48
+ */
49
+ export declare const enqueueChildren: (children: ReadonlySet<ChildNode>, updateToken: UpdateToken) => void;
24
50
  //# sourceMappingURL=propagation-state.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"propagation-state.d.mts","sourceRoot":"","sources":["../../../src/core/class/propagation-state.mts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAiBtD;;;;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,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,gBAAiB,WAAW,KAAG,IAM3D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,IAcjC,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;AAiBvD;;;;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,8DAA8D;AAC9D,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"}
@@ -7,7 +7,12 @@
7
7
 
8
8
 
9
9
 
10
+
11
+
12
+
13
+
10
14
  import { Arr } from 'ts-data-forge';
15
+ import { panic } from 'ts-std-forge';
11
16
 
12
17
 
13
18
 
@@ -63,4 +68,189 @@ export const endPropagation = () => {
63
68
  mut_afterPropagation.shift()?.();
64
69
  }
65
70
  };
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+ const mut_bucketSets = [];
79
+
80
+ const mut_queueState = { level: 0 };
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+ export const openUpdate = (depth) => {
89
+ if (mut_queueState.level >= maxUpdateNesting) {
90
+
91
+
92
+
93
+
94
+ panic(updateLoopMessage);
95
+ }
96
+ mut_queueState.level += 1;
97
+ return toToken(new UpdateQueue(depth + 1, mut_queueState.level));
98
+ };
99
+
100
+
101
+
102
+
103
+
104
+
105
+ export const maxUpdateNesting = 100;
106
+ export const updateLoopMessage = `synstate: more than ${maxUpdateNesting.toString()} updates were nested, one started inside another: a subscriber or projection keeps writing to an observable whose update reaches it again. Make the write stop (a condition, or a value equal to the current one), or derive the value with map / combine.`;
107
+
108
+ export const drainUpdate = (updateToken) => {
109
+ toQueue(updateToken).drain();
110
+ };
111
+
112
+ export const closeUpdate = (updateToken) => {
113
+ toQueue(updateToken).close();
114
+ mut_queueState.level -= 1;
115
+ };
116
+
117
+
118
+
119
+
120
+ export const enqueueChildren = (children, updateToken) => {
121
+ toQueue(updateToken).enqueueChildren(children);
122
+ };
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+ class UpdateQueue {
134
+ #base;
135
+
136
+
137
+ #mut_buckets;
138
+ #mut_size;
139
+ #mut_isOpen;
140
+ #mut_queuedDespiteMark;
141
+
142
+ constructor(base, level) {
143
+ this.#base = base;
144
+ const mut_buckets = mut_bucketSets[level - 1] ?? [];
145
+ mut_bucketSets[level - 1] = mut_buckets;
146
+ this.#mut_buckets = mut_buckets;
147
+ this.#mut_size = 0;
148
+ this.#mut_isOpen = true;
149
+ this.#mut_queuedDespiteMark = undefined;
150
+ }
151
+ #push(child) {
152
+ const index = child.depth - this.#base;
153
+ const mut_buckets = this.#mut_buckets;
154
+ while (mut_buckets.length <= index) {
155
+ mut_buckets.push({ nodes: [], length: 0 });
156
+ }
157
+ if (index >= this.#mut_size) {
158
+ this.#mut_size = index + 1;
159
+ }
160
+
161
+
162
+ const mut_bucket = mut_buckets[index];
163
+ const { nodes: mut_nodes, length } = mut_bucket;
164
+ if (length < mut_nodes.length) {
165
+ mut_nodes[length] = child;
166
+ }
167
+ else {
168
+ mut_nodes.push(child);
169
+ }
170
+ mut_bucket.length = length + 1;
171
+ }
172
+
173
+ get isOpen() {
174
+ return this.#mut_isOpen;
175
+ }
176
+ enqueueChildren(children) {
177
+ const ownMark = toToken(this);
178
+ for (const child of children) {
179
+ const mark = child.queuedFor;
180
+ if (mark === ownMark) {
181
+ continue;
182
+ }
183
+ if (mark !== undefined && toQueue(mark).isOpen) {
184
+
185
+
186
+ if (this.#mut_queuedDespiteMark === undefined) {
187
+ this.#mut_queuedDespiteMark = new Set();
188
+ }
189
+ else if (this.#mut_queuedDespiteMark.has(child)) {
190
+ continue;
191
+ }
192
+ this.#mut_queuedDespiteMark.add(child);
193
+ }
194
+ else {
195
+ child.setQueuedFor(ownMark);
196
+ }
197
+ this.#push(child);
198
+ }
199
+ }
200
+ drain() {
201
+ const token = toToken(this);
202
+ const mut_buckets = this.#mut_buckets;
203
+
204
+
205
+
206
+ for (let mut_index = 0; mut_index < this.#mut_size; mut_index += 1) {
207
+ const mut_bucket = mut_buckets[mut_index];
208
+ if (mut_bucket === undefined) {
209
+ continue;
210
+ }
211
+
212
+
213
+
214
+ const { nodes: mut_nodes, length } = mut_bucket;
215
+
216
+ for (let mut_slot = 0; mut_slot < length; mut_slot += 1) {
217
+ const node = mut_nodes[mut_slot];
218
+
219
+
220
+ mut_nodes[mut_slot] = undefined;
221
+ if (node !== undefined && !node.isCompleted) {
222
+ node.tryUpdate(token);
223
+ }
224
+ }
225
+ mut_bucket.length = 0;
226
+ }
227
+ this.#mut_size = 0;
228
+ }
229
+ close() {
230
+ const mut_buckets = this.#mut_buckets;
231
+
232
+
233
+ for (let mut_index = 0; mut_index < this.#mut_size; mut_index += 1) {
234
+ const mut_bucket = mut_buckets[mut_index];
235
+ if (mut_bucket === undefined) {
236
+ continue;
237
+ }
238
+ mut_bucket.nodes.fill(undefined, 0, mut_bucket.length);
239
+ mut_bucket.length = 0;
240
+ }
241
+ this.#mut_size = 0;
242
+ this.#mut_isOpen = false;
243
+ this.#mut_queuedDespiteMark = undefined;
244
+ }
245
+ }
246
+
247
+
248
+
249
+
250
+ const toQueue = (updateToken) =>
251
+
252
+ updateToken;
253
+ const toToken = (queue) =>
254
+
255
+ queue;
66
256
  //# sourceMappingURL=propagation-state.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"propagation-state.mjs","sourceRoot":"","sources":["../../../src/core/class/propagation-state.mts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAGpC;;;GAGG;AACH,MAAM,eAAe,GAGjB,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AAE5C;;;GAGG;AACH,MAAM,oBAAoB,GAAmB,EAAE,CAAC;AAEhD;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAY,EAAE,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;AAEtE,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAA4B,EAAE,CAChE,eAAe,CAAC,cAAc,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAgB,EAAQ,EAAE;IAC5D,IAAI,aAAa,EAAE,EAAE,CAAC;QACpB,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,IAAI,EAAE,CAAC;IACT,CAAC;AACH,CAAC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,WAAwB,EAAQ,EAAE;IACjE,IAAI,eAAe,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAChC,eAAe,CAAC,cAAc,GAAG,WAAW,CAAC;IAC/C,CAAC;IAED,eAAe,CAAC,KAAK,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAS,EAAE;IACvC,eAAe,CAAC,KAAK,IAAI,CAAC,CAAC;IAE3B,IAAI,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,eAAe,CAAC,cAAc,GAAG,SAAS,CAAC;IAE3C,0EAA0E;IAC1E,2CAA2C;IAC3C,OAAO,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC5C,oBAAoB,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"propagation-state.mjs","sourceRoot":"","sources":["../../../src/core/class/propagation-state.mts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export * from './audit.mjs';
2
2
  export * from './debounce.mjs';
3
3
  export * from './filter.mjs';
4
+ export * from './keep-equal-parts.mjs';
4
5
  export * from './map.mjs';
5
6
  export * from './merge-map.mjs';
6
7
  export * from './pairwise.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/operators/index.mts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/operators/index.mts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from './audit.mjs';
2
2
  export * from './debounce.mjs';
3
3
  export * from './filter.mjs';
4
+ export * from './keep-equal-parts.mjs';
4
5
  export * from './map.mjs';
5
6
  export * from './merge-map.mjs';
6
7
  export * from './pairwise.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/core/operators/index.mts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/core/operators/index.mts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { type ReplaceEqualDeepOptions } from 'ts-data-forge';
2
+ import type { KeepInitialValueOperator } from '../types/index.mjs';
3
+ /**
4
+ * Passes on each value with every part deeply equal to the same part of the
5
+ * value passed on before replaced by that part, and skips a value deeply
6
+ * equal to it altogether (structural sharing). A reader of a part that did
7
+ * not change keeps the object it has, so `skipIfNoChange()` with `Object.is`
8
+ * stops it. Superset of `skipIfNoChange(fastDeepEqual)`.
9
+ *
10
+ * **Prefer keeping references where the value is written** — compare before
11
+ * `setState`, and skip it when nothing changed — so that nothing downstream
12
+ * has anything to undo. The `keepEqualParts` option of `createState` and
13
+ * `createReducer` does it for a state written whole, and `replaceEqualDeep`
14
+ * of ts-data-forge does it for any other write. This operator lets every
15
+ * update that changes nothing reach the source and everything up to it, and
16
+ * walks the whole value again on each one; reach for it when the source is
17
+ * not yours to change (a stream that arrives whole from outside).
18
+ *
19
+ * Array items are matched by index; pass `{ key }` to match them by key, an
20
+ * item for which `key` returns `undefined` being matched by index. Only plain
21
+ * objects and arrays are walked into; a `Map`, a `Set`, a `Date` or a class
22
+ * instance is compared and kept whole. The values must not be changed after
23
+ * they are passed on, because the parts kept are shared by later values.
24
+ *
25
+ * @template A - The type of values from the source
26
+ * @param options - `key`, to match array items by key rather than by index
27
+ * @returns An operator that keeps the parts that did not change
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * type Board = DeepReadonly<{
32
+ * title: string;
33
+ * cards: { id: number; text: string }[];
34
+ * }>;
35
+ *
36
+ * // A stream that arrives whole from outside (a WebSocket, say), each
37
+ * // message a new object even when nothing changed. A state you write
38
+ * // yourself takes `createState(initial, { keepEqualParts: true })`
39
+ * // instead.
40
+ * const message$ = source<Board>();
41
+ *
42
+ * const board$ = message$.pipe(keepEqualParts());
43
+ *
44
+ * const firstCard$ = board$
45
+ * .pipe(map((board) => board.cards[0]))
46
+ * .pipe(skipIfNoChange());
47
+ *
48
+ * const boardHistory: Board[] = [];
49
+ *
50
+ * board$.subscribe((board) => {
51
+ * boardHistory.push(board);
52
+ * });
53
+ *
54
+ * const firstCardHistory: unknown[] = [];
55
+ *
56
+ * firstCard$.subscribe((card) => {
57
+ * firstCardHistory.push(card);
58
+ * });
59
+ *
60
+ * message$.next({ title: 'todo', cards: [{ id: 1, text: 'a' }] });
61
+ *
62
+ * // Equal to the last one: nothing is passed on.
63
+ * message$.next({ title: 'todo', cards: [{ id: 1, text: 'a' }] });
64
+ *
65
+ * assert.strictEqual(boardHistory.length, 1);
66
+ *
67
+ * // A card added: a new board, but the first card is the one passed on
68
+ * // before, so `firstCard$` is not told of it.
69
+ * message$.next({
70
+ * title: 'todo',
71
+ * cards: [
72
+ * { id: 1, text: 'a' },
73
+ * { id: 2, text: 'b' },
74
+ * ],
75
+ * });
76
+ *
77
+ * assert.strictEqual(boardHistory.length, 2);
78
+ *
79
+ * assert.strictEqual(boardHistory[1]?.cards[0], boardHistory[0]?.cards[0]);
80
+ *
81
+ * assert.strictEqual(firstCardHistory.length, 1);
82
+ * ```
83
+ */
84
+ export declare const keepEqualParts: <A>(options?: ReplaceEqualDeepOptions) => KeepInitialValueOperator<A, A>;
85
+ //# sourceMappingURL=keep-equal-parts.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keep-equal-parts.d.mts","sourceRoot":"","sources":["../../../src/core/operators/keep-equal-parts.mts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAEV,wBAAwB,EAGzB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,YACpB,uBAAuB,KAChC,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAMQ,CAAC"}
@@ -0,0 +1,129 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+ import { Optional, replaceEqualDeep, } from 'ts-data-forge';
9
+ import { SyncChildObservableClass } from '../class/index.mjs';
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+ export const keepEqualParts = (options) =>
92
+
93
+ ((parentObservable) => new KeepEqualPartsObservableClass(parentObservable, options));
94
+ class KeepEqualPartsObservableClass extends SyncChildObservableClass {
95
+ #options;
96
+ #mut_previousValue;
97
+ constructor(parentObservable, options) {
98
+ super({
99
+ parents: [parentObservable],
100
+ initialValue: parentObservable.getSnapshot(),
101
+ });
102
+ this.#mut_previousValue = parentObservable.getSnapshot();
103
+ this.#options = options;
104
+ this.attach();
105
+ }
106
+ tryUpdate(updateToken) {
107
+ const par = this.parents[0];
108
+ const sn = par.getSnapshot();
109
+ if (par.updateToken !== updateToken || Optional.isNone(sn)) {
110
+ return;
111
+ }
112
+ const prev = this.#mut_previousValue;
113
+ if (Optional.isNone(prev)) {
114
+ this.#mut_previousValue = sn;
115
+ this.setNext(sn.value, updateToken);
116
+ return;
117
+ }
118
+ const kept = replaceEqualDeep(prev.value, sn.value, this.#options);
119
+ if (Object.is(kept, prev.value)) {
120
+ return;
121
+ }
122
+
123
+ this.#mut_previousValue = Object.is(kept, sn.value)
124
+ ? sn
125
+ : Optional.some(kept);
126
+ this.setNext(kept, updateToken);
127
+ }
128
+ }
129
+ //# sourceMappingURL=keep-equal-parts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keep-equal-parts.mjs","sourceRoot":"","sources":["../../../src/core/operators/keep-equal-parts.mts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,yCAAyC;AACzC,2CAA2C;AAC3C,gDAAgD;AAChD,0DAA0D;AAC1D,kEAAkE;AAClE,OAAO,EACL,QAAQ,EACR,gBAAgB,GAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAQ9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,OAAiC,EACD,EAAE;AAClC,4DAA4D;AAC5D,CAAC,CAAC,gBAAgB,EAAE,EAAE,CACpB,IAAI,6BAA6B,CAC/B,gBAAgB,EAChB,OAAO,CACR,CAAmC,CAAC;AAEzC,MAAM,6BACJ,SAAQ,wBAAyC;IAGxC,QAAQ,CAAsC;IACvD,kBAAkB,CAAc;IAEhC,YACE,gBAA+B,EAC/B,OAA4C;QAE5C,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,YAAY,EAAE,gBAAgB,CAAC,WAAW,EAAE;SAC7C,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAEzD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAEQ,SAAS,CAAC,WAAwB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE5B,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAE7B,IAAI,GAAG,CAAC,WAAW,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,cAAc;QACxB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAErC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;YAE7B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAEpC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnE,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC;YACjD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -137,9 +137,7 @@ class MergeMapObservableClass extends AsyncChildObservableClass {
137
137
  const innerScope = createScope(this.#ownerScope);
138
138
  this.#mut_innerScopes = Arr.toPushed(this.#mut_innerScopes, innerScope);
139
139
  const observable = innerScope.run(() => this.#mapToObservable(sn.value));
140
- const subscription = observable.subscribe((curr) => {
141
- this.startUpdate(curr);
142
- });
140
+ const subscription = this.subscribeInner(observable, updateToken);
143
141
  this.#mut_subscriptions = Arr.toPushed(this.#mut_subscriptions, subscription);
144
142
  }
145
143
 
@@ -1 +1 @@
1
- {"version":3,"file":"merge-map.mjs","sourceRoot":"","sources":["../../../src/core/operators/merge-map.mts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,yCAAyC;AACzC,2CAA2C;AAC3C,gDAAgD;AAChD,0DAA0D;AAC1D,kEAAkE;AAClE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAUlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgGG;AACH,MAAM,CAAC,MAAM,QAAQ,GACnB,CACE,eAA2C,EACX,EAAE,CACpC,CAAC,gBAAgB,EAAE,EAAE,CACnB,IAAI,uBAAuB,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEhC,MAAM,uBACJ,SAAQ,yBAA0C;IAGzC,gBAAgB,CAA6B;IAEtD,sCAAsC;IAC7B,WAAW,CAAoB;IAExC,gBAAgB,CAAmB;IACnC,kBAAkB,CAA0B;IAE5C,YACE,gBAA+B,EAC/B,eAA2C;QAE3C,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,YAAY,EAAE,QAAQ,CAAC,IAAI;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QAExC,IAAI,CAAC,WAAW,GAAG,eAAe,EAAE,CAAC;QAErC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAE3B,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAEQ,SAAS,CAAC,WAAwB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE5B,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAE7B,IAAI,GAAG,CAAC,WAAW,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,cAAc;QACxB,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEjD,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;QAExE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAEzE,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACjD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,QAAQ,CACpC,IAAI,CAAC,kBAAkB,EACvB,YAAY,CACb,CAAC;IACJ,CAAC;IAED,yEAAyE;IACtD,QAAQ;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxC,CAAC,CAAC,WAAW,EAAE,CAAC;QAClB,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1C,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"merge-map.mjs","sourceRoot":"","sources":["../../../src/core/operators/merge-map.mts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,yCAAyC;AACzC,2CAA2C;AAC3C,gDAAgD;AAChD,0DAA0D;AAC1D,kEAAkE;AAClE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAUlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgGG;AACH,MAAM,CAAC,MAAM,QAAQ,GACnB,CACE,eAA2C,EACX,EAAE,CACpC,CAAC,gBAAgB,EAAE,EAAE,CACnB,IAAI,uBAAuB,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEhC,MAAM,uBACJ,SAAQ,yBAA0C;IAGzC,gBAAgB,CAA6B;IAEtD,sCAAsC;IAC7B,WAAW,CAAoB;IAExC,gBAAgB,CAAmB;IACnC,kBAAkB,CAA0B;IAE5C,YACE,gBAA+B,EAC/B,eAA2C;QAE3C,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,YAAY,EAAE,QAAQ,CAAC,IAAI;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QAExC,IAAI,CAAC,WAAW,GAAG,eAAe,EAAE,CAAC;QAErC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAE3B,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAEQ,SAAS,CAAC,WAAwB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE5B,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAE7B,IAAI,GAAG,CAAC,WAAW,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,cAAc;QACxB,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEjD,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;QAExE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAEzE,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAElE,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,QAAQ,CACpC,IAAI,CAAC,kBAAkB,EACvB,YAAY,CACb,CAAC;IACJ,CAAC;IAED,yEAAyE;IACtD,QAAQ;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxC,CAAC,CAAC,WAAW,EAAE,CAAC;QAClB,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1C,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;CACF"}