synstate 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +58 -1
  2. package/dist/core/class/child-observable-class.d.mts +4 -7
  3. package/dist/core/class/child-observable-class.d.mts.map +1 -1
  4. package/dist/core/class/child-observable-class.mjs +8 -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/create/empty.d.mts +32 -0
  25. package/dist/core/create/empty.d.mts.map +1 -0
  26. package/dist/core/create/empty.mjs +39 -0
  27. package/dist/core/create/empty.mjs.map +1 -0
  28. package/dist/core/create/index.d.mts +1 -0
  29. package/dist/core/create/index.d.mts.map +1 -1
  30. package/dist/core/create/index.mjs +1 -0
  31. package/dist/core/create/index.mjs.map +1 -1
  32. package/dist/core/operators/index.d.mts +1 -0
  33. package/dist/core/operators/index.d.mts.map +1 -1
  34. package/dist/core/operators/index.mjs +1 -0
  35. package/dist/core/operators/index.mjs.map +1 -1
  36. package/dist/core/operators/keep-equal-parts.d.mts +85 -0
  37. package/dist/core/operators/keep-equal-parts.d.mts.map +1 -0
  38. package/dist/core/operators/keep-equal-parts.mjs +129 -0
  39. package/dist/core/operators/keep-equal-parts.mjs.map +1 -0
  40. package/dist/core/types/id.d.mts +6 -2
  41. package/dist/core/types/id.d.mts.map +1 -1
  42. package/dist/core/types/observable-family.d.mts +1 -0
  43. package/dist/core/types/observable-family.d.mts.map +1 -1
  44. package/dist/core/utils/id-maker.d.mts +0 -8
  45. package/dist/core/utils/id-maker.d.mts.map +1 -1
  46. package/dist/core/utils/id-maker.mjs +1 -11
  47. package/dist/core/utils/id-maker.mjs.map +1 -1
  48. package/dist/utils/create-reducer.d.mts +30 -1
  49. package/dist/utils/create-reducer.d.mts.map +1 -1
  50. package/dist/utils/create-reducer.mjs +8 -1
  51. package/dist/utils/create-reducer.mjs.map +1 -1
  52. package/dist/utils/create-state.d.mts +53 -1
  53. package/dist/utils/create-state.d.mts.map +1 -1
  54. package/dist/utils/create-state.mjs +52 -0
  55. package/dist/utils/create-state.mjs.map +1 -1
  56. package/package.json +10 -10
  57. package/src/core/class/child-observable-class.mts +15 -49
  58. package/src/core/class/create-child-observable.mts +8 -5
  59. package/src/core/class/manager-observable-class.mts +15 -134
  60. package/src/core/class/observable-base-class.mts +23 -2
  61. package/src/core/class/observable-node.mts +5 -11
  62. package/src/core/class/propagation-order.test.mts +107 -0
  63. package/src/core/class/propagation-state.mts +262 -0
  64. package/src/core/class/remove-completed.test.mts +2 -2
  65. package/src/core/class/update-loop.test.mts +104 -0
  66. package/src/core/create/empty.mts +42 -0
  67. package/src/core/create/empty.test.mts +65 -0
  68. package/src/core/create/index.mts +1 -0
  69. package/src/core/operators/index.mts +1 -0
  70. package/src/core/operators/keep-equal-parts.mts +167 -0
  71. package/src/core/operators/keep-equal-parts.test.mts +132 -0
  72. package/src/core/types/id.mts +6 -2
  73. package/src/core/types/observable-family.mts +5 -0
  74. package/src/core/utils/id-maker.mts +1 -12
  75. package/src/utils/create-reducer.mts +42 -2
  76. package/src/utils/create-state.mts +53 -1
  77. package/src/utils/create-state.test.mts +88 -0
