synstate 3.0.0 → 3.0.2

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 (148) hide show
  1. package/README.md +1 -1
  2. package/dist/core/base/create-child-observable.d.mts.map +1 -1
  3. package/dist/core/base/create-child-observable.mjs +169 -140
  4. package/dist/core/base/create-child-observable.mjs.map +1 -1
  5. package/dist/core/base/create-observable-base.d.mts.map +1 -1
  6. package/dist/core/base/create-observable-base.mjs +155 -152
  7. package/dist/core/base/create-observable-base.mjs.map +1 -1
  8. package/dist/core/base/create-root-observable.mjs +48 -34
  9. package/dist/core/base/create-root-observable.mjs.map +1 -1
  10. package/dist/core/base/index.mjs +3 -3
  11. package/dist/core/base/index.mjs.map +1 -1
  12. package/dist/core/combine/combine.mjs +129 -37
  13. package/dist/core/combine/combine.mjs.map +1 -1
  14. package/dist/core/combine/index.mjs +4 -4
  15. package/dist/core/combine/index.mjs.map +1 -1
  16. package/dist/core/combine/merge.mjs +75 -24
  17. package/dist/core/combine/merge.mjs.map +1 -1
  18. package/dist/core/combine/zip.mjs +120 -39
  19. package/dist/core/combine/zip.mjs.map +1 -1
  20. package/dist/core/create/counter.mjs +81 -45
  21. package/dist/core/create/counter.mjs.map +1 -1
  22. package/dist/core/create/from-abortable-promise.mjs +63 -38
  23. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  24. package/dist/core/create/from-promise.mjs +67 -25
  25. package/dist/core/create/from-promise.mjs.map +1 -1
  26. package/dist/core/create/from-subscribable.mjs +70 -26
  27. package/dist/core/create/from-subscribable.mjs.map +1 -1
  28. package/dist/core/create/index.mjs +8 -8
  29. package/dist/core/create/index.mjs.map +1 -1
  30. package/dist/core/create/just.mjs +36 -13
  31. package/dist/core/create/just.mjs.map +1 -1
  32. package/dist/core/create/source.mjs +15 -19
  33. package/dist/core/create/source.mjs.map +1 -1
  34. package/dist/core/create/timer.mjs +66 -37
  35. package/dist/core/create/timer.mjs.map +1 -1
  36. package/dist/core/index.mjs +6 -41
  37. package/dist/core/index.mjs.map +1 -1
  38. package/dist/core/operators/audit.mjs +126 -39
  39. package/dist/core/operators/audit.mjs.map +1 -1
  40. package/dist/core/operators/debounce.mjs +114 -37
  41. package/dist/core/operators/debounce.mjs.map +1 -1
  42. package/dist/core/operators/filter.mjs +39 -24
  43. package/dist/core/operators/filter.mjs.map +1 -1
  44. package/dist/core/operators/index.mjs +18 -18
  45. package/dist/core/operators/index.mjs.map +1 -1
  46. package/dist/core/operators/map.mjs +74 -26
  47. package/dist/core/operators/map.mjs.map +1 -1
  48. package/dist/core/operators/merge-map.mjs +128 -35
  49. package/dist/core/operators/merge-map.mjs.map +1 -1
  50. package/dist/core/operators/pairwise.mjs +73 -23
  51. package/dist/core/operators/pairwise.mjs.map +1 -1
  52. package/dist/core/operators/scan.mjs +59 -15
  53. package/dist/core/operators/scan.mjs.map +1 -1
  54. package/dist/core/operators/skip-if-no-change.mjs +89 -31
  55. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  56. package/dist/core/operators/skip-until.mjs +71 -29
  57. package/dist/core/operators/skip-until.mjs.map +1 -1
  58. package/dist/core/operators/skip-while.mjs +79 -27
  59. package/dist/core/operators/skip-while.mjs.map +1 -1
  60. package/dist/core/operators/switch-map.mjs +118 -31
  61. package/dist/core/operators/switch-map.mjs.map +1 -1
  62. package/dist/core/operators/take-until.mjs +70 -35
  63. package/dist/core/operators/take-until.mjs.map +1 -1
  64. package/dist/core/operators/take-while.mjs +97 -25
  65. package/dist/core/operators/take-while.mjs.map +1 -1
  66. package/dist/core/operators/throttle.mjs +108 -38
  67. package/dist/core/operators/throttle.mjs.map +1 -1
  68. package/dist/core/operators/with-buffered-from.mjs +94 -47
  69. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  70. package/dist/core/operators/with-current-value-from.mjs +78 -23
  71. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  72. package/dist/core/operators/with-initial-value.mjs +64 -14
  73. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  74. package/dist/core/predefined/index.mjs +2 -12
  75. package/dist/core/predefined/index.mjs.map +1 -1
  76. package/dist/core/predefined/operators/attach-index.mjs +55 -7
  77. package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
  78. package/dist/core/predefined/operators/index.mjs +12 -12
  79. package/dist/core/predefined/operators/index.mjs.map +1 -1
  80. package/dist/core/predefined/operators/map-optional.mjs +48 -5
  81. package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
  82. package/dist/core/predefined/operators/map-result-err.mjs +48 -5
  83. package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
  84. package/dist/core/predefined/operators/map-result-ok.mjs +48 -5
  85. package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
  86. package/dist/core/predefined/operators/map-to.mjs +41 -6
  87. package/dist/core/predefined/operators/map-to.mjs.map +1 -1
  88. package/dist/core/predefined/operators/pluck.mjs +45 -7
  89. package/dist/core/predefined/operators/pluck.mjs.map +1 -1
  90. package/dist/core/predefined/operators/skip.mjs +49 -6
  91. package/dist/core/predefined/operators/skip.mjs.map +1 -1
  92. package/dist/core/predefined/operators/take.mjs +42 -6
  93. package/dist/core/predefined/operators/take.mjs.map +1 -1
  94. package/dist/core/predefined/operators/unwrap-optional.mjs +43 -8
  95. package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
  96. package/dist/core/predefined/operators/unwrap-result-err.mjs +41 -5
  97. package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
  98. package/dist/core/predefined/operators/unwrap-result-ok.mjs +43 -8
  99. package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
  100. package/dist/core/types/id.mjs +2 -2
  101. package/dist/core/types/id.mjs.map +1 -1
  102. package/dist/core/types/index.mjs +7 -3
  103. package/dist/core/types/index.mjs.map +1 -1
  104. package/dist/core/types/observable-family.d.mts +2 -2
  105. package/dist/core/types/observable-family.d.mts.map +1 -1
  106. package/dist/core/types/observable-family.mjs +10 -2
  107. package/dist/core/types/observable-family.mjs.map +1 -1
  108. package/dist/core/types/observable-kind.mjs +2 -2
  109. package/dist/core/types/observable-kind.mjs.map +1 -1
  110. package/dist/core/types/observable.mjs +14 -6
  111. package/dist/core/types/observable.mjs.map +1 -1
  112. package/dist/core/types/timer.d.mts +11 -1
  113. package/dist/core/types/timer.d.mts.map +1 -1
  114. package/dist/core/types/timer.mjs +2 -2
  115. package/dist/core/types/timer.mjs.map +1 -1
  116. package/dist/core/types/types.mjs +9 -2
  117. package/dist/core/types/types.mjs.map +1 -1
  118. package/dist/core/utils/id-maker.mjs +10 -11
  119. package/dist/core/utils/id-maker.mjs.map +1 -1
  120. package/dist/core/utils/index.mjs +5 -5
  121. package/dist/core/utils/index.mjs.map +1 -1
  122. package/dist/core/utils/max-depth.mjs +7 -4
  123. package/dist/core/utils/max-depth.mjs.map +1 -1
  124. package/dist/core/utils/observable-utils.mjs +4 -7
  125. package/dist/core/utils/observable-utils.mjs.map +1 -1
  126. package/dist/core/utils/utils.mjs +32 -28
  127. package/dist/core/utils/utils.mjs.map +1 -1
  128. package/dist/entry-point.mjs +2 -46
  129. package/dist/entry-point.mjs.map +1 -1
  130. package/dist/index.mjs +3 -46
  131. package/dist/index.mjs.map +1 -1
  132. package/dist/utils/collect-to-array.mjs +8 -13
  133. package/dist/utils/collect-to-array.mjs.map +1 -1
  134. package/dist/utils/create-boolean-state.mjs +47 -22
  135. package/dist/utils/create-boolean-state.mjs.map +1 -1
  136. package/dist/utils/create-event-emitter.mjs +67 -19
  137. package/dist/utils/create-event-emitter.mjs.map +1 -1
  138. package/dist/utils/create-reducer.mjs +54 -16
  139. package/dist/utils/create-reducer.mjs.map +1 -1
  140. package/dist/utils/create-state.mjs +54 -27
  141. package/dist/utils/create-state.mjs.map +1 -1
  142. package/dist/utils/index.mjs +6 -6
  143. package/dist/utils/index.mjs.map +1 -1
  144. package/package.json +14 -12
  145. package/src/core/base/create-child-observable.mts +6 -1
  146. package/src/core/base/create-observable-base.mts +8 -1
  147. package/src/core/types/observable-family.mts +53 -34
  148. package/src/core/types/timer.mts +11 -2
