synstate 2.0.2 → 3.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 (230) hide show
  1. package/README.md +2 -2
  2. package/dist/core/base/create-child-observable.d.mts +65 -0
  3. package/dist/core/base/create-child-observable.d.mts.map +1 -0
  4. package/dist/core/base/create-child-observable.mjs +181 -0
  5. package/dist/core/base/create-child-observable.mjs.map +1 -0
  6. package/dist/core/base/create-observable-base.d.mts +82 -0
  7. package/dist/core/base/create-observable-base.d.mts.map +1 -0
  8. package/dist/core/base/create-observable-base.mjs +156 -0
  9. package/dist/core/base/create-observable-base.mjs.map +1 -0
  10. package/dist/core/base/create-root-observable.d.mts +37 -0
  11. package/dist/core/base/create-root-observable.d.mts.map +1 -0
  12. package/dist/core/base/create-root-observable.mjs +50 -0
  13. package/dist/core/base/create-root-observable.mjs.map +1 -0
  14. package/dist/core/base/index.d.mts +3 -0
  15. package/dist/core/base/index.d.mts.map +1 -0
  16. package/dist/core/base/index.mjs +3 -0
  17. package/dist/core/base/index.mjs.map +1 -0
  18. package/dist/core/combine/combine.d.mts.map +1 -1
  19. package/dist/core/combine/combine.mjs +132 -39
  20. package/dist/core/combine/combine.mjs.map +1 -1
  21. package/dist/core/combine/index.mjs +4 -4
  22. package/dist/core/combine/index.mjs.map +1 -1
  23. package/dist/core/combine/merge.d.mts.map +1 -1
  24. package/dist/core/combine/merge.mjs +78 -29
  25. package/dist/core/combine/merge.mjs.map +1 -1
  26. package/dist/core/combine/zip.d.mts.map +1 -1
  27. package/dist/core/combine/zip.mjs +124 -42
  28. package/dist/core/combine/zip.mjs.map +1 -1
  29. package/dist/core/create/counter.d.mts.map +1 -1
  30. package/dist/core/create/counter.mjs +82 -57
  31. package/dist/core/create/counter.mjs.map +1 -1
  32. package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
  33. package/dist/core/create/from-abortable-promise.mjs +62 -36
  34. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  35. package/dist/core/create/from-promise.d.mts.map +1 -1
  36. package/dist/core/create/from-promise.mjs +67 -25
  37. package/dist/core/create/from-promise.mjs.map +1 -1
  38. package/dist/core/create/from-subscribable.d.mts.map +1 -1
  39. package/dist/core/create/from-subscribable.mjs +72 -28
  40. package/dist/core/create/from-subscribable.mjs.map +1 -1
  41. package/dist/core/create/index.mjs +8 -8
  42. package/dist/core/create/index.mjs.map +1 -1
  43. package/dist/core/create/just.d.mts.map +1 -1
  44. package/dist/core/create/just.mjs +36 -12
  45. package/dist/core/create/just.mjs.map +1 -1
  46. package/dist/core/create/source.mjs +15 -20
  47. package/dist/core/create/source.mjs.map +1 -1
  48. package/dist/core/create/timer.d.mts.map +1 -1
  49. package/dist/core/create/timer.mjs +67 -44
  50. package/dist/core/create/timer.mjs.map +1 -1
  51. package/dist/core/index.d.mts +0 -1
  52. package/dist/core/index.d.mts.map +1 -1
  53. package/dist/core/index.mjs +6 -44
  54. package/dist/core/index.mjs.map +1 -1
  55. package/dist/core/operators/audit.d.mts.map +1 -1
  56. package/dist/core/operators/audit.mjs +127 -48
  57. package/dist/core/operators/audit.mjs.map +1 -1
  58. package/dist/core/operators/debounce.d.mts.map +1 -1
  59. package/dist/core/operators/debounce.mjs +115 -45
  60. package/dist/core/operators/debounce.mjs.map +1 -1
  61. package/dist/core/operators/filter.d.mts.map +1 -1
  62. package/dist/core/operators/filter.mjs +43 -32
  63. package/dist/core/operators/filter.mjs.map +1 -1
  64. package/dist/core/operators/index.mjs +18 -18
  65. package/dist/core/operators/index.mjs.map +1 -1
  66. package/dist/core/operators/map.d.mts.map +1 -1
  67. package/dist/core/operators/map.mjs +79 -38
  68. package/dist/core/operators/map.mjs.map +1 -1
  69. package/dist/core/operators/merge-map.d.mts.map +1 -1
  70. package/dist/core/operators/merge-map.mjs +131 -47
  71. package/dist/core/operators/merge-map.mjs.map +1 -1
  72. package/dist/core/operators/pairwise.d.mts.map +1 -1
  73. package/dist/core/operators/pairwise.mjs +79 -31
  74. package/dist/core/operators/pairwise.mjs.map +1 -1
  75. package/dist/core/operators/scan.d.mts.map +1 -1
  76. package/dist/core/operators/scan.mjs +64 -25
  77. package/dist/core/operators/scan.mjs.map +1 -1
  78. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
  79. package/dist/core/operators/skip-if-no-change.mjs +93 -39
  80. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  81. package/dist/core/operators/skip-until.d.mts.map +1 -1
  82. package/dist/core/operators/skip-until.mjs +73 -32
  83. package/dist/core/operators/skip-until.mjs.map +1 -1
  84. package/dist/core/operators/skip-while.d.mts.map +1 -1
  85. package/dist/core/operators/skip-while.mjs +85 -38
  86. package/dist/core/operators/skip-while.mjs.map +1 -1
  87. package/dist/core/operators/switch-map.d.mts.map +1 -1
  88. package/dist/core/operators/switch-map.mjs +121 -40
  89. package/dist/core/operators/switch-map.mjs.map +1 -1
  90. package/dist/core/operators/take-until.d.mts.map +1 -1
  91. package/dist/core/operators/take-until.mjs +71 -36
  92. package/dist/core/operators/take-until.mjs.map +1 -1
  93. package/dist/core/operators/take-while.d.mts.map +1 -1
  94. package/dist/core/operators/take-while.mjs +103 -35
  95. package/dist/core/operators/take-while.mjs.map +1 -1
  96. package/dist/core/operators/throttle.d.mts.map +1 -1
  97. package/dist/core/operators/throttle.mjs +109 -47
  98. package/dist/core/operators/throttle.mjs.map +1 -1
  99. package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
  100. package/dist/core/operators/with-buffered-from.mjs +93 -46
  101. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  102. package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
  103. package/dist/core/operators/with-current-value-from.mjs +84 -34
  104. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  105. package/dist/core/operators/with-initial-value.d.mts.map +1 -1
  106. package/dist/core/operators/with-initial-value.mjs +68 -21
  107. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  108. package/dist/core/predefined/index.mjs +2 -12
  109. package/dist/core/predefined/index.mjs.map +1 -1
  110. package/dist/core/predefined/operators/attach-index.mjs +55 -7
  111. package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
  112. package/dist/core/predefined/operators/index.mjs +12 -12
  113. package/dist/core/predefined/operators/index.mjs.map +1 -1
  114. package/dist/core/predefined/operators/map-optional.mjs +48 -5
  115. package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
  116. package/dist/core/predefined/operators/map-result-err.mjs +48 -5
  117. package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
  118. package/dist/core/predefined/operators/map-result-ok.mjs +48 -5
  119. package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
  120. package/dist/core/predefined/operators/map-to.mjs +41 -6
  121. package/dist/core/predefined/operators/map-to.mjs.map +1 -1
  122. package/dist/core/predefined/operators/pluck.mjs +45 -7
  123. package/dist/core/predefined/operators/pluck.mjs.map +1 -1
  124. package/dist/core/predefined/operators/skip.mjs +49 -6
  125. package/dist/core/predefined/operators/skip.mjs.map +1 -1
  126. package/dist/core/predefined/operators/take.mjs +42 -6
  127. package/dist/core/predefined/operators/take.mjs.map +1 -1
  128. package/dist/core/predefined/operators/unwrap-optional.mjs +43 -8
  129. package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
  130. package/dist/core/predefined/operators/unwrap-result-err.mjs +41 -5
  131. package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
  132. package/dist/core/predefined/operators/unwrap-result-ok.mjs +43 -8
  133. package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
  134. package/dist/core/types/id.mjs +2 -2
  135. package/dist/core/types/id.mjs.map +1 -1
  136. package/dist/core/types/index.mjs +7 -3
  137. package/dist/core/types/index.mjs.map +1 -1
  138. package/dist/core/types/observable-family.mjs +14 -2
  139. package/dist/core/types/observable-family.mjs.map +1 -1
  140. package/dist/core/types/observable-kind.mjs +2 -2
  141. package/dist/core/types/observable-kind.mjs.map +1 -1
  142. package/dist/core/types/observable.mjs +14 -6
  143. package/dist/core/types/observable.mjs.map +1 -1
  144. package/dist/core/types/timer.mjs +2 -2
  145. package/dist/core/types/timer.mjs.map +1 -1
  146. package/dist/core/types/types.mjs +9 -2
  147. package/dist/core/types/types.mjs.map +1 -1
  148. package/dist/core/utils/id-maker.mjs +10 -11
  149. package/dist/core/utils/id-maker.mjs.map +1 -1
  150. package/dist/core/utils/index.mjs +5 -5
  151. package/dist/core/utils/index.mjs.map +1 -1
  152. package/dist/core/utils/max-depth.mjs +7 -4
  153. package/dist/core/utils/max-depth.mjs.map +1 -1
  154. package/dist/core/utils/observable-utils.mjs +4 -7
  155. package/dist/core/utils/observable-utils.mjs.map +1 -1
  156. package/dist/core/utils/utils.mjs +32 -28
  157. package/dist/core/utils/utils.mjs.map +1 -1
  158. package/dist/entry-point.mjs +2 -49
  159. package/dist/entry-point.mjs.map +1 -1
  160. package/dist/index.mjs +3 -49
  161. package/dist/index.mjs.map +1 -1
  162. package/dist/utils/collect-to-array.mjs +8 -13
  163. package/dist/utils/collect-to-array.mjs.map +1 -1
  164. package/dist/utils/create-boolean-state.mjs +47 -22
  165. package/dist/utils/create-boolean-state.mjs.map +1 -1
  166. package/dist/utils/create-event-emitter.mjs +67 -19
  167. package/dist/utils/create-event-emitter.mjs.map +1 -1
  168. package/dist/utils/create-reducer.mjs +54 -16
  169. package/dist/utils/create-reducer.mjs.map +1 -1
  170. package/dist/utils/create-state.mjs +54 -27
  171. package/dist/utils/create-state.mjs.map +1 -1
  172. package/dist/utils/index.mjs +6 -6
  173. package/dist/utils/index.mjs.map +1 -1
  174. package/package.json +17 -19
  175. package/src/core/{class → base}/circular-dependency-comparison.test.mts +28 -18
  176. package/src/core/base/circular-dependency.test.mts +322 -0
  177. package/src/core/base/create-child-observable.mts +340 -0
  178. package/src/core/base/create-observable-base.mts +358 -0
  179. package/src/core/base/create-root-observable.mts +102 -0
  180. package/src/core/base/index.mts +2 -0
  181. package/src/core/{class/observable.class.test.mts → base/observable-base.test.mts} +25 -17
  182. package/src/core/combine/combine.mts +51 -53
  183. package/src/core/combine/merge.mts +21 -23
  184. package/src/core/combine/zip.mts +54 -58
  185. package/src/core/create/counter.mts +42 -59
  186. package/src/core/create/from-abortable-promise.mts +38 -45
  187. package/src/core/create/from-promise.mts +25 -28
  188. package/src/core/create/from-subscribable.mts +23 -27
  189. package/src/core/create/just.mts +5 -4
  190. package/src/core/create/source.mts +11 -17
  191. package/src/core/create/timer.mts +32 -47
  192. package/src/core/index.mts +0 -1
  193. package/src/core/operators/audit.mts +43 -57
  194. package/src/core/operators/debounce.mts +35 -45
  195. package/src/core/operators/filter.mts +31 -39
  196. package/src/core/operators/map.mts +32 -40
  197. package/src/core/operators/merge-map.mts +44 -59
  198. package/src/core/operators/pairwise.mts +30 -33
  199. package/src/core/operators/scan.mts +24 -35
  200. package/src/core/operators/skip-if-no-change.mts +31 -36
  201. package/src/core/operators/skip-until.mts +32 -35
  202. package/src/core/operators/skip-while.mts +31 -40
  203. package/src/core/operators/switch-map.mts +36 -48
  204. package/src/core/operators/take-until.mts +31 -29
  205. package/src/core/operators/take-while.mts +33 -41
  206. package/src/core/operators/throttle.mts +37 -51
  207. package/src/core/operators/with-buffered-from.mts +35 -30
  208. package/src/core/operators/with-current-value-from.mts +23 -28
  209. package/src/core/operators/with-initial-value.mts +21 -22
  210. package/dist/core/class/child-observable-class.d.mts +0 -39
  211. package/dist/core/class/child-observable-class.d.mts.map +0 -1
  212. package/dist/core/class/child-observable-class.mjs +0 -173
  213. package/dist/core/class/child-observable-class.mjs.map +0 -1
  214. package/dist/core/class/index.d.mts +0 -4
  215. package/dist/core/class/index.d.mts.map +0 -1
  216. package/dist/core/class/index.mjs +0 -4
  217. package/dist/core/class/index.mjs.map +0 -1
  218. package/dist/core/class/observable-base-class.d.mts +0 -28
  219. package/dist/core/class/observable-base-class.d.mts.map +0 -1
  220. package/dist/core/class/observable-base-class.mjs +0 -120
  221. package/dist/core/class/observable-base-class.mjs.map +0 -1
  222. package/dist/core/class/root-observable-class.d.mts +0 -14
  223. package/dist/core/class/root-observable-class.d.mts.map +0 -1
  224. package/dist/core/class/root-observable-class.mjs +0 -43
  225. package/dist/core/class/root-observable-class.mjs.map +0 -1
  226. package/src/core/class/child-observable-class.mts +0 -286
  227. package/src/core/class/circular-dependency.test.mts +0 -251
  228. package/src/core/class/index.mts +0 -3
  229. package/src/core/class/observable-base-class.mts +0 -187
  230. package/src/core/class/root-observable-class.mts +0 -73