@@ -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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"}
@@ -0,0 +1,32 @@
1
+ import type { RootObservable } from '../types/index.mjs';
2
+ /**
3
+ * Creates an Observable that holds no value and is already completed, so it
4
+ * never passes anything on (almost equivalent to RxJS `EMPTY`). Useful inside
5
+ * `switchMap` for the branch that should follow nothing, where a `source()`
6
+ * would offer a `next` that nothing calls.
7
+ *
8
+ * @template A - The type of the values it would carry
9
+ * @returns An Observable with no value that is already completed
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const nothing$ = empty<number>();
14
+ *
15
+ * const valueHistory: number[] = [];
16
+ *
17
+ * nothing$.subscribe(
18
+ * (value) => {
19
+ * valueHistory.push(value);
20
+ * },
21
+ * () => {
22
+ * // onComplete — called immediately since empty() completes right away
23
+ * },
24
+ * );
25
+ *
26
+ * assert.deepStrictEqual(valueHistory, []);
27
+ *
28
+ * assert.strictEqual(nothing$.isCompleted, true);
29
+ * ```
30
+ */
31
+ export declare const empty: <A>() => RootObservable<A>;
32
+ //# sourceMappingURL=empty.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty.d.mts","sourceRoot":"","sources":["../../../src/core/create/empty.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,OAAM,cAAc,CAAC,CAAC,CAQ5C,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { Optional } from 'ts-data-forge';
2
+ import { RootObservableClass } from '../class/index.mjs';
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+ export const empty = () => {
33
+ const obs = new RootObservableClass({
34
+ initialValue: Optional.none,
35
+ });
36
+ obs.complete();
37
+ return obs;
38
+ };
39
+ //# sourceMappingURL=empty.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty.mjs","sourceRoot":"","sources":["../../../src/core/create/empty.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,GAA0B,EAAE;IAC/C,MAAM,GAAG,GAAG,IAAI,mBAAmB,CAAI;QACrC,YAAY,EAAE,QAAQ,CAAC,IAAI;KAC5B,CAAC,CAAC;IAEH,GAAG,CAAC,QAAQ,EAAE,CAAC;IAEf,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './counter.mjs';
2
+ export * from './empty.mjs';
2
3
  export * from './from-abortable-promise.mjs';
3
4
  export * from './from-promise.mjs';
4
5
  export * from './from-subscribable.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/create/index.mts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/create/index.mts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './counter.mjs';
2
+ export * from './empty.mjs';
2
3
  export * from './from-abortable-promise.mjs';
3
4
  export * from './from-promise.mjs';
4
5
  export * from './from-subscribable.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/core/create/index.mts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/core/create/index.mts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,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.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"}
@@ -1,3 +1,7 @@
1
- import type { Brand } from 'ts-type-forge';
2
- export type UpdateToken = Brand<symbol, 'update-token'>;
1
+ import type { Brand, UnknownRecord } from 'ts-type-forge';
2
+ /**
3
+ * Identifies one update. Opaque: an object issued per update, which is also
4
+ * that update's queue.
5
+ */
6
+ export type UpdateToken = Brand<UnknownRecord, 'update-token'>;
3
7
  //# 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,MAAM,eAAe,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC"}
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;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC"}
@@ -59,6 +59,7 @@ export type SkipUntilOperatorObservable<A> = SyncChildObservable<A, readonly [A]
59
59
  export type WithCurrentValueFromOperatorObservable<A, B> = SyncChildObservable<readonly [A, B], readonly [A]>;
60
60
  export type WithBufferedFromOperatorObservable<A, B> = SyncChildObservable<readonly [A, readonly B[]], readonly [A]>;
61
61
  export type FilterOperatorObservable<A> = SyncChildObservable<A, readonly [A]>;
62
+ export type KeepEqualPartsOperatorObservable<A> = SyncChildObservable<A, readonly [A]>;
62
63
  export type SkipIfNoChangeOperatorObservable<A> = SyncChildObservable<A, readonly [A]>;
63
64
  export type ThrottleOperatorObservable<A> = SyncChildObservable<A, readonly [A]>;
64
65
  export type AuditOperatorObservable<A> = AsyncChildObservable<A, readonly [A]>;