synstate 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +124 -350
  3. package/assets/synstate-icon.png +0 -0
  4. package/dist/core/combine/combine.d.mts +32 -2
  5. package/dist/core/combine/combine.d.mts.map +1 -1
  6. package/dist/core/combine/combine.mjs +32 -2
  7. package/dist/core/combine/combine.mjs.map +1 -1
  8. package/dist/core/combine/merge.d.mts +30 -4
  9. package/dist/core/combine/merge.d.mts.map +1 -1
  10. package/dist/core/combine/merge.mjs +30 -4
  11. package/dist/core/combine/merge.mjs.map +1 -1
  12. package/dist/core/combine/zip.d.mts +28 -3
  13. package/dist/core/combine/zip.d.mts.map +1 -1
  14. package/dist/core/combine/zip.mjs +28 -3
  15. package/dist/core/combine/zip.mjs.map +1 -1
  16. package/dist/core/create/from-array.d.mts +21 -3
  17. package/dist/core/create/from-array.d.mts.map +1 -1
  18. package/dist/core/create/from-array.mjs +21 -3
  19. package/dist/core/create/from-array.mjs.map +1 -1
  20. package/dist/core/create/from-promise.d.mts +29 -7
  21. package/dist/core/create/from-promise.d.mts.map +1 -1
  22. package/dist/core/create/from-promise.mjs +29 -7
  23. package/dist/core/create/from-promise.mjs.map +1 -1
  24. package/dist/core/create/from-subscribable.d.mts +58 -0
  25. package/dist/core/create/from-subscribable.d.mts.map +1 -1
  26. package/dist/core/create/from-subscribable.mjs +58 -0
  27. package/dist/core/create/from-subscribable.mjs.map +1 -1
  28. package/dist/core/create/interval.d.mts +29 -4
  29. package/dist/core/create/interval.d.mts.map +1 -1
  30. package/dist/core/create/interval.mjs +29 -4
  31. package/dist/core/create/interval.mjs.map +1 -1
  32. package/dist/core/create/of.d.mts +22 -3
  33. package/dist/core/create/of.d.mts.map +1 -1
  34. package/dist/core/create/of.mjs +22 -3
  35. package/dist/core/create/of.mjs.map +1 -1
  36. package/dist/core/create/source.d.mts +20 -1
  37. package/dist/core/create/source.d.mts.map +1 -1
  38. package/dist/core/create/source.mjs.map +1 -1
  39. package/dist/core/create/timer.d.mts +23 -4
  40. package/dist/core/create/timer.d.mts.map +1 -1
  41. package/dist/core/create/timer.mjs +23 -4
  42. package/dist/core/create/timer.mjs.map +1 -1
  43. package/dist/core/operators/audit-time.d.mts +59 -0
  44. package/dist/core/operators/audit-time.d.mts.map +1 -1
  45. package/dist/core/operators/audit-time.mjs +59 -0
  46. package/dist/core/operators/audit-time.mjs.map +1 -1
  47. package/dist/core/operators/debounce-time.d.mts +22 -2
  48. package/dist/core/operators/debounce-time.d.mts.map +1 -1
  49. package/dist/core/operators/debounce-time.mjs +22 -2
  50. package/dist/core/operators/debounce-time.mjs.map +1 -1
  51. package/dist/core/operators/filter.d.mts +26 -1
  52. package/dist/core/operators/filter.d.mts.map +1 -1
  53. package/dist/core/operators/filter.mjs.map +1 -1
  54. package/dist/core/operators/map-with-index.d.mts +19 -4
  55. package/dist/core/operators/map-with-index.d.mts.map +1 -1
  56. package/dist/core/operators/map-with-index.mjs +19 -4
  57. package/dist/core/operators/map-with-index.mjs.map +1 -1
  58. package/dist/core/operators/merge-map.d.mts +47 -5
  59. package/dist/core/operators/merge-map.d.mts.map +1 -1
  60. package/dist/core/operators/merge-map.mjs +47 -5
  61. package/dist/core/operators/merge-map.mjs.map +1 -1
  62. package/dist/core/operators/pairwise.d.mts +30 -1
  63. package/dist/core/operators/pairwise.d.mts.map +1 -1
  64. package/dist/core/operators/pairwise.mjs +30 -1
  65. package/dist/core/operators/pairwise.mjs.map +1 -1
  66. package/dist/core/operators/scan.d.mts +23 -1
  67. package/dist/core/operators/scan.d.mts.map +1 -1
  68. package/dist/core/operators/scan.mjs +23 -1
  69. package/dist/core/operators/scan.mjs.map +1 -1
  70. package/dist/core/operators/skip-if-no-change.d.mts +25 -1
  71. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
  72. package/dist/core/operators/skip-if-no-change.mjs +25 -1
  73. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  74. package/dist/core/operators/skip-until.d.mts +50 -0
  75. package/dist/core/operators/skip-until.d.mts.map +1 -1
  76. package/dist/core/operators/skip-until.mjs +50 -0
  77. package/dist/core/operators/skip-until.mjs.map +1 -1
  78. package/dist/core/operators/skip-while.d.mts +48 -0
  79. package/dist/core/operators/skip-while.d.mts.map +1 -1
  80. package/dist/core/operators/skip-while.mjs +48 -0
  81. package/dist/core/operators/skip-while.mjs.map +1 -1
  82. package/dist/core/operators/switch-map.d.mts +39 -5
  83. package/dist/core/operators/switch-map.d.mts.map +1 -1
  84. package/dist/core/operators/switch-map.mjs +39 -5
  85. package/dist/core/operators/switch-map.mjs.map +1 -1
  86. package/dist/core/operators/take-until.d.mts +20 -1
  87. package/dist/core/operators/take-until.d.mts.map +1 -1
  88. package/dist/core/operators/take-until.mjs +20 -1
  89. package/dist/core/operators/take-until.mjs.map +1 -1
  90. package/dist/core/operators/take-while.d.mts +47 -0
  91. package/dist/core/operators/take-while.d.mts.map +1 -1
  92. package/dist/core/operators/take-while.mjs +47 -0
  93. package/dist/core/operators/take-while.mjs.map +1 -1
  94. package/dist/core/operators/throttle-time.d.mts +44 -5
  95. package/dist/core/operators/throttle-time.d.mts.map +1 -1
  96. package/dist/core/operators/throttle-time.mjs +44 -5
  97. package/dist/core/operators/throttle-time.mjs.map +1 -1
  98. package/dist/core/operators/with-buffered-from.d.mts +53 -0
  99. package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
  100. package/dist/core/operators/with-buffered-from.mjs +53 -0
  101. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  102. package/dist/core/operators/with-current-value-from.d.mts +55 -0
  103. package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
  104. package/dist/core/operators/with-current-value-from.mjs +55 -0
  105. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  106. package/dist/core/operators/with-initial-value.d.mts +24 -2
  107. package/dist/core/operators/with-initial-value.d.mts.map +1 -1
  108. package/dist/core/operators/with-initial-value.mjs +24 -2
  109. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  110. package/dist/core/types/observable-family.d.mts +7 -7
  111. package/dist/utils/create-event-emitter.d.mts +20 -2
  112. package/dist/utils/create-event-emitter.d.mts.map +1 -1
  113. package/dist/utils/create-event-emitter.mjs +20 -2
  114. package/dist/utils/create-event-emitter.mjs.map +1 -1
  115. package/dist/utils/create-reducer.d.mts +13 -1
  116. package/dist/utils/create-reducer.d.mts.map +1 -1
  117. package/dist/utils/create-reducer.mjs +13 -1
  118. package/dist/utils/create-reducer.mjs.map +1 -1
  119. package/dist/utils/create-state.d.mts +24 -4
  120. package/dist/utils/create-state.d.mts.map +1 -1
  121. package/dist/utils/create-state.mjs +24 -4
  122. package/dist/utils/create-state.mjs.map +1 -1
  123. package/package.json +13 -12
  124. package/src/core/combine/combine.mts +32 -2
  125. package/src/core/combine/merge.mts +30 -4
  126. package/src/core/combine/zip.mts +28 -3
  127. package/src/core/create/from-array.mts +21 -3
  128. package/src/core/create/from-promise.mts +29 -7
  129. package/src/core/create/from-subscribable.mts +58 -0
  130. package/src/core/create/interval.mts +29 -4
  131. package/src/core/create/of.mts +22 -3
  132. package/src/core/create/source.mts +20 -1
  133. package/src/core/create/timer.mts +23 -4
  134. package/src/core/operators/audit-time.mts +59 -0
  135. package/src/core/operators/debounce-time.mts +22 -2
  136. package/src/core/operators/filter.mts +26 -1
  137. package/src/core/operators/map-with-index.mts +19 -4
  138. package/src/core/operators/merge-map.mts +47 -5
  139. package/src/core/operators/pairwise.mts +30 -1
  140. package/src/core/operators/scan.mts +23 -1
  141. package/src/core/operators/skip-if-no-change.mts +25 -1
  142. package/src/core/operators/skip-until.mts +50 -0
  143. package/src/core/operators/skip-while.mts +48 -0
  144. package/src/core/operators/switch-map.mts +39 -5
  145. package/src/core/operators/take-until.mts +20 -1
  146. package/src/core/operators/take-while.mts +47 -0
  147. package/src/core/operators/throttle-time.mts +44 -5
  148. package/src/core/operators/with-buffered-from.mts +53 -0
  149. package/src/core/operators/with-current-value-from.mts +55 -0
  150. package/src/core/operators/with-initial-value.mts +24 -2
  151. package/src/core/types/observable-family.mts +7 -7
  152. package/src/utils/create-event-emitter.mts +20 -2
  153. package/src/utils/create-reducer.mts +13 -1
  154. package/src/utils/create-state.mts +24 -4