@@ -1,21 +1,16 @@
1
- import { Optional, Arr } from 'ts-data-forge';
2
- import '../utils/id-maker.mjs';
3
- import { RootObservableClass } from '../class/root-observable-class.mjs';
4
-
5
- function source(...args) {
6
- return new SourceObservableClass(...args);
1
+ import { Arr, Optional } from 'ts-data-forge';
2
+ import { createRootObservable } from '../base/index.mjs';
3
+ export function source(...args) {
4
+ return createRootObservable({
5
+ initialValue: Arr.isNonEmpty(args)
6
+ ? Optional.some(args[0])
7
+ : Optional.none,
8
+ }, ({ startUpdate, isCompleted }) => ({
9
+ next: (nextValue) => {
10
+ if (isCompleted())
11
+ return;
12
+ startUpdate(nextValue);
13
+ },
14
+ }));
7
15
  }
8
- class SourceObservableClass extends RootObservableClass {
9
- constructor(...args) {
10
- super({
11
- initialValue: Arr.isNonEmpty(args) ? Optional.some(args[0]) : Optional.none
12
- });
13
- }
14
- next(nextValue) {
15
- if (this.isCompleted) return;
16
- this.startUpdate(nextValue);
17
- }
18
- }
19
-
20
- export { source };
21
- //# sourceMappingURL=source.mjs.map
16
+ //# sourceMappingURL=source.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"source.mjs","sources":["../../../src/core/create/source.mts"],"sourcesContent":["import { Arr, Optional } from 'ts-data-forge';\nimport { RootObservableClass } from '../class/index.mjs';\nimport {\n type InitializedSourceObservable,\n type SourceObservable,\n} from '../types/index.mjs';\n\n/**\n * Creates a new Observable source that can manually emit values.\n * This is the primary way to create root observables that start reactive chains.\n *\n * @template A - The type of values emitted by the source\n * @returns A SourceObservable that can emit values via `.next()` method\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // count$ 1 2 3 ...\n * //\n * // Explanation:\n * // - source creates a new observable that you can manually emit values to\n * // - Use .next() to emit values\n * // - Foundation for building custom observables\n *\n * const count$ = source<number>();\n *\n * const valueHistory: number[] = [];\n *\n * count$.subscribe((value) => {\n * valueHistory.push(value);\n * });\n *\n * count$.next(1); // logs: 1\n *\n * assert.deepStrictEqual(valueHistory, [1]);\n *\n * count$.next(2); // logs: 2\n *\n * assert.deepStrictEqual(valueHistory, [1, 2]);\n *\n * count$.next(3); // logs: 3\n *\n * assert.deepStrictEqual(valueHistory, [1, 2, 3]);\n * ```\n */\nexport function source<const A>(\n initialValue: A,\n): InitializedSourceObservable<A>;\n\nexport function source<const A>(): SourceObservable<A>;\n\nexport function source<const A>(...args: readonly A[]): SourceObservable<A> {\n return new SourceObservableClass<A>(...args);\n}\n\nclass SourceObservableClass<A>\n extends RootObservableClass<A>\n implements SourceObservable<A>\n{\n constructor(...args: readonly A[]) {\n super({\n initialValue: Arr.isNonEmpty(args)\n ? Optional.some(args[0])\n : Optional.none,\n });\n }\n\n next(nextValue: A): void {\n if (this.isCompleted) return;\n\n this.startUpdate(nextValue);\n }\n}\n"],"names":[],"mappings":";;;;AAoDO,SAAS,UAAmB,IAAA,EAAyC;AAC1E,EAAA,OAAO,IAAI,qBAAA,CAAyB,GAAG,IAAI,CAAA;AAC7C;AAEA,MAAM,8BACI,mBAAA,CAEV;AAAA,EACE,eAAe,IAAA,EAAoB;AACjC,IAAA,KAAA,CAAM;AAAA,MACJ,YAAA,EAAc,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,GAC7B,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA,GACrB,QAAA,CAAS;AAAA,KACd,CAAA;AAAA,EACH;AAAA,EAEA,KAAK,SAAA,EAAoB;AACvB,IAAA,IAAI,KAAK,WAAA,EAAa;AAEtB,IAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,EAC5B;AACF;;;;"}
1
+ {"version":3,"file":"source.mjs","sourceRoot":"","sources":["../../../src/core/create/source.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAmDzD,MAAM,UAAU,MAAM,CAAU,GAAG,IAAkB;IACnD,OAAO,oBAAoB,CACzB;QACE,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAChC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC,CAAC,QAAQ,CAAC,IAAI;KAClB,EACD,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC,SAAY,EAAE,EAAE;YACrB,IAAI,WAAW,EAAE;gBAAE,OAAO;YAE1B,WAAW,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"timer.d.mts","sourceRoot":"","sources":["../../../src/core/create/timer.mts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,KAAK,iBACF,MAAM,YACV,QAAQ,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,KACD,eACsE,CAAC"}
1
+ {"version":3,"file":"timer.d.mts","sourceRoot":"","sources":["../../../src/core/create/timer.mts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,KAAK,iBACF,MAAM,YACV,QAAQ,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,KACD,eA2CF,CAAC"}
@@ -1,46 +1,69 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import '../utils/id-maker.mjs';
3
- import { RootObservableClass } from '../class/root-observable-class.mjs';
4
-
5
- const timer = (milliSeconds, options) => new TimerObservableClass(milliSeconds, options?.startManually ?? false);
6
- class TimerObservableClass extends RootObservableClass {
7
- #milliSeconds;
8
- #mut_timerId;
9
- #mut_isStarted;
10
- constructor(milliSeconds, startManually) {
11
- super({ initialValue: Optional.none });
12
- this.#milliSeconds = milliSeconds;
13
- this.#mut_timerId = void 0;
14
- this.#mut_isStarted = false;
15
- if (!startManually) {
16
- this.start();
17
- }
18
- }
19
- #resetTimer() {
20
- if (this.#mut_timerId !== void 0) {
21
- clearTimeout(this.#mut_timerId);
22
- }
23
- }
24
- start() {
25
- if (this.#mut_isStarted) {
26
- console.warn("cannot start twice");
27
- return;
28
- }
29
- this.#mut_isStarted = true;
30
- if (this.isCompleted) {
31
- console.warn("cannot restart stopped TimerObservable");
32
- return;
2
+ import { createRootObservable } 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
+ export const timer = (milliSeconds, options) => {
40
+ let mut_timerId = undefined;
41
+ let mut_isStarted = false;
42
+ const resetTimer = () => {
43
+ if (mut_timerId !== undefined) {
44
+ clearTimeout(mut_timerId);
45
+ }
46
+ };
47
+ const observable = createRootObservable({ initialValue: Optional.none, onComplete: resetTimer }, ({ startUpdate, isCompleted, complete }) => ({
48
+ start: () => {
49
+ if (mut_isStarted) {
50
+ console.warn('cannot start twice');
51
+ return;
52
+ }
53
+ mut_isStarted = true;
54
+ if (isCompleted()) {
55
+ console.warn('cannot restart stopped TimerObservable');
56
+ return;
57
+ }
58
+ mut_timerId = setTimeout(() => {
59
+ startUpdate(0);
60
+ complete();
61
+ }, milliSeconds);
62
+ },
63
+ }));
64
+ if (!(options?.startManually ?? false)) {
65
+ observable.start();
33
66
  }
34
- this.#mut_timerId = setTimeout(() => {
35
- this.startUpdate(0);
36
- this.complete();
37
- }, this.#milliSeconds);
38
- }
39
- complete() {
40
- this.#resetTimer();
41
- super.complete();
42
- }
43
- }
44
-
45
- export { timer };
46
- //# sourceMappingURL=timer.mjs.map
67
+ return observable;
68
+ };
69
+ //# sourceMappingURL=timer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"timer.mjs","sources":["../../../src/core/create/timer.mts"],"sourcesContent":["import { Optional } from 'ts-data-forge';\nimport { RootObservableClass } from '../class/index.mjs';\nimport { type TimerId, type TimerObservable } from '../types/index.mjs';\n\n/**\n * Creates an observable that emits 0 after a specified delay and then completes.\n *\n * @param milliSeconds - The delay in milliseconds before emission\n * @param startManually - If true, waits for manual start (default: false)\n * @returns An observable that emits after delay\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // Time(ms) 0 ... 1000\n * // delayed$ X (emits and completes)\n * //\n * // Explanation:\n * // - timer emits once after the specified delay, then completes\n * // - Useful for delayed actions or timeouts\n *\n * const delayed$ = timer(100);\n *\n * const valueHistory: number[] = [];\n *\n * await new Promise<void>((resolve) => {\n * delayed$.subscribe(\n * () => {\n * valueHistory.push(1);\n * },\n * () => {\n * resolve();\n * },\n * );\n * });\n *\n * assert.deepStrictEqual(valueHistory, [1]);\n * ```\n */\nexport const timer = (\n milliSeconds: number,\n options?: Readonly<{\n startManually?: boolean;\n }>,\n): TimerObservable =>\n new TimerObservableClass(milliSeconds, options?.startManually ?? false);\n\nclass TimerObservableClass\n extends RootObservableClass<0>\n implements TimerObservable\n{\n readonly #milliSeconds: number;\n #mut_timerId: TimerId | undefined;\n #mut_isStarted: boolean;\n\n constructor(milliSeconds: number, startManually: boolean) {\n super({ initialValue: Optional.none });\n\n this.#milliSeconds = milliSeconds;\n\n this.#mut_timerId = undefined;\n\n this.#mut_isStarted = false;\n\n if (!startManually) {\n this.start();\n }\n }\n\n #resetTimer(): void {\n if (this.#mut_timerId !== undefined) {\n clearTimeout(this.#mut_timerId);\n }\n }\n\n start(): void {\n if (this.#mut_isStarted) {\n console.warn('cannot start twice');\n\n return;\n }\n\n this.#mut_isStarted = true;\n\n if (this.isCompleted) {\n console.warn('cannot restart stopped TimerObservable');\n\n return;\n }\n\n this.#mut_timerId = setTimeout(() => {\n this.startUpdate(0);\n\n this.complete();\n }, this.#milliSeconds);\n }\n\n override complete(): void {\n this.#resetTimer();\n\n super.complete();\n }\n}\n"],"names":[],"mappings":";;;;AAwCO,MAAM,KAAA,GAAQ,CACnB,YAAA,EACA,OAAA,KAIA,IAAI,oBAAA,CAAqB,YAAA,EAAc,OAAA,EAAS,aAAA,IAAiB,KAAK;AAExE,MAAM,6BACI,mBAAA,CAEV;AAAA,EACW,aAAA;AAAA,EACT,YAAA;AAAA,EACA,cAAA;AAAA,EAEA,WAAA,CAAY,cAAsB,aAAA,EAAwB;AACxD,IAAA,KAAA,CAAM,EAAE,YAAA,EAAc,QAAA,CAAS,IAAA,EAAM,CAAA;AAErC,IAAA,IAAA,CAAK,aAAA,GAAgB,YAAA;AAErB,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAEpB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAEtB,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AAEjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAEtB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAA,CAAQ,KAAK,wCAAwC,CAAA;AAErD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,WAAW,MAAM;AACnC,MAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAElB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAA,EAAG,KAAK,aAAa,CAAA;AAAA,EACvB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,KAAA,CAAM,QAAA,EAAS;AAAA,EACjB;AACF;;;;"}
1
+ {"version":3,"file":"timer.mjs","sourceRoot":"","sources":["../../../src/core/create/timer.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,YAAoB,EACpB,OAEE,EACe,EAAE;IACnB,IAAI,WAAW,GAAwB,SAAS,CAAC;IAEjD,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,YAAY,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,oBAAoB,CACrC,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,EACvD,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBAEnC,OAAO;YACT,CAAC;YAED,aAAa,GAAG,IAAI,CAAC;YAErB,IAAI,WAAW,EAAE,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;gBAEvD,OAAO;YACT,CAAC;YAED,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,WAAW,CAAC,CAAC,CAAC,CAAC;gBAEf,QAAQ,EAAE,CAAC;YACb,CAAC,EAAE,YAAY,CAAC,CAAC;QACnB,CAAC;KACF,CAAC,CACH,CAAC;IAEF,IAAI,CAAC,CAAC,OAAO,EAAE,aAAa,IAAI,KAAK,CAAC,EAAE,CAAC;QACvC,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC"}
@@ -1,4 +1,3 @@
1
- export * from './class/index.mjs';
2
1
  export * from './combine/index.mjs';
3
2
  export * from './create/index.mjs';
4
3
  export * from './operators/index.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/core/index.mts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/core/index.mts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC"}
@@ -1,44 +1,6 @@
1
- export { AsyncChildObservableClass, InitializedSyncChildObservableClass, SyncChildObservableClass } from './class/child-observable-class.mjs';
2
- export { ObservableBaseClass } from './class/observable-base-class.mjs';
3
- export { RootObservableClass } from './class/root-observable-class.mjs';
4
- export { combine, combineLatest } from './combine/combine.mjs';
5
- export { merge } from './combine/merge.mjs';
6
- export { zip } from './combine/zip.mjs';
7
- export { counter } from './create/counter.mjs';
8
- export { fromAbortablePromise } from './create/from-abortable-promise.mjs';
9
- export { fromPromise } from './create/from-promise.mjs';
10
- export { fromSubscribable } from './create/from-subscribable.mjs';
11
- export { just } from './create/just.mjs';
12
- export { source } from './create/source.mjs';
13
- export { timer } from './create/timer.mjs';
14
- export { audit } from './operators/audit.mjs';
15
- export { debounce } from './operators/debounce.mjs';
16
- export { filter } from './operators/filter.mjs';
17
- export { map } from './operators/map.mjs';
18
- export { flatMap, mergeMap } from './operators/merge-map.mjs';
19
- export { pairwise } from './operators/pairwise.mjs';
20
- export { scan } from './operators/scan.mjs';
21
- export { distinctUntilChanged, skipIfNoChange } from './operators/skip-if-no-change.mjs';
22
- export { skipUntil } from './operators/skip-until.mjs';
23
- export { skipWhile } from './operators/skip-while.mjs';
24
- export { switchMap } from './operators/switch-map.mjs';
25
- export { takeUntil } from './operators/take-until.mjs';
26
- export { takeWhile } from './operators/take-while.mjs';
27
- export { throttle } from './operators/throttle.mjs';
28
- export { withBuffered, withBufferedFrom } from './operators/with-buffered-from.mjs';
29
- export { withCurrentValueFrom, withLatestFrom } from './operators/with-current-value-from.mjs';
30
- export { withInitialValue } from './operators/with-initial-value.mjs';
31
- export { attachIndex, withIndex } from './predefined/operators/attach-index.mjs';
32
- export { mapOptional } from './predefined/operators/map-optional.mjs';
33
- export { mapResultErr } from './predefined/operators/map-result-err.mjs';
34
- export { mapResultOk } from './predefined/operators/map-result-ok.mjs';
35
- export { mapTo } from './predefined/operators/map-to.mjs';
36
- export { getKey, pluck } from './predefined/operators/pluck.mjs';
37
- export { skip } from './predefined/operators/skip.mjs';
38
- export { take } from './predefined/operators/take.mjs';
39
- export { unwrapOptional } from './predefined/operators/unwrap-optional.mjs';
40
- export { unwrapResultErr } from './predefined/operators/unwrap-result-err.mjs';
41
- export { unwrapResultOk } from './predefined/operators/unwrap-result-ok.mjs';
42
- import 'ts-data-forge';
43
- export { isChildObservable, isManagerObservable, isRootObservable } from './types/observable.mjs';
44
- //# sourceMappingURL=index.mjs.map
1
+ export * from './combine/index.mjs';
2
+ export * from './create/index.mjs';
3
+ export * from './operators/index.mjs';
4
+ export * from './predefined/index.mjs';
5
+ export * from './types/index.mjs';
6
+ //# 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/index.mts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.mts","sourceRoot":"","sources":["../../../src/core/operators/audit.mts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,wBAAwB,EAI9B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6FG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,gBACP,MAAM,KACnB,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAMQ,CAAC"}
1
+ {"version":3,"file":"audit.d.mts","sourceRoot":"","sources":["../../../src/core/operators/audit.mts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,wBAAwB,EAG9B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6FG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,gBACP,MAAM,KACnB,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAMQ,CAAC"}
@@ -1,50 +1,129 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { AsyncChildObservableClass } from '../class/child-observable-class.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) => new AuditObservableClass(
8
- parentObservable,
9
- milliSeconds
10
- ))
11
- );
12
- class AuditObservableClass extends AsyncChildObservableClass {
13
- #milliSeconds;
14
- #mut_timerId;
15
- #mut_isSkipping;
16
- constructor(parentObservable, milliSeconds) {
17
- super({
18
- parents: [parentObservable],
19
- initialValue: parentObservable.getSnapshot()
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));
100
+ const createAuditObservable = (parentObservable, milliSeconds) => {
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
+ }
118
+
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);
20
127
  });
21
- this.#mut_isSkipping = false;
22
- this.#mut_timerId = void 0;
23
- this.#milliSeconds = milliSeconds;
24
- }
25
- #resetTimer() {
26
- if (this.#mut_timerId !== void 0) {
27
- clearTimeout(this.#mut_timerId);
28
- }
29
- }
30
- tryUpdate(updateToken) {
31
- const par = this.parents[0];
32
- if (par.updateToken !== updateToken || Optional.isNone(par.getSnapshot()) || this.#mut_isSkipping) {
33
- return;
34
- }
35
- this.#mut_isSkipping = true;
36
- this.#mut_timerId = setTimeout(() => {
37
- const sn = par.getSnapshot();
38
- if (Optional.isNone(sn)) return;
39
- this.startUpdate(sn.value);
40
- this.#mut_isSkipping = false;
41
- }, this.#milliSeconds);
42
- }
43
- complete() {
44
- this.#resetTimer();
45
- super.complete();
46
- }
47
- }
48
-
49
- export { audit };
50
- //# sourceMappingURL=audit.mjs.map
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 { AsyncChildObservableClass } from '../class/index.mjs';\nimport {\n type AuditOperatorObservable,\n type KeepInitialValueOperator,\n type Observable,\n type TimerId,\n type UpdateToken,\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 new AuditObservableClass(\n parentObservable,\n milliSeconds,\n )) as KeepInitialValueOperator<A, A>;\n\nclass AuditObservableClass<A>\n extends AsyncChildObservableClass<A, readonly [A]>\n implements AuditOperatorObservable<A>\n{\n readonly #milliSeconds: number;\n #mut_timerId: TimerId | undefined;\n #mut_isSkipping: boolean;\n\n constructor(parentObservable: Observable<A>, milliSeconds: number) {\n super({\n parents: [parentObservable],\n initialValue: parentObservable.getSnapshot(),\n });\n\n this.#mut_isSkipping = false;\n\n this.#mut_timerId = undefined;\n\n this.#milliSeconds = milliSeconds;\n }\n\n #resetTimer(): void {\n if (this.#mut_timerId !== undefined) {\n clearTimeout(this.#mut_timerId);\n }\n }\n\n override tryUpdate(updateToken: UpdateToken): void {\n const par = this.parents[0];\n\n if (\n par.updateToken !== updateToken ||\n Optional.isNone(par.getSnapshot()) ||\n this.#mut_isSkipping\n ) {\n return; // skip update\n }\n\n // set timer\n this.#mut_isSkipping = true;\n\n this.#mut_timerId = setTimeout(() => {\n const sn = par.getSnapshot();\n\n if (Optional.isNone(sn)) return;\n\n this.startUpdate(sn.value);\n\n this.#mut_isSkipping = false;\n }, this.#milliSeconds);\n }\n\n override complete(): void {\n this.#resetTimer();\n\n super.complete();\n }\n}\n"],"names":[],"mappings":";;;;AAwGO,MAAM,QAAQ,CACnB,YAAA;AAAA;AAAA,GAGC,CAAC,qBACA,IAAI,oBAAA;AAAA,IACF,gBAAA;AAAA,IACA;AAAA,GACF;AAAA;AAEJ,MAAM,6BACI,yBAAA,CAEV;AAAA,EACW,aAAA;AAAA,EACT,YAAA;AAAA,EACA,eAAA;AAAA,EAEA,WAAA,CAAY,kBAAiC,YAAA,EAAsB;AACjE,IAAA,KAAA,CAAM;AAAA,MACJ,OAAA,EAAS,CAAC,gBAAgB,CAAA;AAAA,MAC1B,YAAA,EAAc,iBAAiB,WAAA;AAAY,KAC5C,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAEvB,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAEpB,IAAA,IAAA,CAAK,aAAA,GAAgB,YAAA;AAAA,EACvB;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAES,UAAU,WAAA,EAAgC;AACjD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AAE1B,IAAA,IACE,GAAA,CAAI,WAAA,KAAgB,WAAA,IACpB,QAAA,CAAS,MAAA,CAAO,IAAI,WAAA,EAAa,CAAA,IACjC,IAAA,CAAK,eAAA,EACL;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAEvB,IAAA,IAAA,CAAK,YAAA,GAAe,WAAW,MAAM;AACnC,MAAA,MAAM,EAAA,GAAK,IAAI,WAAA,EAAY;AAE3B,MAAA,IAAI,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG;AAEzB,MAAA,IAAA,CAAK,WAAA,CAAY,GAAG,KAAK,CAAA;AAEzB,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,IACzB,CAAA,EAAG,KAAK,aAAa,CAAA;AAAA,EACvB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,KAAA,CAAM,QAAA,EAAS;AAAA,EACjB;AACF;;;;"}
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 +1 @@
1
- {"version":3,"file":"debounce.d.mts","sourceRoot":"","sources":["../../../src/core/operators/debounce.mts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,wBAAwB,EAI9B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,gBACV,MAAM,KACnB,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAMQ,CAAC"}
1
+ {"version":3,"file":"debounce.d.mts","sourceRoot":"","sources":["../../../src/core/operators/debounce.mts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,wBAAwB,EAG9B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,gBACV,MAAM,KACnB,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAMQ,CAAC"}
@@ -1,47 +1,117 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { AsyncChildObservableClass } from '../class/child-observable-class.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) => new DebounceObservableClass(
8
- parentObservable,
9
- milliSeconds
10
- ))
11
- );
12
- class DebounceObservableClass extends AsyncChildObservableClass {
13
- #milliSeconds;
14
- #mut_timerId;
15
- constructor(parentObservable, milliSeconds) {
16
- super({
17
- parents: [parentObservable],
18
- initialValue: parentObservable.getSnapshot()
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));
91
+ const createDebounceObservable = (parentObservable, milliSeconds) => {
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();
109
+
110
+ mut_timerId = setTimeout(() => {
111
+ if (Optional.isNone(sn))
112
+ return;
113
+ startUpdate(sn.value);
114
+ }, milliSeconds);
19
115
  });
20
- this.#mut_timerId = void 0;
21
- this.#milliSeconds = milliSeconds;
22
- }
23
- #resetTimer() {
24
- if (this.#mut_timerId !== void 0) {
25
- clearTimeout(this.#mut_timerId);
26
- }
27
- }
28
- tryUpdate(updateToken) {
29
- const par = this.parents[0];
30
- const sn = par.getSnapshot();
31
- if (par.updateToken !== updateToken || Optional.isNone(sn)) {
32
- return;
33
- }
34
- this.#resetTimer();
35
- this.#mut_timerId = setTimeout(() => {
36
- if (Optional.isNone(sn)) return;
37
- this.startUpdate(sn.value);
38
- }, this.#milliSeconds);
39
- }
40
- complete() {
41
- this.#resetTimer();
42
- super.complete();
43
- }
44
- }
45
-
46
- export { debounce };
47
- //# sourceMappingURL=debounce.mjs.map
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 { AsyncChildObservableClass } from '../class/index.mjs';\nimport {\n type DebounceOperatorObservable,\n type KeepInitialValueOperator,\n type Observable,\n type TimerId,\n type UpdateToken,\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 new DebounceObservableClass(\n parentObservable,\n milliSeconds,\n )) as KeepInitialValueOperator<A, A>;\n\nclass DebounceObservableClass<A>\n extends AsyncChildObservableClass<A, readonly [A]>\n implements DebounceOperatorObservable<A>\n{\n readonly #milliSeconds: number;\n #mut_timerId: TimerId | undefined;\n\n constructor(parentObservable: Observable<A>, milliSeconds: number) {\n super({\n parents: [parentObservable],\n initialValue: parentObservable.getSnapshot(),\n });\n\n this.#mut_timerId = undefined;\n\n this.#milliSeconds = milliSeconds;\n }\n\n #resetTimer(): void {\n if (this.#mut_timerId !== undefined) {\n clearTimeout(this.#mut_timerId);\n }\n }\n\n override tryUpdate(updateToken: UpdateToken): void {\n const par = this.parents[0];\n\n const sn = par.getSnapshot();\n\n if (par.updateToken !== updateToken || Optional.isNone(sn)) {\n return; // skip update\n }\n\n this.#resetTimer();\n\n // set timer\n this.#mut_timerId = setTimeout(() => {\n if (Optional.isNone(sn)) return;\n\n this.startUpdate(sn.value);\n }, this.#milliSeconds);\n }\n\n override complete(): void {\n this.#resetTimer();\n\n super.complete();\n }\n}\n"],"names":[],"mappings":";;;;AA+FO,MAAM,WAAW,CACtB,YAAA;AAAA;AAAA,GAGC,CAAC,qBACA,IAAI,uBAAA;AAAA,IACF,gBAAA;AAAA,IACA;AAAA,GACF;AAAA;AAEJ,MAAM,gCACI,yBAAA,CAEV;AAAA,EACW,aAAA;AAAA,EACT,YAAA;AAAA,EAEA,WAAA,CAAY,kBAAiC,YAAA,EAAsB;AACjE,IAAA,KAAA,CAAM;AAAA,MACJ,OAAA,EAAS,CAAC,gBAAgB,CAAA;AAAA,MAC1B,YAAA,EAAc,iBAAiB,WAAA;AAAY,KAC5C,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAEpB,IAAA,IAAA,CAAK,aAAA,GAAgB,YAAA;AAAA,EACvB;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAES,UAAU,WAAA,EAAgC;AACjD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AAE1B,IAAA,MAAM,EAAA,GAAK,IAAI,WAAA,EAAY;AAE3B,IAAA,IAAI,IAAI,WAAA,KAAgB,WAAA,IAAe,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,EAAY;AAGjB,IAAA,IAAA,CAAK,YAAA,GAAe,WAAW,MAAM;AACnC,MAAA,IAAI,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG;AAEzB,MAAA,IAAA,CAAK,WAAA,CAAY,GAAG,KAAK,CAAA;AAAA,IAC3B,CAAA,EAAG,KAAK,aAAa,CAAA;AAAA,EACvB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,KAAA,CAAM,QAAA,EAAS;AAAA,EACjB;AACF;;;;"}
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"}