@@ -1,42 +1,129 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { createAsyncChildObservable } from '../base/create-child-observable.mjs';
3
- import '../utils/id-maker.mjs';
4
-
5
- const audit = (milliSeconds) => (
6
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
7
- ((parentObservable) => createAuditObservable(
8
- parentObservable,
9
- milliSeconds
10
- ))
11
- );
2
+ import { createAsyncChildObservable } from '../base/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
+
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
+
92
+
93
+
94
+
95
+
96
+
97
+ export const audit = (milliSeconds) =>
98
+
99
+ ((parentObservable) => createAuditObservable(parentObservable, milliSeconds));
12
100
  const createAuditObservable = (parentObservable, milliSeconds) => {
13
- let mut_timerId = void 0;
14
- let mut_isSkipping = false;
15
- const resetTimer = () => {
16
- if (mut_timerId !== void 0) {
17
- clearTimeout(mut_timerId);
18
- }
19
- };
20
- return createAsyncChildObservable(
21
- {
22
- parents: [parentObservable],
23
- initialValue: parentObservable.getSnapshot(),
24
- onComplete: resetTimer
25
- },
26
- ({ startUpdate }) => (updateToken) => {
27
- if (mut_isSkipping || parentObservable.updateToken !== updateToken || Optional.isNone(parentObservable.getSnapshot())) {
28
- return;
29
- }
30
- mut_isSkipping = true;
31
- mut_timerId = setTimeout(() => {
32
- const sn = parentObservable.getSnapshot();
33
- if (Optional.isNone(sn)) return;
34
- startUpdate(sn.value);
35
- mut_isSkipping = false;
36
- }, milliSeconds);
37
- }
38
- );
39
- };
101
+ let mut_timerId = undefined;
102
+ let mut_isSkipping = false;
103
+ const resetTimer = () => {
104
+ if (mut_timerId !== undefined) {
105
+ clearTimeout(mut_timerId);
106
+ }
107
+ };
108
+ return createAsyncChildObservable({
109
+ parents: [parentObservable],
110
+ initialValue: parentObservable.getSnapshot(),
111
+ onComplete: resetTimer,
112
+ }, ({ startUpdate }) => (updateToken) => {
113
+ if (mut_isSkipping ||
114
+ parentObservable.updateToken !== updateToken ||
115
+ Optional.isNone(parentObservable.getSnapshot())) {
116
+ return;
117
+ }
40
118
 
41
- export { audit };
42
- //# sourceMappingURL=audit.mjs.map
119
+ mut_isSkipping = true;
120
+ mut_timerId = setTimeout(() => {
121
+ const sn = parentObservable.getSnapshot();
122
+ if (Optional.isNone(sn))
123
+ return;
124
+ startUpdate(sn.value);
125
+ mut_isSkipping = false;
126
+ }, milliSeconds);
127
+ });
128
+ };
129
+ //# sourceMappingURL=audit.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit.mjs","sources":["../../../src/core/operators/audit.mts"],"sourcesContent":["import { Optional } from 'ts-data-forge';\nimport { createAsyncChildObservable } from '../base/index.mjs';\nimport {\n type AuditOperatorObservable,\n type KeepInitialValueOperator,\n type Observable,\n type TimerId,\n} from '../types/index.mjs';\n\n/**\n * Ignores source values for duration milliseconds, then emits the most recent value from the source Observable, then repeats this process.\n *\n * Unlike `throttle` which emits the first value, `audit` emits the last value.\n *\n * @template A - The type of values from the source\n * @param milliSeconds - The audit time window in milliseconds\n * @returns An operator that audits emissions from the observable\n *\n * @example\n * ```ts\n * // Timeline (250ms audit):\n * //\n * // Time(x50ms) 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0\n * //\n * // input$ 0 2 3 9 10 11 12 13 14\n * // |- 250ms -> |- 250ms -> |- 250ms -> |- 250ms ->\n * // audited$ 2 3 11 14 (emitted at end of window)\n * //\n * // Explanation:\n * // - audit emits the LAST value received during each time window\n * // - Unlike throttle (which emits the FIRST value), audit emits the LAST\n * // - Useful when you want the most recent value after a burst of events\n *\n * const input$ = source<number>();\n *\n * const audited$ = input$.pipe(audit(250));\n *\n * const valueHistory: number[] = [];\n *\n * audited$.subscribe((value) => {\n * valueHistory.push(value);\n * });\n *\n * const sleep = (ms: number): Promise<void> =>\n * new Promise((resolve) => {\n * setTimeout(resolve, ms);\n * });\n *\n * input$.next(0);\n *\n * await sleep(200);\n *\n * input$.next(2);\n *\n * assert.deepStrictEqual(valueHistory, []);\n *\n * await sleep(100);\n *\n * assert.deepStrictEqual(valueHistory, [2]);\n *\n * input$.next(3);\n *\n * await sleep(300);\n *\n * assert.deepStrictEqual(valueHistory, [2, 3]);\n *\n * await sleep(300);\n *\n * input$.next(9);\n *\n * await sleep(100);\n *\n * input$.next(10);\n *\n * await sleep(100);\n *\n * input$.next(11);\n *\n * assert.deepStrictEqual(valueHistory, [2, 3]);\n *\n * await sleep(100);\n *\n * assert.deepStrictEqual(valueHistory, [2, 3, 11]);\n *\n * input$.next(12);\n *\n * await sleep(100);\n *\n * input$.next(13);\n *\n * assert.deepStrictEqual(valueHistory, [2, 3, 11]);\n *\n * await sleep(100);\n *\n * input$.next(14);\n *\n * assert.deepStrictEqual(valueHistory, [2, 3, 11]);\n *\n * await sleep(100);\n *\n * assert.deepStrictEqual(valueHistory, [2, 3, 11, 14]);\n * ```\n */\nexport const audit = <A,>(\n milliSeconds: number,\n): KeepInitialValueOperator<A, A> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n ((parentObservable) =>\n createAuditObservable(\n parentObservable,\n milliSeconds,\n )) as KeepInitialValueOperator<A, A>;\n\nconst createAuditObservable = <A,>(\n parentObservable: Observable<A>,\n milliSeconds: number,\n): AuditOperatorObservable<A> => {\n let mut_timerId: TimerId | undefined = undefined;\n\n let mut_isSkipping = false;\n\n const resetTimer = (): void => {\n if (mut_timerId !== undefined) {\n clearTimeout(mut_timerId);\n }\n };\n\n return createAsyncChildObservable(\n {\n parents: [parentObservable],\n initialValue: parentObservable.getSnapshot(),\n onComplete: resetTimer,\n },\n ({ startUpdate }) =>\n (updateToken) => {\n if (\n mut_isSkipping ||\n parentObservable.updateToken !== updateToken ||\n Optional.isNone(parentObservable.getSnapshot())\n ) {\n return; // skip update\n }\n\n // set timer\n mut_isSkipping = true;\n\n mut_timerId = setTimeout(() => {\n const sn = parentObservable.getSnapshot();\n\n if (Optional.isNone(sn)) return;\n\n startUpdate(sn.value);\n\n mut_isSkipping = false;\n }, milliSeconds);\n },\n );\n};\n"],"names":[],"mappings":";;;;AAuGO,MAAM,QAAQ,CACnB,YAAA;AAAA;AAAA,GAGC,CAAC,gBAAA,KACA,qBAAA;AAAA,IACE,gBAAA;AAAA,IACA;AAAA,GACF;AAAA;AAEJ,MAAM,qBAAA,GAAwB,CAC5B,gBAAA,EACA,YAAA,KAC+B;AAC/B,EAAA,IAAI,WAAA,GAAmC,MAAA;AAEvC,EAAA,IAAI,cAAA,GAAiB,KAAA;AAErB,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,YAAA,CAAa,WAAW,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,0BAAA;AAAA,IACL;AAAA,MACE,OAAA,EAAS,CAAC,gBAAgB,CAAA;AAAA,MAC1B,YAAA,EAAc,iBAAiB,WAAA,EAAY;AAAA,MAC3C,UAAA,EAAY;AAAA,KACd;AAAA,IACA,CAAC,EAAE,WAAA,EAAY,KACb,CAAC,WAAA,KAAgB;AACf,MAAA,IACE,cAAA,IACA,iBAAiB,WAAA,KAAgB,WAAA,IACjC,SAAS,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,CAAA,EAC9C;AACA,QAAA;AAAA,MACF;AAGA,MAAA,cAAA,GAAiB,IAAA;AAEjB,MAAA,WAAA,GAAc,WAAW,MAAM;AAC7B,QAAA,MAAM,EAAA,GAAK,iBAAiB,WAAA,EAAY;AAExC,QAAA,IAAI,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG;AAEzB,QAAA,WAAA,CAAY,GAAG,KAAK,CAAA;AAEpB,QAAA,cAAA,GAAiB,KAAA;AAAA,MACnB,GAAG,YAAY,CAAA;AAAA,IACjB;AAAA,GACJ;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"audit.mjs","sourceRoot":"","sources":["../../../src/core/operators/audit.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAQ/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6FG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,YAAoB,EACY,EAAE;AAClC,oEAAoE;AACpE,CAAC,CAAC,gBAAgB,EAAE,EAAE,CACpB,qBAAqB,CACnB,gBAAgB,EAChB,YAAY,CACb,CAAmC,CAAC;AAEzC,MAAM,qBAAqB,GAAG,CAC5B,gBAA+B,EAC/B,YAAoB,EACQ,EAAE;IAC9B,IAAI,WAAW,GAAwB,SAAS,CAAC;IAEjD,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,YAAY,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,0BAA0B,CAC/B;QACE,OAAO,EAAE,CAAC,gBAAgB,CAAC;QAC3B,YAAY,EAAE,gBAAgB,CAAC,WAAW,EAAE;QAC5C,UAAU,EAAE,UAAU;KACvB,EACD,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAClB,CAAC,WAAW,EAAE,EAAE;QACd,IACE,cAAc;YACd,gBAAgB,CAAC,WAAW,KAAK,WAAW;YAC5C,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,EAC/C,CAAC;YACD,OAAO,CAAC,cAAc;QACxB,CAAC;QAED,YAAY;QACZ,cAAc,GAAG,IAAI,CAAC;QAEtB,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;YAE1C,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,OAAO;YAEhC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YAEtB,cAAc,GAAG,KAAK,CAAC;QACzB,CAAC,EAAE,YAAY,CAAC,CAAC;IACnB,CAAC,CACJ,CAAC;AACJ,CAAC,CAAC"}
@@ -1,40 +1,117 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { createAsyncChildObservable } from '../base/create-child-observable.mjs';
3
- import '../utils/id-maker.mjs';
4
-
5
- const debounce = (milliSeconds) => (
6
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
7
- ((parentObservable) => createDebounceObservable(
8
- parentObservable,
9
- milliSeconds
10
- ))
11
- );
2
+ import { createAsyncChildObservable } from '../base/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
+
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
+ export const debounce = (milliSeconds) =>
89
+
90
+ ((parentObservable) => createDebounceObservable(parentObservable, milliSeconds));
12
91
  const createDebounceObservable = (parentObservable, milliSeconds) => {
13
- let mut_timerId = void 0;
14
- const resetTimer = () => {
15
- if (mut_timerId !== void 0) {
16
- clearTimeout(mut_timerId);
17
- }
18
- };
19
- return createAsyncChildObservable(
20
- {
21
- parents: [parentObservable],
22
- initialValue: parentObservable.getSnapshot(),
23
- onComplete: resetTimer
24
- },
25
- ({ startUpdate }) => (updateToken) => {
26
- const sn = parentObservable.getSnapshot();
27
- if (parentObservable.updateToken !== updateToken || Optional.isNone(sn)) {
28
- return;
29
- }
30
- resetTimer();
31
- mut_timerId = setTimeout(() => {
32
- if (Optional.isNone(sn)) return;
33
- startUpdate(sn.value);
34
- }, milliSeconds);
35
- }
36
- );
37
- };
92
+ let mut_timerId = undefined;
93
+ const resetTimer = () => {
94
+ if (mut_timerId !== undefined) {
95
+ clearTimeout(mut_timerId);
96
+ }
97
+ };
98
+ return createAsyncChildObservable({
99
+ parents: [parentObservable],
100
+ initialValue: parentObservable.getSnapshot(),
101
+ onComplete: resetTimer,
102
+ }, ({ startUpdate }) => (updateToken) => {
103
+ const sn = parentObservable.getSnapshot();
104
+ if (parentObservable.updateToken !== updateToken ||
105
+ Optional.isNone(sn)) {
106
+ return;
107
+ }
108
+ resetTimer();
38
109
 
39
- export { debounce };
40
- //# sourceMappingURL=debounce.mjs.map
110
+ mut_timerId = setTimeout(() => {
111
+ if (Optional.isNone(sn))
112
+ return;
113
+ startUpdate(sn.value);
114
+ }, milliSeconds);
115
+ });
116
+ };
117
+ //# sourceMappingURL=debounce.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.mjs","sources":["../../../src/core/operators/debounce.mts"],"sourcesContent":["import { Optional } from 'ts-data-forge';\nimport { createAsyncChildObservable } from '../base/index.mjs';\nimport {\n type DebounceOperatorObservable,\n type KeepInitialValueOperator,\n type Observable,\n type TimerId,\n} from '../types/index.mjs';\n\n/**\n * Delays emissions from the source observable until a specified time has passed without another emission.\n * Useful for handling user input events like typing or scrolling.\n *\n * @template A - The type of values from the source\n * @param milliSeconds - The debounce duration in milliseconds\n * @returns An operator that debounces the observable\n *\n * @example\n * ```ts\n * // Timeline (250ms debounce):\n * //\n * // Time(x50ms) 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0\n * //\n * // input$ 0 2 3 9 10 11 12 13 14\n * // |- 250ms -> |- 250ms ->\n * // debounced$ 3 14 (emitted after 250ms silence)\n * //\n * // Explanation:\n * // - debounce emits the latest value AFTER a quiet period with no new emissions\n * // - Unlike audit (which uses a fixed window), debounce resets the timer on every emission\n * // - Useful for search-as-you-type and form validation\n *\n * const input$ = source<number>();\n *\n * const debounced$ = input$.pipe(debounce(250));\n *\n * const valueHistory: number[] = [];\n *\n * debounced$.subscribe((value) => {\n * valueHistory.push(value);\n * });\n *\n * const sleep = (ms: number): Promise<void> =>\n * new Promise((resolve) => {\n * setTimeout(resolve, ms);\n * });\n *\n * input$.next(0);\n *\n * await sleep(200);\n *\n * input$.next(2);\n *\n * await sleep(100);\n *\n * input$.next(3);\n *\n * assert.deepStrictEqual(valueHistory, []);\n *\n * await sleep(300);\n *\n * assert.deepStrictEqual(valueHistory, [3]);\n *\n * await sleep(300);\n *\n * input$.next(9);\n *\n * await sleep(100);\n *\n * input$.next(10);\n *\n * await sleep(100);\n *\n * input$.next(11);\n *\n * await sleep(100);\n *\n * input$.next(12);\n *\n * await sleep(100);\n *\n * input$.next(13);\n *\n * await sleep(100);\n *\n * input$.next(14);\n *\n * assert.deepStrictEqual(valueHistory, [3]);\n *\n * await sleep(300);\n *\n * assert.deepStrictEqual(valueHistory, [3, 14]);\n * ```\n */\nexport const debounce = <A,>(\n milliSeconds: number,\n): KeepInitialValueOperator<A, A> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n ((parentObservable) =>\n createDebounceObservable(\n parentObservable,\n milliSeconds,\n )) as KeepInitialValueOperator<A, A>;\n\nconst createDebounceObservable = <A,>(\n parentObservable: Observable<A>,\n milliSeconds: number,\n): DebounceOperatorObservable<A> => {\n let mut_timerId: TimerId | undefined = undefined;\n\n const resetTimer = (): void => {\n if (mut_timerId !== undefined) {\n clearTimeout(mut_timerId);\n }\n };\n\n return createAsyncChildObservable(\n {\n parents: [parentObservable],\n initialValue: parentObservable.getSnapshot(),\n onComplete: resetTimer,\n },\n ({ startUpdate }) =>\n (updateToken) => {\n const sn = parentObservable.getSnapshot();\n\n if (\n parentObservable.updateToken !== updateToken ||\n Optional.isNone(sn)\n ) {\n return; // skip update\n }\n\n resetTimer();\n\n // set timer\n mut_timerId = setTimeout(() => {\n if (Optional.isNone(sn)) return;\n\n startUpdate(sn.value);\n }, milliSeconds);\n },\n );\n};\n"],"names":[],"mappings":";;;;AA8FO,MAAM,WAAW,CACtB,YAAA;AAAA;AAAA,GAGC,CAAC,gBAAA,KACA,wBAAA;AAAA,IACE,gBAAA;AAAA,IACA;AAAA,GACF;AAAA;AAEJ,MAAM,wBAAA,GAA2B,CAC/B,gBAAA,EACA,YAAA,KACkC;AAClC,EAAA,IAAI,WAAA,GAAmC,MAAA;AAEvC,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,YAAA,CAAa,WAAW,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,0BAAA;AAAA,IACL;AAAA,MACE,OAAA,EAAS,CAAC,gBAAgB,CAAA;AAAA,MAC1B,YAAA,EAAc,iBAAiB,WAAA,EAAY;AAAA,MAC3C,UAAA,EAAY;AAAA,KACd;AAAA,IACA,CAAC,EAAE,WAAA,EAAY,KACb,CAAC,WAAA,KAAgB;AACf,MAAA,MAAM,EAAA,GAAK,iBAAiB,WAAA,EAAY;AAExC,MAAA,IACE,iBAAiB,WAAA,KAAgB,WAAA,IACjC,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAClB;AACA,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,EAAW;AAGX,MAAA,WAAA,GAAc,WAAW,MAAM;AAC7B,QAAA,IAAI,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG;AAEzB,QAAA,WAAA,CAAY,GAAG,KAAK,CAAA;AAAA,MACtB,GAAG,YAAY,CAAA;AAAA,IACjB;AAAA,GACJ;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"debounce.mjs","sourceRoot":"","sources":["../../../src/core/operators/debounce.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAQ/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,YAAoB,EACY,EAAE;AAClC,oEAAoE;AACpE,CAAC,CAAC,gBAAgB,EAAE,EAAE,CACpB,wBAAwB,CACtB,gBAAgB,EAChB,YAAY,CACb,CAAmC,CAAC;AAEzC,MAAM,wBAAwB,GAAG,CAC/B,gBAA+B,EAC/B,YAAoB,EACW,EAAE;IACjC,IAAI,WAAW,GAAwB,SAAS,CAAC;IAEjD,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,YAAY,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,0BAA0B,CAC/B;QACE,OAAO,EAAE,CAAC,gBAAgB,CAAC;QAC3B,YAAY,EAAE,gBAAgB,CAAC,WAAW,EAAE;QAC5C,UAAU,EAAE,UAAU;KACvB,EACD,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAClB,CAAC,WAAW,EAAE,EAAE;QACd,MAAM,EAAE,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAE1C,IACE,gBAAgB,CAAC,WAAW,KAAK,WAAW;YAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EACnB,CAAC;YACD,OAAO,CAAC,cAAc;QACxB,CAAC;QAED,UAAU,EAAE,CAAC;QAEb,YAAY;QACZ,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,OAAO;YAEhC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,EAAE,YAAY,CAAC,CAAC;IACnB,CAAC,CACJ,CAAC;AACJ,CAAC,CAAC"}
@@ -1,31 +1,46 @@
1
- import { Optional, asSafeUint, SafeUint, pipe } from 'ts-data-forge';
2
- import { createSyncChildObservable } from '../base/create-child-observable.mjs';
3
- import '../utils/id-maker.mjs';
1
+ import { asSafeUint, Optional, pipe, SafeUint, } from 'ts-data-forge';
2
+ import { createSyncChildObservable } from '../base/index.mjs';
4
3
 