@@ -1,4 +1,52 @@
1
1
  import { type DropInitialValueOperator } from '../types/index.mjs';
2
+ /**
3
+ * Skips values from the source observable while the predicate returns true.
4
+ * Once the predicate returns false, all subsequent values pass through.
5
+ *
6
+ * @template A - The type of values from the source
7
+ * @param predicate - Function to test each value
8
+ * @returns An operator that skips values while the predicate is true
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * // Timeline:
13
+ * //
14
+ * // num$ 1 2 3 4 5 6 7
15
+ * // skipped$ 5 6 7
16
+ * // |---- skip -----|
17
+ * //
18
+ * // Explanation:
19
+ * // - skipWhile skips values while the predicate returns true
20
+ * // - Once the predicate returns false, all subsequent values pass through
21
+ * // - Unlike filter, the predicate is never checked again after the first false
22
+ *
23
+ * const num$ = source<number>();
24
+ *
25
+ * const skipped$ = num$.pipe(skipWhile((x) => x < 5));
26
+ *
27
+ * const mut_history: number[] = [];
28
+ *
29
+ * skipped$.subscribe((x) => {
30
+ * mut_history.push(x);
31
+ * });
32
+ *
33
+ * num$.next(1); // nothing logged
34
+ *
35
+ * num$.next(2); // nothing logged
36
+ *
37
+ * num$.next(5); // logs: 5
38
+ *
39
+ * assert.deepStrictEqual(mut_history, [5]);
40
+ *
41
+ * num$.next(6); // logs: 6
42
+ *
43
+ * assert.deepStrictEqual(mut_history, [5, 6]);
44
+ *
45
+ * num$.next(7); // logs: 7
46
+ *
47
+ * assert.deepStrictEqual(mut_history, [5, 6, 7]);
48
+ * ```
49
+ */
2
50
  export declare const skipWhile: <A>(predicate: (value: A, index: SafeUint | -1) => boolean) => DropInitialValueOperator<A, A>;
3
51
  export declare const skip: <A>(n: PositiveSafeIntWithSmallInt) => DropInitialValueOperator<A, A>;
4
52
  //# sourceMappingURL=skip-while.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skip-while.d.mts","sourceRoot":"","sources":["../../../src/core/operators/skip-while.mts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,wBAAwB,EAI9B,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,SAAS,GACnB,CAAC,EACA,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,OAAO,KACrD,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAE2B,CAAC;AAI9D,eAAO,MAAM,IAAI,GAAI,CAAC,EACpB,GAAG,2BAA2B,KAC7B,wBAAwB,CAAC,CAAC,EAAE,CAAC,CACyC,CAAC"}