5
- function filter(predicate) {
6
- return (parentObservable) => createFilterObservable(parentObservable, predicate);
4
+
5
+ export function filter(predicate) {
6
+ return (parentObservable) => createFilterObservable(parentObservable, predicate);
7
7
  }
8
- const createFilterObservable = (parentObservable, predicate) => createSyncChildObservable(
9
- {
8
+ const createFilterObservable = (parentObservable, predicate) => createSyncChildObservable({
10
9
  parents: [parentObservable],
11
- initialValue: pipe(parentObservable.getSnapshot()).map(
12
- (sn) => Optional.isNone(sn) ? Optional.none : predicate(sn.value, -1) ? sn : Optional.none
13
- ).value
14
- },
15
- ({ setNext }) => {
10
+ initialValue: pipe(parentObservable.getSnapshot()).map((sn) => Optional.isNone(sn)
11
+ ? Optional.none
12
+ : predicate(sn.value, -1)
13
+ ? sn
14
+ : Optional.none).value,
15
+ }, ({ setNext }) => {
16
16
  let mut_index = -1;
17
17
  return (updateToken) => {
18
- const sn = parentObservable.getSnapshot();
19
- if (parentObservable.updateToken !== updateToken || Optional.isNone(sn)) {
20
- return;
21
- }
22
- mut_index = mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, mut_index);
23
- if (predicate(sn.value, mut_index)) {
24
- setNext(sn.value, updateToken);
25
- }
18
+ const sn = parentObservable.getSnapshot();
19
+ if (parentObservable.updateToken !== updateToken ||
20
+ Optional.isNone(sn)) {
21
+ return;
22
+ }
23
+ mut_index =
24
+ mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, mut_index);
25
+ if (predicate(sn.value, mut_index)) {
26
+ setNext(sn.value, updateToken);
27
+ }
26
28
  };
27
- }
28
- );
29
+ });
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
29
45
 