1
+ {"version":3,"file":"skip-while.d.mts","sourceRoot":"","sources":["../../../src/core/operators/skip-while.mts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,wBAAwB,EAI9B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,eAAO,MAAM,SAAS,GACnB,CAAC,EACA,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,OAAO,KACrD,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAE2B,CAAC;AAI9D,eAAO,MAAM,IAAI,GAAI,CAAC,EACpB,GAAG,2BAA2B,KAC7B,wBAAwB,CAAC,CAAC,EAAE,CAAC,CACyC,CAAC"}
@@ -2,6 +2,54 @@ import { PositiveSafeInt, pipe, Optional, asSafeUint, SafeUint } from 'ts-data-f
2
2
  import { SyncChildObservableClass } from '../class/child-observable-class.mjs';
3
3
  import '../utils/id-maker.mjs';
4
4
 
5
+ /**
6
+ * Skips values from the source observable while the predicate returns true.
7
+ * Once the predicate returns false, all subsequent values pass through.
8
+ *
9
+ * @template A - The type of values from the source
10
+ * @param predicate - Function to test each value
11
+ * @returns An operator that skips values while the predicate is true
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // Timeline:
16
+ * //
17
+ * // num$ 1 2 3 4 5 6 7
18
+ * // skipped$ 5 6 7
19
+ * // |---- skip -----|
20
+ * //
21
+ * // Explanation:
22
+ * // - skipWhile skips values while the predicate returns true
23
+ * // - Once the predicate returns false, all subsequent values pass through
24
+ * // - Unlike filter, the predicate is never checked again after the first false
25
+ *
26
+ * const num$ = source<number>();
27
+ *
28
+ * const skipped$ = num$.pipe(skipWhile((x) => x < 5));
29
+ *
30
+ * const mut_history: number[] = [];
31
+ *
32
+ * skipped$.subscribe((x) => {
33
+ * mut_history.push(x);
34
+ * });
35
+ *
36
+ * num$.next(1); // nothing logged
37
+ *
38
+ * num$.next(2); // nothing logged
39
+ *
40
+ * num$.next(5); // logs: 5
41
+ *
42
+ * assert.deepStrictEqual(mut_history, [5]);
43
+ *
44
+ * num$.next(6); // logs: 6
45
+ *
46
+ * assert.deepStrictEqual(mut_history, [5, 6]);
47
+ *
48
+ * num$.next(7); // logs: 7
49
+ *
50
+ * assert.deepStrictEqual(mut_history, [5, 6, 7]);
51
+ * ```
52
+ */
5
53
  const skipWhile = (predicate) => (parentObservable) => new SkipWhileObservableClass(parentObservable, predicate);
6
54
  /* Specialized operators */
7
55
  const skip = (n) => !PositiveSafeInt.is(n) ? idFn : skipWhile((_, index) => index + 1 <= n);
@@ -1 +1 @@
1
- {"version":3,"file":"skip-while.mjs","sources":["../../../src/core/operators/skip-while.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;MAea,SAAS,GACpB,CACE,SAAsD,KAExD,CAAC,gBAAgB,KACf,IAAI,wBAAwB,CAAC,gBAAgB,EAAE,SAAS;AAE5D;AAEO,MAAM,IAAI,GAAG,CAClB,CAA8B,KAE9B,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,GAAG,CAAC,IAAI,CAAC;AAExE,MAAM,IAAI,GAAG,CAAK,KAAQ,KAAQ,KAAK;AAEvC;AAEA,MAAM,wBACJ,SAAQ,wBAAyC,CAAA;AAGxC,IAAA,UAAU;AACnB,IAAA,UAAU;IAEV,WAAA,CACE,gBAA+B,EAC/B,SAAsD,EAAA;AAEtD,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KACxD,QAAQ,CAAC,MAAM,CAAC,EAAE;kBACd,QAAQ,CAAC;kBACT,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;sBACpB,QAAQ,CAAC;AACX,sBAAE,EAAE,CACT,CAAC,KAAK;AACR,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AAEpB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;IAC7B;AAES,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IAAI,GAAG,CAAC,aAAa,KAAK,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AAC9D,YAAA,OAAO;QACT;AAEA,QAAA,IAAI,CAAC,UAAU;YACb,IAAI,CAAC,UAAU,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;AAE3E,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;YAC/C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;QACvC;IACF;AACD;;;;"}
1
+ {"version":3,"file":"skip-while.mjs","sources":["../../../src/core/operators/skip-while.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CG;MACU,SAAS,GACpB,CACE,SAAsD,KAExD,CAAC,gBAAgB,KACf,IAAI,wBAAwB,CAAC,gBAAgB,EAAE,SAAS;AAE5D;AAEO,MAAM,IAAI,GAAG,CAClB,CAA8B,KAE9B,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,GAAG,CAAC,IAAI,CAAC;AAExE,MAAM,IAAI,GAAG,CAAK,KAAQ,KAAQ,KAAK;AAEvC;AAEA,MAAM,wBACJ,SAAQ,wBAAyC,CAAA;AAGxC,IAAA,UAAU;AACnB,IAAA,UAAU;IAEV,WAAA,CACE,gBAA+B,EAC/B,SAAsD,EAAA;AAEtD,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KACxD,QAAQ,CAAC,MAAM,CAAC,EAAE;kBACd,QAAQ,CAAC;kBACT,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;sBACpB,QAAQ,CAAC;AACX,sBAAE,EAAE,CACT,CAAC,KAAK;AACR,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AAEpB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;IAC7B;AAES,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IAAI,GAAG,CAAC,aAAa,KAAK,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AAC9D,YAAA,OAAO;QACT;AAEA,QAAA,IAAI,CAAC,UAAU;YACb,IAAI,CAAC,UAAU,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;AAE3E,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;YAC/C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;QACvC;IACF;AACD;;;;"}
@@ -10,18 +10,52 @@ import { type DropInitialValueOperator, type Observable } from '../types/index.m
10
10
  *
11
11
  * @example
12
12
  * ```ts
13
+ * // Timeline:
14
+ * //
15
+ * // searchQuery$ "a" "ab" "abc"
16
+ * // requests fetch1 fetch2 fetch3
17
+ * // results$ cancel cancel result3
18
+ * // fetch1 fetch2
19
+ * //
20
+ * // Explanation:
21
+ * // - switchMap cancels previous inner observables when a new value arrives
22
+ * // - Only the result from the latest search query is emitted
23
+ * // - Previous ongoing requests are cancelled
24
+ * // - Ideal for search-as-you-type scenarios
25
+ *
13
26
  * const searchQuery$ = source<string>();
14
27
  *
15
28
  * const results$ = searchQuery$.pipe(
16
- * switchMap((query) => fromPromise(fetchResults(query))),
29
+ * switchMap((query) => {
30
+ * const result$ = source<string[]>();
31
+ *
32
+ * setTimeout(() => {
33
+ * result$.next([query]);
34
+ *
35
+ * result$.complete();
36
+ * }, 10);
37
+ *
38
+ * return result$;
39
+ * }),
17
40
  * );
18
41
  *
19
- * results$.subscribe((results) => {
20
- * console.log(results);
42
+ * const mut_history: string[][] = [];
43
+ *
44
+ * results$.subscribe((value) => {
45
+ * mut_history.push(value);
46
+ * });
47
+ *
48
+ * searchQuery$.next('a');
49
+ *
50
+ * searchQuery$.next('ab');
51
+ *
52
+ * searchQuery$.next('abc');
53
+ *
54
+ * await new Promise((resolve) => {
55
+ * setTimeout(resolve, 200);
21
56
  * });
22
- * // Only the latest search results are emitted, previous searches are cancelled
23
57
  *
24
- * const fetchResults = async (_query: string): Promise<readonly unknown[]> => [];
58
+ * assert.deepStrictEqual(mut_history, [['abc']]);
25
59
  * ```
26
60
  *
27
61
  * @note To improve code readability, consider using `createState` instead of `switchMap`,
@@ -1 +1 @@
1
- {"version":3,"file":"switch-map.d.mts","sourceRoot":"","sources":["../../../src/core/operators/switch-map.mts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EAIhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,SAAS,GACnB,CAAC,EAAE,CAAC,EACH,iBAAiB,CAAC,IAAI,EAAE,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,KAC1C,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAEiC,CAAC"}
1
+ {"version":3,"file":"switch-map.d.mts","sourceRoot":"","sources":["../../../src/core/operators/switch-map.mts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EAIhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,eAAO,MAAM,SAAS,GACnB,CAAC,EAAE,CAAC,EACH,iBAAiB,CAAC,IAAI,EAAE,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,KAC1C,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAEiC,CAAC"}
@@ -13,18 +13,52 @@ import '../utils/id-maker.mjs';
13
13
  *
14
14
  * @example
15
15
  * ```ts
16
+ * // Timeline:
17
+ * //
18
+ * // searchQuery$ "a" "ab" "abc"
19
+ * // requests fetch1 fetch2 fetch3
20
+ * // results$ cancel cancel result3
21
+ * // fetch1 fetch2
22
+ * //
23
+ * // Explanation:
24
+ * // - switchMap cancels previous inner observables when a new value arrives
25
+ * // - Only the result from the latest search query is emitted
26
+ * // - Previous ongoing requests are cancelled
27
+ * // - Ideal for search-as-you-type scenarios
28
+ *
16
29
  * const searchQuery$ = source<string>();
17
30
  *
18
31
  * const results$ = searchQuery$.pipe(
19
- * switchMap((query) => fromPromise(fetchResults(query))),
32
+ * switchMap((query) => {
33
+ * const result$ = source<string[]>();
34
+ *
35
+ * setTimeout(() => {
36
+ * result$.next([query]);
37
+ *
38
+ * result$.complete();
39
+ * }, 10);
40
+ *
41
+ * return result$;
42
+ * }),
20
43
  * );
21
44
  *
22
- * results$.subscribe((results) => {
23
- * console.log(results);
45
+ * const mut_history: string[][] = [];
46
+ *
47
+ * results$.subscribe((value) => {
48
+ * mut_history.push(value);
49
+ * });
50
+ *
51
+ * searchQuery$.next('a');
52
+ *
53
+ * searchQuery$.next('ab');
54
+ *
55
+ * searchQuery$.next('abc');
56
+ *
57
+ * await new Promise((resolve) => {
58
+ * setTimeout(resolve, 200);
24
59
  * });
25
- * // Only the latest search results are emitted, previous searches are cancelled
26
60
  *
27
- * const fetchResults = async (_query: string): Promise<readonly unknown[]> => [];
61
+ * assert.deepStrictEqual(mut_history, [['abc']]);
28
62
  * ```
29
63
  *
30
64
  * @note To improve code readability, consider using `createState` instead of `switchMap`,
@@ -1 +1 @@
1
- {"version":3,"file":"switch-map.mjs","sources":["../../../src/core/operators/switch-map.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;MACU,SAAS,GACpB,CACE,eAA2C,KAE7C,CAAC,gBAAgB,KACf,IAAI,wBAAwB,CAAC,gBAAgB,EAAE,eAAe;AAElE,MAAM,wBACJ,SAAQ,yBAA0C,CAAA;AAGzC,IAAA,gBAAgB;AACzB,IAAA,eAAe;AACf,IAAA,iBAAiB;IAEjB,WAAA,CACE,gBAA+B,EAC/B,eAA2C,EAAA;AAE3C,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,YAAY,EAAE,QAAQ,CAAC,IAAI;AAC5B,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,gBAAgB,GAAG,eAAe;AAEvC,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS;AAEhC,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;IACpC;AAES,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IAAI,GAAG,CAAC,aAAa,KAAK,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AAC9D,YAAA,OAAO;QACT;AAEA,QAAA,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE;AAEhC,QAAA,IAAI,CAAC,iBAAiB,EAAE,WAAW,EAAE;QAErC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,CAAC;AAElD,QAAA,IAAI,CAAC,eAAe,GAAG,UAAU;QAEjC,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AACjD,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACxB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY;IACvC;IAES,QAAQ,GAAA;AACf,QAAA,IAAI,CAAC,iBAAiB,EAAE,WAAW,EAAE;AAErC,QAAA,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE;QAEhC,KAAK,CAAC,QAAQ,EAAE;IAClB;AACD;;;;"}
1
+ {"version":3,"file":"switch-map.mjs","sources":["../../../src/core/operators/switch-map.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DG;MACU,SAAS,GACpB,CACE,eAA2C,KAE7C,CAAC,gBAAgB,KACf,IAAI,wBAAwB,CAAC,gBAAgB,EAAE,eAAe;AAElE,MAAM,wBACJ,SAAQ,yBAA0C,CAAA;AAGzC,IAAA,gBAAgB;AACzB,IAAA,eAAe;AACf,IAAA,iBAAiB;IAEjB,WAAA,CACE,gBAA+B,EAC/B,eAA2C,EAAA;AAE3C,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,YAAY,EAAE,QAAQ,CAAC,IAAI;AAC5B,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,gBAAgB,GAAG,eAAe;AAEvC,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS;AAEhC,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;IACpC;AAES,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IAAI,GAAG,CAAC,aAAa,KAAK,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AAC9D,YAAA,OAAO;QACT;AAEA,QAAA,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE;AAEhC,QAAA,IAAI,CAAC,iBAAiB,EAAE,WAAW,EAAE;QAErC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,CAAC;AAElD,QAAA,IAAI,CAAC,eAAe,GAAG,UAAU;QAEjC,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AACjD,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACxB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY;IACvC;IAES,QAAQ,GAAA;AACf,QAAA,IAAI,CAAC,iBAAiB,EAAE,WAAW,EAAE;AAErC,QAAA,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE;QAEhC,KAAK,CAAC,QAAQ,EAAE;IAClB;AACD;;;;"}
@@ -9,23 +9,42 @@ import { type KeepInitialValueOperator, type Observable } from '../types/index.m
9
9
  *
10
10
  * @example
11
11
  * ```ts
12
+ * // Timeline:
13
+ * //
14
+ * // num$ 1 2 stop 3 (ignored)
15
+ * // stopNotifier X
16
+ * // limited$ 1 2 |------- (completed)
17
+ * //
18
+ * // Explanation:
19
+ * // - takeUntil completes the observable when the notifier emits
20
+ * // - After stop() is called, no further values are emitted
21
+ * // - Useful for cleanup and cancellation patterns
22
+ *
12
23
  * const num$ = source<number>();
13
24
  *
14
25
  * const [stopNotifier, stop_] = createEventEmitter();
15
26
  *
16
27
  * const limited$ = num$.pipe(takeUntil(stopNotifier));
17
28
  *
29
+ * const mut_history: number[] = [];
30
+ *
18
31
  * limited$.subscribe((x) => {
19
- * console.log(x);
32
+ * mut_history.push(x);
20
33
  * });
21
34
  *
22
35
  * num$.next(1); // logs: 1
23
36
  *
37
+ * assert.deepStrictEqual(mut_history, [1]);
38
+ *
24
39
  * num$.next(2); // logs: 2
25
40
  *
41
+ * assert.deepStrictEqual(mut_history, [1, 2]);
42
+ *
26
43
  * stop_();
27
44
  *
28
45
  * num$.next(3); // nothing logged (completed)
46
+ *
47
+ * assert.deepStrictEqual(mut_history, [1, 2]);
29
48
  * ```
30
49
  */
31
50
  export declare const takeUntil: <A>(notifier: Observable<unknown>) => KeepInitialValueOperator<A, A>;
@@ -1 +1 @@
1
- {"version":3,"file":"take-until.d.mts","sourceRoot":"","sources":["../../../src/core/operators/take-until.mts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EAGhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EACzB,UAAU,UAAU,CAAC,OAAO,CAAC,KAC5B,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAMQ,CAAC"}
1
+ {"version":3,"file":"take-until.d.mts","sourceRoot":"","sources":["../../../src/core/operators/take-until.mts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EAGhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EACzB,UAAU,UAAU,CAAC,OAAO,CAAC,KAC5B,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAMQ,CAAC"}
@@ -12,23 +12,42 @@ import '../utils/id-maker.mjs';
12
12
  *
13
13
  * @example
14
14
  * ```ts
15
+ * // Timeline:
16
+ * //
17
+ * // num$ 1 2 stop 3 (ignored)
18
+ * // stopNotifier X
19
+ * // limited$ 1 2 |------- (completed)
20
+ * //
21
+ * // Explanation:
22
+ * // - takeUntil completes the observable when the notifier emits
23
+ * // - After stop() is called, no further values are emitted
24
+ * // - Useful for cleanup and cancellation patterns
25
+ *
15
26
  * const num$ = source<number>();
16
27
  *
17
28
  * const [stopNotifier, stop_] = createEventEmitter();
18
29
  *
19
30
  * const limited$ = num$.pipe(takeUntil(stopNotifier));
20
31
  *
32
+ * const mut_history: number[] = [];
33
+ *
21
34
  * limited$.subscribe((x) => {
22
- * console.log(x);
35
+ * mut_history.push(x);
23
36
  * });
24
37
  *
25
38
  * num$.next(1); // logs: 1
26
39
  *
40
+ * assert.deepStrictEqual(mut_history, [1]);
41
+ *
27
42
  * num$.next(2); // logs: 2
28
43
  *
44
+ * assert.deepStrictEqual(mut_history, [1, 2]);
45
+ *
29
46
  * stop_();
30
47
  *
31
48
  * num$.next(3); // nothing logged (completed)
49
+ *
50
+ * assert.deepStrictEqual(mut_history, [1, 2]);
32
51
  * ```
33
52
  */
34
53
  const takeUntil = (notifier) =>
@@ -1 +1 @@
1
- {"version":3,"file":"take-until.mjs","sources":["../../../src/core/operators/take-until.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BG;AACI,MAAM,SAAS,GAAG,CACvB,QAA6B;AAE7B;AACA,CAAC,CAAC,gBAAgB,KAChB,IAAI,wBAAwB,CAC1B,gBAAgB,EAChB,QAAQ,CACT;AAEL,MAAM,wBACJ,SAAQ,wBAAyC,CAAA;IAGjD,WAAA,CAAY,gBAA+B,EAAE,QAA6B,EAAA;AACxE,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;AAC3B,YAAA,YAAY,EAAE,gBAAgB,CAAC,WAAW,EAAE;AAC7C,SAAA,CAAC;AAEF,QAAA,QAAQ,CAAC,SAAS,CAChB,MAAK;YACH,IAAI,CAAC,QAAQ,EAAE;QACjB,CAAC,EACD,MAAK;YACH,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CACF;IACH;AAES,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IAAI,GAAG,CAAC,aAAa,KAAK,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AAC9D,YAAA,OAAO;QACT;QAEA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;IACvC;AACD;;;;"}
1
+ {"version":3,"file":"take-until.mjs","sources":["../../../src/core/operators/take-until.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CG;AACI,MAAM,SAAS,GAAG,CACvB,QAA6B;AAE7B;AACA,CAAC,CAAC,gBAAgB,KAChB,IAAI,wBAAwB,CAC1B,gBAAgB,EAChB,QAAQ,CACT;AAEL,MAAM,wBACJ,SAAQ,wBAAyC,CAAA;IAGjD,WAAA,CAAY,gBAA+B,EAAE,QAA6B,EAAA;AACxE,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;AAC3B,YAAA,YAAY,EAAE,gBAAgB,CAAC,WAAW,EAAE;AAC7C,SAAA,CAAC;AAEF,QAAA,QAAQ,CAAC,SAAS,CAChB,MAAK;YACH,IAAI,CAAC,QAAQ,EAAE;QACjB,CAAC,EACD,MAAK;YACH,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CACF;IACH;AAES,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IAAI,GAAG,CAAC,aAAa,KAAK,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AAC9D,YAAA,OAAO;QACT;QAEA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;IACvC;AACD;;;;"}
@@ -1,4 +1,51 @@
1
1
  import { type DropInitialValueOperator } from '../types/index.mjs';
2
+ /**
3
+ * Emits values from the source observable while the predicate returns true.
4
+ * Completes immediately when the predicate returns false.
5
+ *
6
+ * @template A - The type of values from the source
7
+ * @param predicate - Function to test each value
8
+ * @returns An operator that takes values while the predicate is true
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * // Timeline:
13
+ * //
14
+ * // num$ 1 2 3 4 5 6 (ignored)
15
+ * // taken$ 1 2 3 4 | (completes)
16
+ * //
17
+ * // Explanation:
18
+ * // - takeWhile emits values while the predicate returns true
19
+ * // - Completes immediately when the predicate returns false
20
+ * // - No further values are emitted after completion
21
+ *
22
+ * const num$ = source<number>();
23
+ *
24
+ * const taken$ = num$.pipe(takeWhile((x) => x < 5));
25
+ *
26
+ * const mut_history: number[] = [];
27
+ *
28
+ * taken$.subscribe((x) => {
29
+ * mut_history.push(x);
30
+ * });
31
+ *
32
+ * num$.next(1); // logs: 1
33
+ *
34
+ * assert.deepStrictEqual(mut_history, [1]);
35
+ *
36
+ * num$.next(2); // logs: 2
37
+ *
38
+ * assert.deepStrictEqual(mut_history, [1, 2]);
39
+ *
40
+ * num$.next(5); // nothing logged (completes)
41
+ *
42
+ * assert.deepStrictEqual(mut_history, [1, 2]);
43
+ *
44
+ * num$.next(6); // nothing logged (already completed)
45
+ *
46
+ * assert.deepStrictEqual(mut_history, [1, 2]);
47
+ * ```
48
+ */
2
49
  export declare const takeWhile: <A>(predicate: (value: A, index: SafeUint | -1) => boolean) => DropInitialValueOperator<A, A>;
3
50
  export declare const take: <A>(n: PositiveSafeIntWithSmallInt) => DropInitialValueOperator<A, A>;
4
51
  //# sourceMappingURL=take-while.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"take-while.d.mts","sourceRoot":"","sources":["../../../src/core/operators/take-while.mts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,wBAAwB,EAK9B,MAAM,oBAAoB,CAAC;AAG5B,eAAO,MAAM,SAAS,GACnB,CAAC,EACA,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,OAAO,KACrD,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAE2B,CAAC;AAI9D,eAAO,MAAM,IAAI,GAAI,CAAC,EACpB,GAAG,2BAA2B,KAC7B,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAA4C,CAAC"}
1
+ {"version":3,"file":"take-while.d.mts","sourceRoot":"","sources":["../../../src/core/operators/take-while.mts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,wBAAwB,EAK9B,MAAM,oBAAoB,CAAC;AAG5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,eAAO,MAAM,SAAS,GACnB,CAAC,EACA,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,OAAO,KACrD,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAE2B,CAAC;AAI9D,eAAO,MAAM,IAAI,GAAI,CAAC,EACpB,GAAG,2BAA2B,KAC7B,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAA4C,CAAC"}
@@ -2,6 +2,53 @@ import { pipe, Optional, asSafeUint, SafeUint } from 'ts-data-forge';
2
2
  import { SyncChildObservableClass } from '../class/child-observable-class.mjs';
3
3
  import '../utils/id-maker.mjs';
4
4
 
5
+ /**
6
+ * Emits values from the source observable while the predicate returns true.
7
+ * Completes immediately when the predicate returns false.
8
+ *
9
+ * @template A - The type of values from the source
10
+ * @param predicate - Function to test each value
11
+ * @returns An operator that takes values while the predicate is true
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // Timeline:
16
+ * //
17
+ * // num$ 1 2 3 4 5 6 (ignored)
18
+ * // taken$ 1 2 3 4 | (completes)
19
+ * //
20
+ * // Explanation:
21
+ * // - takeWhile emits values while the predicate returns true
22
+ * // - Completes immediately when the predicate returns false
23
+ * // - No further values are emitted after completion
24
+ *
25
+ * const num$ = source<number>();
26
+ *
27
+ * const taken$ = num$.pipe(takeWhile((x) => x < 5));
28
+ *
29
+ * const mut_history: number[] = [];
30
+ *
31
+ * taken$.subscribe((x) => {
32
+ * mut_history.push(x);
33
+ * });
34
+ *
35
+ * num$.next(1); // logs: 1
36
+ *
37
+ * assert.deepStrictEqual(mut_history, [1]);
38
+ *
39
+ * num$.next(2); // logs: 2
40
+ *
41
+ * assert.deepStrictEqual(mut_history, [1, 2]);
42
+ *
43
+ * num$.next(5); // nothing logged (completes)
44
+ *
45
+ * assert.deepStrictEqual(mut_history, [1, 2]);
46
+ *
47
+ * num$.next(6); // nothing logged (already completed)
48
+ *
49
+ * assert.deepStrictEqual(mut_history, [1, 2]);
50
+ * ```
51
+ */
5
52
  const takeWhile = (predicate) => (parentObservable) => new TakeWhileObservableClass(parentObservable, predicate);
6
53
  /* Specialized operators */
7
54
  const take = (n) => takeWhile((_, index) => index + 1 <= n);
@@ -1 +1 @@
1
- {"version":3,"file":"take-while.mjs","sources":["../../../src/core/operators/take-while.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAkBO,MAAM,SAAS,GACpB,CACE,SAAsD,KAExD,CAAC,gBAAgB,KACf,IAAI,wBAAwB,CAAC,gBAAgB,EAAE,SAAS;AAE5D;MAEa,IAAI,GAAG,CAClB,CAA8B,KACK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,GAAG,CAAC,IAAI,CAAC;AAE3E;AAEA,MAAM,wBACJ,SAAQ,wBAAyC,CAAA;AAGxC,IAAA,UAAU;AACnB,IAAA,UAAU;IAEV,WAAA,CACE,gBAA+B,EAC/B,SAAsD,EAAA;AAEtD,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KACzD,QAAQ,CAAC,MAAM,CAAC,GAAG;kBACf,QAAQ,CAAC;kBACT,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE;AACvB,sBAAE;AACF,sBAAE,QAAQ,CAAC,IAAI,CACpB,CAAC,KAAK;AACR,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AAEpB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;;AAGpB,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IAAI,GAAG,CAAC,aAAa,KAAK,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AAC9D,YAAA,OAAO;;AAGT,QAAA,IAAI,CAAC,UAAU;YACb,IAAI,CAAC,UAAU,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;AAE3E,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;YAC9C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;;aAChC;YACL,IAAI,CAAC,QAAQ,EAAE;;;AAGpB;;;;"}
1
+ {"version":3,"file":"take-while.mjs","sources":["../../../src/core/operators/take-while.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CG;AACI,MAAM,SAAS,GACpB,CACE,SAAsD,KAExD,CAAC,gBAAgB,KACf,IAAI,wBAAwB,CAAC,gBAAgB,EAAE,SAAS;AAE5D;MAEa,IAAI,GAAG,CAClB,CAA8B,KACK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,GAAG,CAAC,IAAI,CAAC;AAE3E;AAEA,MAAM,wBACJ,SAAQ,wBAAyC,CAAA;AAGxC,IAAA,UAAU;AACnB,IAAA,UAAU;IAEV,WAAA,CACE,gBAA+B,EAC/B,SAAsD,EAAA;AAEtD,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KACzD,QAAQ,CAAC,MAAM,CAAC,GAAG;kBACf,QAAQ,CAAC;kBACT,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE;AACvB,sBAAE;AACF,sBAAE,QAAQ,CAAC,IAAI,CACpB,CAAC,KAAK;AACR,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AAEpB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;;AAGpB,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IAAI,GAAG,CAAC,aAAa,KAAK,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AAC9D,YAAA,OAAO;;AAGT,QAAA,IAAI,CAAC,UAAU;YACb,IAAI,CAAC,UAAU,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;AAE3E,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;YAC9C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;;aAChC;YACL,IAAI,CAAC,QAAQ,EAAE;;;AAGpB;;;;"}
@@ -9,14 +9,53 @@ import { type KeepInitialValueOperator } from '../types/index.mjs';
9
9
  *
10
10
  * @example
11
11
  * ```ts
12
- * const scroll$ = source<Event>();
12
+ * // Timeline (1000ms throttle):
13
+ * //
14
+ * // Time(ms) 0 100 200 300 ... 1000 1100 1200 ... 2000 2100
15
+ * // scroll$ e1 e2 e3 e4 e5 e6 e7 e8 e9
16
+ * // throttled$ e1 e5 e8
17
+ * // |-------1000ms------> |------1000ms------> |------1000ms------>
18
+ * //
19
+ * // Explanation:
20
+ * // - throttleTime emits the first value immediately, then ignores subsequent values
21
+ * // for the specified duration (1000ms)
22
+ * // - At 0ms: e1 is emitted immediately
23
+ * // - At 100-300ms: e2, e3, e4 are ignored (within 1000ms window)
24
+ * // - At 1000ms: e5 is emitted (1000ms has passed since e1)
25
+ * // - At 1100-1200ms: e6, e7 are ignored
26
+ * // - At 2000ms: e8 is emitted (1000ms has passed since e5)
13
27
  *
14
- * const throttled$ = scroll$.pipe(throttleTime(1000));
28
+ * const scroll$ = source<number>();
15
29
  *
16
- * throttled$.subscribe((event_) => {
17
- * console.log(event_);
30
+ * const throttled$ = scroll$.pipe(throttleTime(200));
31
+ *
32
+ * const mut_history: number[] = [];
33
+ *
34
+ * throttled$.subscribe((value) => {
35
+ * mut_history.push(value);
18
36
  * });
19
- * // Emits at most once per second
37
+ *
38
+ * scroll$.next(1);
39
+ *
40
+ * assert.deepStrictEqual(mut_history, [1]);
41
+ *
42
+ * await new Promise((resolve) => {
43
+ * setTimeout(resolve, 50);
44
+ * });
45
+ *
46
+ * scroll$.next(2);
47
+ *
48
+ * scroll$.next(3);
49
+ *
50
+ * assert.deepStrictEqual(mut_history, [1]);
51
+ *
52
+ * await new Promise((resolve) => {
53
+ * setTimeout(resolve, 200);
54
+ * });
55
+ *
56
+ * scroll$.next(4);
57
+ *
58
+ * assert.deepStrictEqual(mut_history, [1, 4]);
20
59
  * ```
21
60
  */
22
61
  export declare const throttleTime: <A>(milliSeconds: number) => KeepInitialValueOperator<A, A>;
@@ -1 +1 @@
1
- {"version":3,"file":"throttle-time.d.mts","sourceRoot":"","sources":["../../../src/core/operators/throttle-time.mts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,wBAAwB,EAI9B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAC5B,cAAc,MAAM,KACnB,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAMQ,CAAC"}
1
+ {"version":3,"file":"throttle-time.d.mts","sourceRoot":"","sources":["../../../src/core/operators/throttle-time.mts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,wBAAwB,EAI9B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAC5B,cAAc,MAAM,KACnB,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAMQ,CAAC"}
@@ -12,14 +12,53 @@ import '../utils/id-maker.mjs';
12
12
  *
13
13
  * @example
14
14
  * ```ts
15
- * const scroll$ = source<Event>();
15
+ * // Timeline (1000ms throttle):
16
+ * //
17
+ * // Time(ms) 0 100 200 300 ... 1000 1100 1200 ... 2000 2100
18
+ * // scroll$ e1 e2 e3 e4 e5 e6 e7 e8 e9
19
+ * // throttled$ e1 e5 e8
20
+ * // |-------1000ms------> |------1000ms------> |------1000ms------>
21
+ * //
22
+ * // Explanation:
23
+ * // - throttleTime emits the first value immediately, then ignores subsequent values
24
+ * // for the specified duration (1000ms)
25
+ * // - At 0ms: e1 is emitted immediately
26
+ * // - At 100-300ms: e2, e3, e4 are ignored (within 1000ms window)
27
+ * // - At 1000ms: e5 is emitted (1000ms has passed since e1)
28
+ * // - At 1100-1200ms: e6, e7 are ignored
29
+ * // - At 2000ms: e8 is emitted (1000ms has passed since e5)
16
30
  *
17
- * const throttled$ = scroll$.pipe(throttleTime(1000));
31
+ * const scroll$ = source<number>();
18
32
  *
19
- * throttled$.subscribe((event_) => {
20
- * console.log(event_);
33
+ * const throttled$ = scroll$.pipe(throttleTime(200));
34
+ *
35
+ * const mut_history: number[] = [];
36
+ *
37
+ * throttled$.subscribe((value) => {
38
+ * mut_history.push(value);
21
39
  * });
22
- * // Emits at most once per second
40
+ *
41
+ * scroll$.next(1);
42
+ *
43
+ * assert.deepStrictEqual(mut_history, [1]);
44
+ *
45
+ * await new Promise((resolve) => {
46
+ * setTimeout(resolve, 50);
47
+ * });
48
+ *
49
+ * scroll$.next(2);
50
+ *
51
+ * scroll$.next(3);
52
+ *
53
+ * assert.deepStrictEqual(mut_history, [1]);
54
+ *
55
+ * await new Promise((resolve) => {
56
+ * setTimeout(resolve, 200);
57
+ * });
58
+ *
59
+ * scroll$.next(4);
60
+ *
61
+ * assert.deepStrictEqual(mut_history, [1, 4]);
23
62
  * ```
24
63
  */
25
64
  const throttleTime = (milliSeconds) =>
@@ -1 +1 @@
1
- {"version":3,"file":"throttle-time.mjs","sources":["../../../src/core/operators/throttle-time.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AASA;;;;;;;;;;;;;;;;;;;AAmBG;AACI,MAAM,YAAY,GAAG,CAC1B,YAAoB;AAEpB;AACA,CAAC,CAAC,gBAAgB,KAChB,IAAI,2BAA2B,CAC7B,gBAAgB,EAChB,YAAY,CACb;AAEL,MAAM,2BACJ,SAAQ,wBAAyC,CAAA;AAGxC,IAAA,aAAa;AACtB,IAAA,YAAY;AACZ,IAAA,eAAe;IAEf,WAAA,CAAY,gBAA+B,EAAE,YAAoB,EAAA;AAC/D,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;AAC3B,YAAA,YAAY,EAAE,gBAAgB,CAAC,WAAW,EAAE;AAC7C,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAE7B,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAE5B,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY;IACnC;AAES,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IACE,GAAG,CAAC,aAAa,KAAK,aAAa;AACnC,YAAA,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,eAAe,EACpB;AACA,YAAA,OAAO;QACT;QAEA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;AAErC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AAG3B,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAClC,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC9B,QAAA,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC;IACxB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;AACnC,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QACjC;IACF;IAES,QAAQ,GAAA;QACf,IAAI,CAAC,WAAW,EAAE;QAElB,KAAK,CAAC,QAAQ,EAAE;IAClB;AACD;;;;"}
1
+ {"version":3,"file":"throttle-time.mjs","sources":["../../../src/core/operators/throttle-time.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DG;AACI,MAAM,YAAY,GAAG,CAC1B,YAAoB;AAEpB;AACA,CAAC,CAAC,gBAAgB,KAChB,IAAI,2BAA2B,CAC7B,gBAAgB,EAChB,YAAY,CACb;AAEL,MAAM,2BACJ,SAAQ,wBAAyC,CAAA;AAGxC,IAAA,aAAa;AACtB,IAAA,YAAY;AACZ,IAAA,eAAe;IAEf,WAAA,CAAY,gBAA+B,EAAE,YAAoB,EAAA;AAC/D,QAAA,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,gBAAgB,CAAC;AAC3B,YAAA,YAAY,EAAE,gBAAgB,CAAC,WAAW,EAAE;AAC7C,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAE7B,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAE5B,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY;IACnC;AAES,IAAA,SAAS,CAAC,aAA4B,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,QAAA,IACE,GAAG,CAAC,aAAa,KAAK,aAAa;AACnC,YAAA,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,eAAe,EACpB;AACA,YAAA,OAAO;QACT;QAEA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;AAErC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AAG3B,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAClC,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC9B,QAAA,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC;IACxB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;AACnC,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QACjC;IACF;IAES,QAAQ,GAAA;QACf,IAAI,CAAC,WAAW,EAAE;QAElB,KAAK,CAAC,QAAQ,EAAE;IAClB;AACD;;;;"}