30
- export { filter };
31
- //# sourceMappingURL=filter.mjs.map
46
+ //# sourceMappingURL=filter.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter.mjs","sources":["../../../src/core/operators/filter.mts"],"sourcesContent":["import {\n asSafeUint,\n expectType,\n Optional,\n pipe,\n SafeUint,\n} from 'ts-data-forge';\nimport { createSyncChildObservable } from '../base/index.mjs';\nimport { source } from '../create/index.mjs';\nimport {\n type DropInitialValueOperator,\n type FilterOperatorObservable,\n type InitializedObservable,\n type Observable,\n} from '../types/index.mjs';\nimport { withInitialValue } from './with-initial-value.mjs';\n\n/**\n * Filters values emitted by the source observable based on a predicate function.\n * Only values that satisfy the predicate will be emitted by the resulting observable.\n *\n * @template A - The type of values from the source\n * @template B - The narrowed type when using type guard\n * @param predicate - A function that tests each value (receives value and index)\n * @returns An operator that filters the observable\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // num$ 1 2 3 4 5 6\n * // even$ 2 4 6\n * //\n * // Explanation:\n * // - filter passes through only values that satisfy the predicate\n * // - Only even numbers (2, 4, 6) are emitted\n *\n * const num$ = source<number>();\n *\n * const even$ = num$.pipe(filter((x) => x % 2 === 0));\n *\n * const valueHistory: number[] = [];\n *\n * even$.subscribe((x) => {\n * valueHistory.push(x);\n * });\n *\n * num$.next(1); // nothing logged\n *\n * num$.next(2); // logs: 2\n *\n * assert.deepStrictEqual(valueHistory, [2]);\n *\n * num$.next(3); // nothing logged\n *\n * num$.next(4); // logs: 4\n *\n * assert.deepStrictEqual(valueHistory, [2, 4]);\n *\n * num$.next(5);\n *\n * num$.next(6);\n *\n * assert.deepStrictEqual(valueHistory, [2, 4, 6]);\n * ```\n */\nexport function filter<A, B extends A>(\n predicate: (value: A, index: SafeUint | -1) => value is B,\n): DropInitialValueOperator<A, B>;\n\nexport function filter<A>(\n predicate: (value: A, index: SafeUint | -1) => boolean,\n): DropInitialValueOperator<A, A>;\n\nexport function filter<A>(\n predicate: (value: A, index: SafeUint | -1) => boolean,\n): DropInitialValueOperator<A, A> {\n return (parentObservable) =>\n createFilterObservable(parentObservable, predicate);\n}\n\nconst createFilterObservable = <A,>(\n parentObservable: Observable<A>,\n predicate: (x: A, index: SafeUint | -1) => boolean,\n): FilterOperatorObservable<A> =>\n createSyncChildObservable(\n {\n parents: [parentObservable],\n initialValue: pipe(parentObservable.getSnapshot()).map((sn) =>\n Optional.isNone(sn)\n ? Optional.none\n : predicate(sn.value, -1)\n ? sn\n : Optional.none,\n ).value,\n },\n ({ setNext }) => {\n let mut_index: SafeUint | -1 = -1;\n\n return (updateToken) => {\n const sn = parentObservable.getSnapshot();\n\n if (\n parentObservable.updateToken !== updateToken ||\n Optional.isNone(sn)\n ) {\n return; // skip update\n }\n\n mut_index =\n mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, mut_index);\n\n if (predicate(sn.value, mut_index)) {\n setNext(sn.value, updateToken);\n }\n };\n },\n );\n\nif (import.meta.vitest !== undefined) {\n test('type test', () => {\n expect(1).toBe(1); // dummy\n });\n\n {\n const s: Observable<number> = source<number>();\n\n const _d1 = s.pipe(filter((x) => x % 2 === 0));\n\n expectType<typeof _d1, Observable<number>>('=');\n }\n\n {\n const s = source<number>();\n\n const m: InitializedObservable<number> = s.pipe(withInitialValue(0));\n\n const _d = m.pipe(filter((x) => x % 2 === 0));\n\n expectType<typeof _d, Observable<number>>('=');\n }\n}\n"],"names":[],"mappings":";;;;AA0EO,SAAS,OACd,SAAA,EACgC;AAChC,EAAA,OAAO,CAAC,gBAAA,KACN,sBAAA,CAAuB,gBAAA,EAAkB,SAAS,CAAA;AACtD;AAEA,MAAM,sBAAA,GAAyB,CAC7B,gBAAA,EACA,SAAA,KAEA,yBAAA;AAAA,EACE;AAAA,IACE,OAAA,EAAS,CAAC,gBAAgB,CAAA;AAAA,IAC1B,YAAA,EAAc,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,CAAA,CAAE,GAAA;AAAA,MAAI,CAAC,EAAA,KACtD,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,GACd,QAAA,CAAS,IAAA,GACT,SAAA,CAAU,EAAA,CAAG,KAAA,EAAO,EAAE,CAAA,GACpB,KACA,QAAA,CAAS;AAAA,KACjB,CAAE;AAAA,GACJ;AAAA,EACA,CAAC,EAAE,OAAA,EAAQ,KAAM;AACf,IAAA,IAAI,SAAA,GAA2B,EAAA;AAE/B,IAAA,OAAO,CAAC,WAAA,KAAgB;AACtB,MAAA,MAAM,EAAA,GAAK,iBAAiB,WAAA,EAAY;AAExC,MAAA,IACE,iBAAiB,WAAA,KAAgB,WAAA,IACjC,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAClB;AACA,QAAA;AAAA,MAAA;AAGF,MAAA,SAAA,GACE,SAAA,KAAc,KAAK,UAAA,CAAW,CAAC,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,SAAS,CAAA;AAE9D,MAAA,IAAI,SAAA,CAAU,EAAA,CAAG,KAAA,EAAO,SAAS,CAAA,EAAG;AAClC,QAAA,OAAA,CAAQ,EAAA,CAAG,OAAO,WAAW,CAAA;AAAA,MAAA;AAC/B,IAAA,CACF;AAAA,EAAA;AAEJ,CAAA;;;;"}
1
+ {"version":3,"file":"filter.mjs","sourceRoot":"","sources":["../../../src/core/operators/filter.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,QAAQ,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAO7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA2D5D,MAAM,UAAU,MAAM,CACpB,SAAsD;IAEtD,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAC1B,sBAAsB,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,sBAAsB,GAAG,CAC7B,gBAA+B,EAC/B,SAAkD,EACrB,EAAE,CAC/B,yBAAyB,CACvB;IACE,OAAO,EAAE,CAAC,gBAAgB,CAAC;IAC3B,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjB,CAAC,CAAC,QAAQ,CAAC,IAAI;QACf,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,QAAQ,CAAC,IAAI,CACpB,CAAC,KAAK;CACR,EACD,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;IACd,IAAI,SAAS,GAAkB,CAAC,CAAC,CAAC;IAElC,OAAO,CAAC,WAAW,EAAE,EAAE;QACrB,MAAM,EAAE,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAE1C,IACE,gBAAgB,CAAC,WAAW,KAAK,WAAW;YAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EACnB,CAAC;YACD,OAAO,CAAC,cAAc;QACxB,CAAC;QAED,SAAS;YACP,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAEhE,IAAI,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CACF,CAAC;AAEJ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;IACrC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;IAC7B,CAAC,CAAC,CAAC;IAEH,CAAC;QACC,MAAM,CAAC,GAAuB,MAAM,EAAU,CAAC;QAE/C,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE/C,UAAU,CAAiC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,CAAC;QACC,MAAM,CAAC,GAAG,MAAM,EAAU,CAAC;QAE3B,MAAM,CAAC,GAAkC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAErE,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE9C,UAAU,CAAgC,GAAG,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
@@ -1,18 +1,18 @@
1
- export { audit } from './audit.mjs';
2
- export { debounce } from './debounce.mjs';
3
- export { filter } from './filter.mjs';
4
- export { map } from './map.mjs';
5
- export { flatMap, mergeMap } from './merge-map.mjs';
6
- export { pairwise } from './pairwise.mjs';
7
- export { scan } from './scan.mjs';
8
- export { distinctUntilChanged, skipIfNoChange } from './skip-if-no-change.mjs';
9
- export { skipUntil } from './skip-until.mjs';
10
- export { skipWhile } from './skip-while.mjs';
11
- export { switchMap } from './switch-map.mjs';
12
- export { takeUntil } from './take-until.mjs';
13
- export { takeWhile } from './take-while.mjs';
14
- export { throttle } from './throttle.mjs';
15
- export { withBuffered, withBufferedFrom } from './with-buffered-from.mjs';
16
- export { withCurrentValueFrom, withLatestFrom } from './with-current-value-from.mjs';
17
- export { withInitialValue } from './with-initial-value.mjs';
18
- //# sourceMappingURL=index.mjs.map
1
+ export * from './audit.mjs';
2
+ export * from './debounce.mjs';
3
+ export * from './filter.mjs';
4
+ export * from './map.mjs';
5
+ export * from './merge-map.mjs';
6
+ export * from './pairwise.mjs';
7
+ export * from './scan.mjs';
8
+ export * from './skip-if-no-change.mjs';
9
+ export * from './skip-until.mjs';
10
+ export * from './skip-while.mjs';
11
+ export * from './switch-map.mjs';
12
+ export * from './take-until.mjs';
13
+ export * from './take-while.mjs';
14
+ export * from './throttle.mjs';
15
+ export * from './with-buffered-from.mjs';
16
+ export * from './with-current-value-from.mjs';
17
+ export * from './with-initial-value.mjs';
18
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
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,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}
@@ -1,31 +1,79 @@
1
- import { Optional, asSafeUint, SafeUint } from 'ts-data-forge';
2
- import { createSyncChildObservable } from '../base/create-child-observable.mjs';
3
- import '../utils/id-maker.mjs';
4
-
5
- const map = (mapFn) => (
6
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
7
- ((parentObservable) => createMapObservable(parentObservable, mapFn))
8
- );
9
- const createMapObservable = (parentObservable, mapFn) => createSyncChildObservable(
10
- {
1
+ import { Optional, SafeUint, asSafeUint } from 'ts-data-forge';
2
+ import { createSyncChildObservable } from '../base/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
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+ export const map = (mapFn) =>
44
+
45
+ ((parentObservable) => createMapObservable(parentObservable, mapFn));
46
+
47
+ const createMapObservable = (parentObservable, mapFn) => createSyncChildObservable({
11
48
  parents: [parentObservable],
12
- initialValue: Optional.map(
13
- parentObservable.getSnapshot(),
14
- (x) => mapFn(x, -1)
15
- )
16
- },
17
- ({ setNext }) => {
49
+ initialValue: Optional.map(parentObservable.getSnapshot(), (x) => mapFn(x, -1)),
50
+ }, ({ setNext }) => {
18
51
  let mut_index = -1;
19
52
  return (updateToken) => {
20
- const sn = parentObservable.getSnapshot();
21
- if (parentObservable.updateToken !== updateToken || Optional.isNone(sn)) {
22
- return;
23
- }
24
- mut_index = mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, mut_index);
25
- setNext(mapFn(sn.value, mut_index), updateToken);
53
+ const sn = parentObservable.getSnapshot();
54
+ if (parentObservable.updateToken !== updateToken ||
55
+ Optional.isNone(sn)) {
56
+ return;
57
+ }
58
+ mut_index =
59
+ mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, mut_index);
60
+ setNext(mapFn(sn.value, mut_index), updateToken);
26
61
  };
27
- }
28
- );
62
+ });
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
29
78
 
30
- export { map };
31
- //# sourceMappingURL=map.mjs.map
79
+ //# sourceMappingURL=map.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"map.mjs","sources":["../../../src/core/operators/map.mts"],"sourcesContent":["import { Optional, SafeUint, asSafeUint, expectType } from 'ts-data-forge';\nimport { createSyncChildObservable } from '../base/index.mjs';\nimport { source } from '../create/index.mjs';\nimport {\n type InitializedObservable,\n type KeepInitialValueOperator,\n type MapOperatorObservable,\n type Observable,\n} from '../types/index.mjs';\nimport { withInitialValue } from './with-initial-value.mjs';\n\n/**\n * Transforms each value emitted by the source using a mapping function that also receives the emission index.\n *\n * @template A - The type of values from the source\n * @template B - The type of mapped values\n * @param mapFn - A function that maps each value (receives value and index)\n * @returns An operator that maps values with index\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // num$ \"A\" \"B\" \"C\"\n * // indexed$ \"0: A\" \"1: B\" \"2: C\"\n * //\n * // Explanation:\n * // - mapWithIndex transforms each value along with its index\n * // - Index starts at 0 and increments with each emission\n *\n * const num$ = source<string>();\n *\n * const indexed$ = num$.pipe(map((x, i) => `${i}: ${x}`));\n *\n * const valueHistory: string[] = [];\n *\n * indexed$.subscribe((s) => {\n * valueHistory.push(s);\n * });\n *\n * num$.next('A'); // 0: A\n *\n * num$.next('B'); // 1: B\n *\n * num$.next('C'); // 2: C\n *\n * assert.deepStrictEqual(valueHistory, ['0: A', '1: B', '2: C']);\n * ```\n */\nexport const map = <A, B>(\n mapFn: (x: A, index: SafeUint | -1) => B,\n): KeepInitialValueOperator<A, B> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n ((parentObservable) =>\n createMapObservable(parentObservable, mapFn)) as KeepInitialValueOperator<\n A,\n B\n >;\n\n/* implementation */\n\nconst createMapObservable = <A, B>(\n parentObservable: Observable<A>,\n mapFn: (x: A, index: SafeUint | -1) => B,\n): MapOperatorObservable<A, B> =>\n createSyncChildObservable(\n {\n parents: [parentObservable],\n initialValue: Optional.map(parentObservable.getSnapshot(), (x) =>\n mapFn(x, -1),\n ),\n },\n ({ setNext }) => {\n let mut_index: SafeUint | -1 = -1;\n\n return (updateToken) => {\n const sn = parentObservable.getSnapshot();\n\n if (\n parentObservable.updateToken !== updateToken ||\n Optional.isNone(sn)\n ) {\n return; // skip update\n }\n\n mut_index =\n mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, mut_index);\n\n setNext(mapFn(sn.value, mut_index), updateToken);\n };\n },\n );\n\nif (import.meta.vitest !== undefined) {\n test('type test', () => {\n expect(1).toBe(1); // dummy\n });\n\n {\n const s: Observable<number> = source<number>();\n\n const _d1 = s.pipe(map((x, i) => x + i));\n\n expectType<typeof _d1, Observable<number>>('=');\n }\n\n {\n const s = source<number>();\n\n const m: InitializedObservable<number> = s.pipe(withInitialValue(0));\n\n const _d = m.pipe(map((x, i) => x + i));\n\n expectType<typeof _d, InitializedObservable<number>>('=');\n }\n}\n"],"names":[],"mappings":";;;;AAiDO,MAAM,MAAM,CACjB,KAAA;AAAA;AAAA,GAGC,CAAC,gBAAA,KACA,mBAAA,CAAoB,gBAAA,EAAkB,KAAK,CAAA;AAAA;AAO/C,MAAM,mBAAA,GAAsB,CAC1B,gBAAA,EACA,KAAA,KAEA,yBAAA;AAAA,EACE;AAAA,IACE,OAAA,EAAS,CAAC,gBAAgB,CAAA;AAAA,IAC1B,cAAc,QAAA,CAAS,GAAA;AAAA,MAAI,iBAAiB,WAAA,EAAY;AAAA,MAAG,CAAC,CAAA,KAC1D,KAAA,CAAM,CAAA,EAAG,EAAE;AAAA;AACb,GACF;AAAA,EACA,CAAC,EAAE,OAAA,EAAQ,KAAM;AACf,IAAA,IAAI,SAAA,GAA2B,EAAA;AAE/B,IAAA,OAAO,CAAC,WAAA,KAAgB;AACtB,MAAA,MAAM,EAAA,GAAK,iBAAiB,WAAA,EAAY;AAExC,MAAA,IACE,iBAAiB,WAAA,KAAgB,WAAA,IACjC,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAClB;AACA,QAAA;AAAA,MAAA;AAGF,MAAA,SAAA,GACE,SAAA,KAAc,KAAK,UAAA,CAAW,CAAC,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,SAAS,CAAA;AAE9D,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,KAAA,EAAO,SAAS,GAAG,WAAW,CAAA;AAAA,IAAA,CACjD;AAAA,EAAA;AAEJ,CAAA;;;;"}
1
+ {"version":3,"file":"map.mjs","sourceRoot":"","sources":["../../../src/core/operators/map.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAO7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,KAAwC,EACR,EAAE;AAClC,oEAAoE;AACpE,CAAC,CAAC,gBAAgB,EAAE,EAAE,CACpB,mBAAmB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAG7C,CAAC;AAEJ,oBAAoB;AAEpB,MAAM,mBAAmB,GAAG,CAC1B,gBAA+B,EAC/B,KAAwC,EACX,EAAE,CAC/B,yBAAyB,CACvB;IACE,OAAO,EAAE,CAAC,gBAAgB,CAAC;IAC3B,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAC/D,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACb;CACF,EACD,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;IACd,IAAI,SAAS,GAAkB,CAAC,CAAC,CAAC;IAElC,OAAO,CAAC,WAAW,EAAE,EAAE;QACrB,MAAM,EAAE,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAE1C,IACE,gBAAgB,CAAC,WAAW,KAAK,WAAW;YAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EACnB,CAAC;YACD,OAAO,CAAC,cAAc;QACxB,CAAC;QAED,SAAS;YACP,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAEhE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC,CACF,CAAC;AAEJ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;IACrC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;IAC7B,CAAC,CAAC,CAAC;IAEH,CAAC;QACC,MAAM,CAAC,GAAuB,MAAM,EAAU,CAAC;QAE/C,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEzC,UAAU,CAAiC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,CAAC;QACC,MAAM,CAAC,GAAG,MAAM,EAAU,CAAC;QAE3B,MAAM,CAAC,GAAkC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAErE,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAExC,UAAU,CAA2C,GAAG,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}