synstate 0.1.2 → 1.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 (323) hide show
  1. package/README.md +200 -147
  2. package/assets/old/synstate-icon-square.png +0 -0
  3. package/assets/synstate-logo.png +0 -0
  4. package/dist/core/class/child-observable-class.d.mts +2 -0
  5. package/dist/core/class/child-observable-class.d.mts.map +1 -1
  6. package/dist/core/class/child-observable-class.mjs +44 -13
  7. package/dist/core/class/child-observable-class.mjs.map +1 -1
  8. package/dist/core/class/observable-base-class.d.mts +4 -4
  9. package/dist/core/class/observable-base-class.d.mts.map +1 -1
  10. package/dist/core/class/observable-base-class.mjs +8 -8
  11. package/dist/core/class/observable-base-class.mjs.map +1 -1
  12. package/dist/core/class/root-observable-class.d.mts +3 -1
  13. package/dist/core/class/root-observable-class.d.mts.map +1 -1
  14. package/dist/core/class/root-observable-class.mjs +9 -9
  15. package/dist/core/class/root-observable-class.mjs.map +1 -1
  16. package/dist/core/combine/combine.d.mts +7 -6
  17. package/dist/core/combine/combine.d.mts.map +1 -1
  18. package/dist/core/combine/combine.mjs +11 -12
  19. package/dist/core/combine/combine.mjs.map +1 -1
  20. package/dist/core/combine/merge.d.mts +7 -6
  21. package/dist/core/combine/merge.d.mts.map +1 -1
  22. package/dist/core/combine/merge.mjs +9 -9
  23. package/dist/core/combine/merge.mjs.map +1 -1
  24. package/dist/core/combine/zip.d.mts +21 -19
  25. package/dist/core/combine/zip.d.mts.map +1 -1
  26. package/dist/core/combine/zip.mjs +22 -21
  27. package/dist/core/combine/zip.mjs.map +1 -1
  28. package/dist/core/create/{interval.d.mts → counter.d.mts} +14 -12
  29. package/dist/core/create/counter.d.mts.map +1 -0
  30. package/dist/core/create/{interval.mjs → counter.mjs} +21 -23
  31. package/dist/core/create/counter.mjs.map +1 -0
  32. package/dist/core/create/from-abortable-promise.d.mts +29 -0
  33. package/dist/core/create/from-abortable-promise.d.mts.map +1 -0
  34. package/dist/core/create/from-abortable-promise.mjs +70 -0
  35. package/dist/core/create/from-abortable-promise.mjs.map +1 -0
  36. package/dist/core/create/from-promise.d.mts +9 -6
  37. package/dist/core/create/from-promise.d.mts.map +1 -1
  38. package/dist/core/create/from-promise.mjs +8 -5
  39. package/dist/core/create/from-promise.mjs.map +1 -1
  40. package/dist/core/create/from-subscribable.d.mts +4 -4
  41. package/dist/core/create/from-subscribable.mjs +4 -4
  42. package/dist/core/create/index.d.mts +3 -3
  43. package/dist/core/create/index.d.mts.map +1 -1
  44. package/dist/core/create/index.mjs +4 -4
  45. package/dist/core/create/just.d.mts +32 -0
  46. package/dist/core/create/just.d.mts.map +1 -0
  47. package/dist/core/create/just.mjs +44 -0
  48. package/dist/core/create/just.mjs.map +1 -0
  49. package/dist/core/create/source.d.mts +7 -12
  50. package/dist/core/create/source.d.mts.map +1 -1
  51. package/dist/core/create/source.mjs +1 -6
  52. package/dist/core/create/source.mjs.map +1 -1
  53. package/dist/core/create/timer.d.mts +6 -4
  54. package/dist/core/create/timer.d.mts.map +1 -1
  55. package/dist/core/create/timer.mjs +6 -7
  56. package/dist/core/create/timer.mjs.map +1 -1
  57. package/dist/core/index.d.mts +0 -1
  58. package/dist/core/index.d.mts.map +1 -1
  59. package/dist/core/index.mjs +8 -13
  60. package/dist/core/index.mjs.map +1 -1
  61. package/dist/core/operators/audit.d.mts +97 -0
  62. package/dist/core/operators/audit.d.mts.map +1 -0
  63. package/dist/core/operators/audit.mjs +144 -0
  64. package/dist/core/operators/audit.mjs.map +1 -0
  65. package/dist/core/operators/debounce.d.mts +88 -0
  66. package/dist/core/operators/debounce.d.mts.map +1 -0
  67. package/dist/core/operators/debounce.mjs +130 -0
  68. package/dist/core/operators/debounce.mjs.map +1 -0
  69. package/dist/core/operators/filter.d.mts +6 -5
  70. package/dist/core/operators/filter.d.mts.map +1 -1
  71. package/dist/core/operators/filter.mjs +3 -3
  72. package/dist/core/operators/filter.mjs.map +1 -1
  73. package/dist/core/operators/index.d.mts +4 -4
  74. package/dist/core/operators/index.d.mts.map +1 -1
  75. package/dist/core/operators/index.mjs +4 -4
  76. package/dist/core/operators/{map-with-index.d.mts → map.d.mts} +12 -11
  77. package/dist/core/operators/map.d.mts.map +1 -0
  78. package/dist/core/operators/{map-with-index.mjs → map.mjs} +17 -17
  79. package/dist/core/operators/map.mjs.map +1 -0
  80. package/dist/core/operators/merge-map.d.mts +56 -29
  81. package/dist/core/operators/merge-map.d.mts.map +1 -1
  82. package/dist/core/operators/merge-map.mjs +58 -31
  83. package/dist/core/operators/merge-map.mjs.map +1 -1
  84. package/dist/core/operators/pairwise.d.mts +6 -6
  85. package/dist/core/operators/pairwise.mjs +9 -9
  86. package/dist/core/operators/pairwise.mjs.map +1 -1
  87. package/dist/core/operators/scan.d.mts +6 -6
  88. package/dist/core/operators/scan.mjs +9 -9
  89. package/dist/core/operators/scan.mjs.map +1 -1
  90. package/dist/core/operators/skip-if-no-change.d.mts +20 -8
  91. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
  92. package/dist/core/operators/skip-if-no-change.mjs +23 -11
  93. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  94. package/dist/core/operators/skip-until.d.mts +5 -5
  95. package/dist/core/operators/skip-until.mjs +8 -8
  96. package/dist/core/operators/skip-until.mjs.map +1 -1
  97. package/dist/core/operators/skip-while.d.mts +19 -8
  98. package/dist/core/operators/skip-while.d.mts.map +1 -1
  99. package/dist/core/operators/skip-while.mjs +26 -11
  100. package/dist/core/operators/skip-while.mjs.map +1 -1
  101. package/dist/core/operators/switch-map.d.mts +57 -26
  102. package/dist/core/operators/switch-map.d.mts.map +1 -1
  103. package/dist/core/operators/switch-map.mjs +59 -28
  104. package/dist/core/operators/switch-map.mjs.map +1 -1
  105. package/dist/core/operators/take-until.d.mts +5 -5
  106. package/dist/core/operators/take-until.mjs +8 -8
  107. package/dist/core/operators/take-until.mjs.map +1 -1
  108. package/dist/core/operators/take-while.d.mts +16 -7
  109. package/dist/core/operators/take-while.d.mts.map +1 -1
  110. package/dist/core/operators/take-while.mjs +18 -10
  111. package/dist/core/operators/take-while.mjs.map +1 -1
  112. package/dist/core/operators/throttle.d.mts +81 -0
  113. package/dist/core/operators/throttle.d.mts.map +1 -0
  114. package/dist/core/operators/throttle.mjs +126 -0
  115. package/dist/core/operators/throttle.mjs.map +1 -0
  116. package/dist/core/operators/with-buffered-from.d.mts +9 -9
  117. package/dist/core/operators/with-buffered-from.mjs +12 -12
  118. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  119. package/dist/core/operators/with-current-value-from.d.mts +10 -9
  120. package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
  121. package/dist/core/operators/with-current-value-from.mjs +13 -12
  122. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  123. package/dist/core/operators/with-initial-value.d.mts +5 -5
  124. package/dist/core/operators/with-initial-value.mjs +8 -8
  125. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  126. package/dist/core/predefined/index.mjs +0 -1
  127. package/dist/core/predefined/index.mjs.map +1 -1
  128. package/dist/core/predefined/operators/attach-index.d.mts +50 -0
  129. package/dist/core/predefined/operators/attach-index.d.mts.map +1 -1
  130. package/dist/core/predefined/operators/attach-index.mjs +51 -2
  131. package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
  132. package/dist/core/predefined/operators/index.d.mts +0 -1
  133. package/dist/core/predefined/operators/index.d.mts.map +1 -1
  134. package/dist/core/predefined/operators/index.mjs +0 -1
  135. package/dist/core/predefined/operators/index.mjs.map +1 -1
  136. package/dist/core/predefined/operators/map-optional.d.mts +48 -1
  137. package/dist/core/predefined/operators/map-optional.d.mts.map +1 -1
  138. package/dist/core/predefined/operators/map-optional.mjs +49 -1
  139. package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
  140. package/dist/core/predefined/operators/map-result-err.d.mts +48 -1
  141. package/dist/core/predefined/operators/map-result-err.d.mts.map +1 -1
  142. package/dist/core/predefined/operators/map-result-err.mjs +49 -1
  143. package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
  144. package/dist/core/predefined/operators/map-result-ok.d.mts +48 -1
  145. package/dist/core/predefined/operators/map-result-ok.d.mts.map +1 -1
  146. package/dist/core/predefined/operators/map-result-ok.mjs +49 -1
  147. package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
  148. package/dist/core/predefined/operators/map-to.d.mts +40 -0
  149. package/dist/core/predefined/operators/map-to.d.mts.map +1 -1
  150. package/dist/core/predefined/operators/map-to.mjs +43 -1
  151. package/dist/core/predefined/operators/map-to.mjs.map +1 -1
  152. package/dist/core/predefined/operators/pluck.d.mts +39 -0
  153. package/dist/core/predefined/operators/pluck.d.mts.map +1 -1
  154. package/dist/core/predefined/operators/pluck.mjs +42 -1
  155. package/dist/core/predefined/operators/pluck.mjs.map +1 -1
  156. package/dist/core/predefined/operators/skip.d.mts +48 -0
  157. package/dist/core/predefined/operators/skip.d.mts.map +1 -1
  158. package/dist/core/predefined/operators/skip.mjs +47 -0
  159. package/dist/core/predefined/operators/skip.mjs.map +1 -1
  160. package/dist/core/predefined/operators/take.d.mts +42 -0
  161. package/dist/core/predefined/operators/take.d.mts.map +1 -1
  162. package/dist/core/predefined/operators/take.mjs +41 -0
  163. package/dist/core/predefined/operators/take.mjs.map +1 -1
  164. package/dist/core/predefined/operators/unwrap-optional.d.mts +41 -1
  165. package/dist/core/predefined/operators/unwrap-optional.d.mts.map +1 -1
  166. package/dist/core/predefined/operators/unwrap-optional.mjs +42 -1
  167. package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
  168. package/dist/core/predefined/operators/unwrap-result-err.d.mts +41 -1
  169. package/dist/core/predefined/operators/unwrap-result-err.d.mts.map +1 -1
  170. package/dist/core/predefined/operators/unwrap-result-err.mjs +42 -1
  171. package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
  172. package/dist/core/predefined/operators/unwrap-result-ok.d.mts +41 -1
  173. package/dist/core/predefined/operators/unwrap-result-ok.d.mts.map +1 -1
  174. package/dist/core/predefined/operators/unwrap-result-ok.mjs +42 -1
  175. package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
  176. package/dist/core/types/id.d.mts +2 -1
  177. package/dist/core/types/id.d.mts.map +1 -1
  178. package/dist/core/types/index.d.mts +1 -0
  179. package/dist/core/types/index.d.mts.map +1 -1
  180. package/dist/core/types/observable-family.d.mts +10 -14
  181. package/dist/core/types/observable-family.d.mts.map +1 -1
  182. package/dist/core/types/observable-kind.d.mts +1 -0
  183. package/dist/core/types/observable-kind.d.mts.map +1 -1
  184. package/dist/core/types/observable.d.mts +5 -3
  185. package/dist/core/types/observable.d.mts.map +1 -1
  186. package/dist/core/types/observable.mjs.map +1 -1
  187. package/dist/core/types/timer.d.mts +2 -0
  188. package/dist/core/types/timer.d.mts.map +1 -0
  189. package/dist/core/types/timer.mjs +2 -0
  190. package/dist/core/types/timer.mjs.map +1 -0
  191. package/dist/core/utils/id-maker.d.mts +2 -2
  192. package/dist/core/utils/id-maker.d.mts.map +1 -1
  193. package/dist/core/utils/id-maker.mjs +3 -3
  194. package/dist/core/utils/id-maker.mjs.map +1 -1
  195. package/dist/core/utils/index.mjs +1 -1
  196. package/dist/core/utils/utils.d.mts +2 -0
  197. package/dist/core/utils/utils.d.mts.map +1 -1
  198. package/dist/core/utils/utils.mjs.map +1 -1
  199. package/dist/entry-point.mjs +11 -14
  200. package/dist/entry-point.mjs.map +1 -1
  201. package/dist/index.mjs +11 -14
  202. package/dist/index.mjs.map +1 -1
  203. package/dist/types.d.mts +1 -2
  204. package/dist/utils/collect-to-array.d.mts +3 -0
  205. package/dist/utils/collect-to-array.d.mts.map +1 -0
  206. package/dist/utils/collect-to-array.mjs +11 -0
  207. package/dist/utils/collect-to-array.mjs.map +1 -0
  208. package/dist/utils/create-boolean-state.d.mts +40 -0
  209. package/dist/utils/create-boolean-state.d.mts.map +1 -0
  210. package/dist/utils/create-boolean-state.mjs +53 -0
  211. package/dist/utils/create-boolean-state.mjs.map +1 -0
  212. package/dist/utils/create-event-emitter.d.mts +4 -4
  213. package/dist/utils/create-event-emitter.mjs +4 -4
  214. package/dist/utils/create-reducer.d.mts +11 -7
  215. package/dist/utils/create-reducer.d.mts.map +1 -1
  216. package/dist/utils/create-reducer.mjs +7 -7
  217. package/dist/utils/create-reducer.mjs.map +1 -1
  218. package/dist/utils/create-state.d.mts +8 -48
  219. package/dist/utils/create-state.d.mts.map +1 -1
  220. package/dist/utils/create-state.mjs +10 -60
  221. package/dist/utils/create-state.mjs.map +1 -1
  222. package/dist/utils/index.d.mts +2 -0
  223. package/dist/utils/index.d.mts.map +1 -1
  224. package/dist/utils/index.mjs +3 -1
  225. package/dist/utils/index.mjs.map +1 -1
  226. package/package.json +21 -14
  227. package/src/core/class/child-observable-class.mts +68 -14
  228. package/src/core/class/circular-dependency-comparison.test.mts +142 -0
  229. package/src/core/class/circular-dependency.test.mts +251 -0
  230. package/src/core/class/observable-base-class.mts +10 -9
  231. package/src/core/class/root-observable-class.mts +15 -10
  232. package/src/core/combine/combine.mts +14 -13
  233. package/src/core/combine/merge.mts +14 -14
  234. package/src/core/combine/zip.mts +27 -25
  235. package/src/core/create/{interval.mts → counter.mts} +32 -30
  236. package/src/core/create/from-abortable-promise.mts +83 -0
  237. package/src/core/create/from-promise.mts +10 -7
  238. package/src/core/create/from-subscribable.mts +4 -4
  239. package/src/core/create/index.mts +3 -3
  240. package/src/core/create/just.mts +43 -0
  241. package/src/core/create/source.mts +10 -14
  242. package/src/core/create/timer.mts +12 -11
  243. package/src/core/index.mts +0 -1
  244. package/src/core/operators/audit.mts +172 -0
  245. package/src/core/operators/debounce.mts +154 -0
  246. package/src/core/operators/filter.mts +9 -9
  247. package/src/core/operators/index.mts +4 -4
  248. package/src/core/operators/{map-with-index.mts → map.mts} +20 -20
  249. package/src/core/operators/merge-map.mts +59 -32
  250. package/src/core/operators/pairwise.mts +10 -10
  251. package/src/core/operators/scan.mts +10 -10
  252. package/src/core/operators/skip-if-no-change.mts +24 -12
  253. package/src/core/operators/skip-until.mts +9 -9
  254. package/src/core/operators/skip-while.mts +29 -12
  255. package/src/core/operators/switch-map.mts +60 -29
  256. package/src/core/operators/take-until.mts +9 -9
  257. package/src/core/operators/take-while.mts +19 -11
  258. package/src/core/operators/{throttle-time.mts → throttle.mts} +58 -38
  259. package/src/core/operators/with-buffered-from.mts +13 -13
  260. package/src/core/operators/with-current-value-from.mts +14 -13
  261. package/src/core/operators/with-initial-value.mts +9 -9
  262. package/src/core/predefined/operators/attach-index.mts +52 -2
  263. package/src/core/predefined/operators/index.mts +0 -1
  264. package/src/core/predefined/operators/map-optional.mts +49 -2
  265. package/src/core/predefined/operators/map-result-err.mts +49 -2
  266. package/src/core/predefined/operators/map-result-ok.mts +49 -2
  267. package/src/core/predefined/operators/map-to.mts +41 -1
  268. package/src/core/predefined/operators/pluck.mts +40 -1
  269. package/src/core/predefined/operators/skip.mts +48 -0
  270. package/src/core/predefined/operators/take.mts +42 -0
  271. package/src/core/predefined/operators/unwrap-optional.mts +43 -2
  272. package/src/core/predefined/operators/unwrap-result-err.mts +43 -2
  273. package/src/core/predefined/operators/unwrap-result-ok.mts +43 -2
  274. package/src/core/types/id.mts +3 -1
  275. package/src/core/types/index.mts +1 -0
  276. package/src/core/types/observable-family.mts +13 -24
  277. package/src/core/types/observable-kind.mts +2 -0
  278. package/src/core/types/observable.mts +5 -4
  279. package/src/core/types/timer.mts +2 -0
  280. package/src/core/utils/id-maker.mts +4 -4
  281. package/src/core/utils/utils.mts +1 -0
  282. package/src/utils/collect-to-array.mts +17 -0
  283. package/src/utils/create-boolean-state.mts +68 -0
  284. package/src/utils/create-event-emitter.mts +4 -4
  285. package/src/utils/create-reducer.mts +12 -8
  286. package/src/utils/create-state.mts +10 -75
  287. package/src/utils/index.mts +2 -0
  288. package/dist/core/create/from-array.d.mts +0 -39
  289. package/dist/core/create/from-array.d.mts.map +0 -1
  290. package/dist/core/create/from-array.mjs +0 -65
  291. package/dist/core/create/from-array.mjs.map +0 -1
  292. package/dist/core/create/interval.d.mts.map +0 -1
  293. package/dist/core/create/interval.mjs.map +0 -1
  294. package/dist/core/create/of.d.mts +0 -39
  295. package/dist/core/create/of.d.mts.map +0 -1
  296. package/dist/core/create/of.mjs +0 -63
  297. package/dist/core/create/of.mjs.map +0 -1
  298. package/dist/core/operators/audit-time.d.mts +0 -62
  299. package/dist/core/operators/audit-time.d.mts.map +0 -1
  300. package/dist/core/operators/audit-time.mjs +0 -109
  301. package/dist/core/operators/audit-time.mjs.map +0 -1
  302. package/dist/core/operators/debounce-time.d.mts +0 -51
  303. package/dist/core/operators/debounce-time.d.mts.map +0 -1
  304. package/dist/core/operators/debounce-time.mjs +0 -93
  305. package/dist/core/operators/debounce-time.mjs.map +0 -1
  306. package/dist/core/operators/map-with-index.d.mts.map +0 -1
  307. package/dist/core/operators/map-with-index.mjs.map +0 -1
  308. package/dist/core/operators/throttle-time.d.mts +0 -62
  309. package/dist/core/operators/throttle-time.d.mts.map +0 -1
  310. package/dist/core/operators/throttle-time.mjs +0 -107
  311. package/dist/core/operators/throttle-time.mjs.map +0 -1
  312. package/dist/core/predefined/operators/map.d.mts +0 -3
  313. package/dist/core/predefined/operators/map.d.mts.map +0 -1
  314. package/dist/core/predefined/operators/map.mjs +0 -8
  315. package/dist/core/predefined/operators/map.mjs.map +0 -1
  316. package/dist/globals.d.mts +0 -4
  317. package/src/core/create/from-array.mts +0 -76
  318. package/src/core/create/of.mts +0 -73
  319. package/src/core/operators/audit-time.mts +0 -136
  320. package/src/core/operators/debounce-time.mts +0 -116
  321. package/src/core/predefined/operators/map.mts +0 -5
  322. package/src/globals.d.mts +0 -4
  323. /package/assets/{synstate-icon.png → old/synstate-icon.png} +0 -0
@@ -25,39 +25,35 @@ import {
25
25
  *
26
26
  * const count$ = source<number>();
27
27
  *
28
- * const mut_history: number[] = [];
28
+ * const valueHistory: number[] = [];
29
29
  *
30
30
  * count$.subscribe((value) => {
31
- * mut_history.push(value);
31
+ * valueHistory.push(value);
32
32
  * });
33
33
  *
34
34
  * count$.next(1); // logs: 1
35
35
  *
36
- * assert.deepStrictEqual(mut_history, [1]);
36
+ * assert.deepStrictEqual(valueHistory, [1]);
37
37
  *
38
38
  * count$.next(2); // logs: 2
39
39
  *
40
- * assert.deepStrictEqual(mut_history, [1, 2]);
40
+ * assert.deepStrictEqual(valueHistory, [1, 2]);
41
41
  *
42
42
  * count$.next(3); // logs: 3
43
43
  *
44
- * assert.deepStrictEqual(mut_history, [1, 2, 3]);
44
+ * assert.deepStrictEqual(valueHistory, [1, 2, 3]);
45
45
  * ```
46
46
  */
47
- export function source<A>(initialValue: A): InitializedSourceObservable<A>;
47
+ export function source<const A>(
48
+ initialValue: A,
49
+ ): InitializedSourceObservable<A>;
48
50
 
49
- export function source<A>(): SourceObservable<A>;
51
+ export function source<const A>(): SourceObservable<A>;
50
52
 
51
- export function source<A>(...args: readonly A[]): SourceObservable<A> {
53
+ export function source<const A>(...args: readonly A[]): SourceObservable<A> {
52
54
  return new SourceObservableClass<A>(...args);
53
55
  }
54
56
 
55
- /**
56
- * Alias for `source`. Creates a new Observable source.
57
- * @see source
58
- */
59
- export const subject = source;
60
-
61
57
  class SourceObservableClass<A>
62
58
  extends RootObservableClass<A>
63
59
  implements SourceObservable<A>
@@ -1,6 +1,6 @@
1
1
  import { Optional } from 'ts-data-forge';
2
2
  import { RootObservableClass } from '../class/index.mjs';
3
- import { type TimerObservable } from '../types/index.mjs';
3
+ import { type TimerId, type TimerObservable } from '../types/index.mjs';
4
4
 
5
5
  /**
6
6
  * Creates an observable that emits 0 after a specified delay and then completes.
@@ -22,12 +22,12 @@ import { type TimerObservable } from '../types/index.mjs';
22
22
  *
23
23
  * const delayed$ = timer(100);
24
24
  *
25
- * const mut_history: number[] = [];
25
+ * const valueHistory: number[] = [];
26
26
  *
27
27
  * await new Promise<void>((resolve) => {
28
28
  * delayed$.subscribe(
29
29
  * () => {
30
- * mut_history.push(1);
30
+ * valueHistory.push(1);
31
31
  * },
32
32
  * () => {
33
33
  * resolve();
@@ -35,13 +35,16 @@ import { type TimerObservable } from '../types/index.mjs';
35
35
  * );
36
36
  * });
37
37
  *
38
- * assert.deepStrictEqual(mut_history, [1]);
38
+ * assert.deepStrictEqual(valueHistory, [1]);
39
39
  * ```
40
40
  */
41
41
  export const timer = (
42
42
  milliSeconds: number,
43
- startManually: boolean = false,
44
- ): TimerObservable => new TimerObservableClass(milliSeconds, startManually);
43
+ options?: Readonly<{
44
+ startManually?: boolean;
45
+ }>,
46
+ ): TimerObservable =>
47
+ new TimerObservableClass(milliSeconds, options?.startManually ?? false);
45
48
 
46
49
  class TimerObservableClass
47
50
  extends RootObservableClass<0>
@@ -65,11 +68,11 @@ class TimerObservableClass
65
68
  }
66
69
  }
67
70
 
68
- start(): this {
71
+ start(): void {
69
72
  if (this.#mut_isStarted) {
70
73
  console.warn('cannot start twice');
71
74
 
72
- return this;
75
+ return;
73
76
  }
74
77
 
75
78
  this.#mut_isStarted = true;
@@ -77,7 +80,7 @@ class TimerObservableClass
77
80
  if (this.isCompleted) {
78
81
  console.warn('cannot restart stopped TimerObservable');
79
82
 
80
- return this;
83
+ return;
81
84
  }
82
85
 
83
86
  this.#mut_timerId = setTimeout(() => {
@@ -85,8 +88,6 @@ class TimerObservableClass
85
88
 
86
89
  this.complete();
87
90
  }, this.#milliSeconds);
88
-
89
- return this;
90
91
  }
91
92
 
92
93
  #resetTimer(): void {
@@ -4,4 +4,3 @@ export * from './create/index.mjs';
4
4
  export * from './operators/index.mjs';
5
5
  export * from './predefined/index.mjs';
6
6
  export * from './types/index.mjs';
7
- export * from './utils/index.mjs';
@@ -0,0 +1,172 @@
1
+ import { Optional } from 'ts-data-forge';
2
+ import { AsyncChildObservableClass } from '../class/index.mjs';
3
+ import {
4
+ type AuditOperatorObservable,
5
+ type KeepInitialValueOperator,
6
+ type Observable,
7
+ type TimerId,
8
+ type UpdateToken,
9
+ } from '../types/index.mjs';
10
+
11
+ /**
12
+ * Ignores source values for duration milliseconds, then emits the most recent value from the source Observable, then repeats this process.
13
+ *
14
+ * Unlike `throttle` which emits the first value, `audit` emits the last value.
15
+ *
16
+ * @template A - The type of values from the source
17
+ * @param milliSeconds - The audit time window in milliseconds
18
+ * @returns An operator that audits emissions from the observable
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * // Timeline (250ms audit):
23
+ * //
24
+ * // 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
25
+ * //
26
+ * // input$ 0 2 3 9 10 11 12 13 14
27
+ * // |- 250ms -> |- 250ms -> |- 250ms -> |- 250ms ->
28
+ * // audited$ 2 3 11 14 (emitted at end of window)
29
+ * //
30
+ * // Explanation:
31
+ * // - audit emits the LAST value received during each time window
32
+ * // - Unlike throttle (which emits the FIRST value), audit emits the LAST
33
+ * // - Useful when you want the most recent value after a burst of events
34
+ *
35
+ * const input$ = source<number>();
36
+ *
37
+ * const audited$ = input$.pipe(audit(250));
38
+ *
39
+ * const valueHistory: number[] = [];
40
+ *
41
+ * audited$.subscribe((value) => {
42
+ * valueHistory.push(value);
43
+ * });
44
+ *
45
+ * const sleep = (ms: number): Promise<void> =>
46
+ * new Promise((resolve) => {
47
+ * setTimeout(resolve, ms);
48
+ * });
49
+ *
50
+ * input$.next(0);
51
+ *
52
+ * await sleep(200);
53
+ *
54
+ * input$.next(2);
55
+ *
56
+ * assert.deepStrictEqual(valueHistory, []);
57
+ *
58
+ * await sleep(100);
59
+ *
60
+ * assert.deepStrictEqual(valueHistory, [2]);
61
+ *
62
+ * input$.next(3);
63
+ *
64
+ * await sleep(300);
65
+ *
66
+ * assert.deepStrictEqual(valueHistory, [2, 3]);
67
+ *
68
+ * await sleep(300);
69
+ *
70
+ * input$.next(9);
71
+ *
72
+ * await sleep(100);
73
+ *
74
+ * input$.next(10);
75
+ *
76
+ * await sleep(100);
77
+ *
78
+ * input$.next(11);
79
+ *
80
+ * assert.deepStrictEqual(valueHistory, [2, 3]);
81
+ *
82
+ * await sleep(100);
83
+ *
84
+ * assert.deepStrictEqual(valueHistory, [2, 3, 11]);
85
+ *
86
+ * input$.next(12);
87
+ *
88
+ * await sleep(100);
89
+ *
90
+ * input$.next(13);
91
+ *
92
+ * assert.deepStrictEqual(valueHistory, [2, 3, 11]);
93
+ *
94
+ * await sleep(100);
95
+ *
96
+ * input$.next(14);
97
+ *
98
+ * assert.deepStrictEqual(valueHistory, [2, 3, 11]);
99
+ *
100
+ * await sleep(100);
101
+ *
102
+ * assert.deepStrictEqual(valueHistory, [2, 3, 11, 14]);
103
+ * ```
104
+ */
105
+ export const audit = <A,>(
106
+ milliSeconds: number,
107
+ ): KeepInitialValueOperator<A, A> =>
108
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
109
+ ((parentObservable) =>
110
+ new AuditObservableClass(
111
+ parentObservable,
112
+ milliSeconds,
113
+ )) as KeepInitialValueOperator<A, A>;
114
+
115
+ class AuditObservableClass<A>
116
+ extends AsyncChildObservableClass<A, readonly [A]>
117
+ implements AuditOperatorObservable<A>
118
+ {
119
+ readonly #milliSeconds: number;
120
+ #mut_timerId: TimerId | undefined;
121
+ #mut_isSkipping: boolean;
122
+
123
+ constructor(parentObservable: Observable<A>, milliSeconds: number) {
124
+ super({
125
+ parents: [parentObservable],
126
+ initialValue: parentObservable.getSnapshot(),
127
+ });
128
+
129
+ this.#mut_isSkipping = false;
130
+
131
+ this.#mut_timerId = undefined;
132
+
133
+ this.#milliSeconds = milliSeconds;
134
+ }
135
+
136
+ override tryUpdate(updateToken: UpdateToken): void {
137
+ const par = this.parents[0];
138
+
139
+ if (
140
+ par.updateToken !== updateToken ||
141
+ Optional.isNone(par.getSnapshot()) ||
142
+ this.#mut_isSkipping
143
+ ) {
144
+ return; // skip update
145
+ }
146
+
147
+ // set timer
148
+ this.#mut_isSkipping = true;
149
+
150
+ this.#mut_timerId = setTimeout(() => {
151
+ const sn = par.getSnapshot();
152
+
153
+ if (Optional.isNone(sn)) return;
154
+
155
+ this.startUpdate(sn.value);
156
+
157
+ this.#mut_isSkipping = false;
158
+ }, this.#milliSeconds);
159
+ }
160
+
161
+ #resetTimer(): void {
162
+ if (this.#mut_timerId !== undefined) {
163
+ clearTimeout(this.#mut_timerId);
164
+ }
165
+ }
166
+
167
+ override complete(): void {
168
+ this.#resetTimer();
169
+
170
+ super.complete();
171
+ }
172
+ }
@@ -0,0 +1,154 @@
1
+ import { Optional } from 'ts-data-forge';
2
+ import { AsyncChildObservableClass } from '../class/index.mjs';
3
+ import {
4
+ type DebounceOperatorObservable,
5
+ type KeepInitialValueOperator,
6
+ type Observable,
7
+ type TimerId,
8
+ type UpdateToken,
9
+ } from '../types/index.mjs';
10
+
11
+ /**
12
+ * Delays emissions from the source observable until a specified time has passed without another emission.
13
+ * Useful for handling user input events like typing or scrolling.
14
+ *
15
+ * @template A - The type of values from the source
16
+ * @param milliSeconds - The debounce duration in milliseconds
17
+ * @returns An operator that debounces the observable
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * // Timeline (250ms debounce):
22
+ * //
23
+ * // 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
24
+ * //
25
+ * // input$ 0 2 3 9 10 11 12 13 14
26
+ * // |- 250ms -> |- 250ms ->
27
+ * // debounced$ 3 14 (emitted after 250ms silence)
28
+ * //
29
+ * // Explanation:
30
+ * // - debounce emits the latest value AFTER a quiet period with no new emissions
31
+ * // - Unlike audit (which uses a fixed window), debounce resets the timer on every emission
32
+ * // - Useful for search-as-you-type and form validation
33
+ *
34
+ * const input$ = source<number>();
35
+ *
36
+ * const debounced$ = input$.pipe(debounce(250));
37
+ *
38
+ * const valueHistory: number[] = [];
39
+ *
40
+ * debounced$.subscribe((value) => {
41
+ * valueHistory.push(value);
42
+ * });
43
+ *
44
+ * const sleep = (ms: number): Promise<void> =>
45
+ * new Promise((resolve) => {
46
+ * setTimeout(resolve, ms);
47
+ * });
48
+ *
49
+ * input$.next(0);
50
+ *
51
+ * await sleep(200);
52
+ *
53
+ * input$.next(2);
54
+ *
55
+ * await sleep(100);
56
+ *
57
+ * input$.next(3);
58
+ *
59
+ * assert.deepStrictEqual(valueHistory, []);
60
+ *
61
+ * await sleep(300);
62
+ *
63
+ * assert.deepStrictEqual(valueHistory, [3]);
64
+ *
65
+ * await sleep(300);
66
+ *
67
+ * input$.next(9);
68
+ *
69
+ * await sleep(100);
70
+ *
71
+ * input$.next(10);
72
+ *
73
+ * await sleep(100);
74
+ *
75
+ * input$.next(11);
76
+ *
77
+ * await sleep(100);
78
+ *
79
+ * input$.next(12);
80
+ *
81
+ * await sleep(100);
82
+ *
83
+ * input$.next(13);
84
+ *
85
+ * await sleep(100);
86
+ *
87
+ * input$.next(14);
88
+ *
89
+ * assert.deepStrictEqual(valueHistory, [3]);
90
+ *
91
+ * await sleep(300);
92
+ *
93
+ * assert.deepStrictEqual(valueHistory, [3, 14]);
94
+ * ```
95
+ */
96
+ export const debounce = <A,>(
97
+ milliSeconds: number,
98
+ ): KeepInitialValueOperator<A, A> =>
99
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
100
+ ((parentObservable) =>
101
+ new DebounceObservableClass(
102
+ parentObservable,
103
+ milliSeconds,
104
+ )) as KeepInitialValueOperator<A, A>;
105
+
106
+ class DebounceObservableClass<A>
107
+ extends AsyncChildObservableClass<A, readonly [A]>
108
+ implements DebounceOperatorObservable<A>
109
+ {
110
+ readonly #milliSeconds: number;
111
+ #mut_timerId: TimerId | undefined;
112
+
113
+ constructor(parentObservable: Observable<A>, milliSeconds: number) {
114
+ super({
115
+ parents: [parentObservable],
116
+ initialValue: parentObservable.getSnapshot(),
117
+ });
118
+
119
+ this.#mut_timerId = undefined;
120
+
121
+ this.#milliSeconds = milliSeconds;
122
+ }
123
+
124
+ override tryUpdate(updateToken: UpdateToken): void {
125
+ const par = this.parents[0];
126
+
127
+ const sn = par.getSnapshot();
128
+
129
+ if (par.updateToken !== updateToken || Optional.isNone(sn)) {
130
+ return; // skip update
131
+ }
132
+
133
+ this.#resetTimer();
134
+
135
+ // set timer
136
+ this.#mut_timerId = setTimeout(() => {
137
+ if (Optional.isNone(sn)) return;
138
+
139
+ this.startUpdate(sn.value);
140
+ }, this.#milliSeconds);
141
+ }
142
+
143
+ #resetTimer(): void {
144
+ if (this.#mut_timerId !== undefined) {
145
+ clearTimeout(this.#mut_timerId);
146
+ }
147
+ }
148
+
149
+ override complete(): void {
150
+ this.#resetTimer();
151
+
152
+ super.complete();
153
+ }
154
+ }
@@ -12,7 +12,7 @@ import {
12
12
  type FilterOperatorObservable,
13
13
  type InitializedObservable,
14
14
  type Observable,
15
- type UpdaterSymbol,
15
+ type UpdateToken,
16
16
  } from '../types/index.mjs';
17
17
  import { withInitialValue } from './with-initial-value.mjs';
18
18
 
@@ -40,29 +40,29 @@ import { withInitialValue } from './with-initial-value.mjs';
40
40
  *
41
41
  * const even$ = num$.pipe(filter((x) => x % 2 === 0));
42
42
  *
43
- * const mut_history: number[] = [];
43
+ * const valueHistory: number[] = [];
44
44
  *
45
45
  * even$.subscribe((x) => {
46
- * mut_history.push(x);
46
+ * valueHistory.push(x);
47
47
  * });
48
48
  *
49
49
  * num$.next(1); // nothing logged
50
50
  *
51
51
  * num$.next(2); // logs: 2
52
52
  *
53
- * assert.deepStrictEqual(mut_history, [2]);
53
+ * assert.deepStrictEqual(valueHistory, [2]);
54
54
  *
55
55
  * num$.next(3); // nothing logged
56
56
  *
57
57
  * num$.next(4); // logs: 4
58
58
  *
59
- * assert.deepStrictEqual(mut_history, [2, 4]);
59
+ * assert.deepStrictEqual(valueHistory, [2, 4]);
60
60
  *
61
61
  * num$.next(5);
62
62
  *
63
63
  * num$.next(6);
64
64
  *
65
- * assert.deepStrictEqual(mut_history, [2, 4, 6]);
65
+ * assert.deepStrictEqual(valueHistory, [2, 4, 6]);
66
66
  * ```
67
67
  */
68
68
  export function filter<A, B extends A>(
@@ -107,12 +107,12 @@ class FilterObservableClass<A>
107
107
  this.#predicate = predicate;
108
108
  }
109
109
 
110
- override tryUpdate(updaterSymbol: UpdaterSymbol): void {
110
+ override tryUpdate(updateToken: UpdateToken): void {
111
111
  const par = this.parents[0];
112
112
 
113
113
  const sn = par.getSnapshot();
114
114
 
115
- if (par.updaterSymbol !== updaterSymbol || Optional.isNone(sn)) {
115
+ if (par.updateToken !== updateToken || Optional.isNone(sn)) {
116
116
  return; // skip update
117
117
  }
118
118
 
@@ -120,7 +120,7 @@ class FilterObservableClass<A>
120
120
  this.#mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, this.#mut_index);
121
121
 
122
122
  if (this.#predicate(sn.value, this.#mut_index)) {
123
- this.setNext(sn.value, updaterSymbol);
123
+ this.setNext(sn.value, updateToken);
124
124
  }
125
125
  }
126
126
  }
@@ -1,7 +1,7 @@
1
- export * from './audit-time.mjs';
2
- export * from './debounce-time.mjs';
1
+ export * from './audit.mjs';
2
+ export * from './debounce.mjs';
3
3
  export * from './filter.mjs';
4
- export * from './map-with-index.mjs';
4
+ export * from './map.mjs';
5
5
  export * from './merge-map.mjs';
6
6
  export * from './pairwise.mjs';
7
7
  export * from './scan.mjs';
@@ -11,7 +11,7 @@ export * from './skip-while.mjs';
11
11
  export * from './switch-map.mjs';
12
12
  export * from './take-until.mjs';
13
13
  export * from './take-while.mjs';
14
- export * from './throttle-time.mjs';
14
+ export * from './throttle.mjs';
15
15
  export * from './with-buffered-from.mjs';
16
16
  export * from './with-current-value-from.mjs';
17
17
  export * from './with-initial-value.mjs';
@@ -4,9 +4,9 @@ import { source } from '../create/index.mjs';
4
4
  import {
5
5
  type InitializedObservable,
6
6
  type KeepInitialValueOperator,
7
- type MapWithIndexOperatorObservable,
7
+ type MapOperatorObservable,
8
8
  type Observable,
9
- type UpdaterSymbol,
9
+ type UpdateToken,
10
10
  } from '../types/index.mjs';
11
11
  import { withInitialValue } from './with-initial-value.mjs';
12
12
 
@@ -22,8 +22,8 @@ import { withInitialValue } from './with-initial-value.mjs';
22
22
  * ```ts
23
23
  * // Timeline:
24
24
  * //
25
- * // num$ "a" "b" "c"
26
- * // indexed$ "0: a" "1: b" "2: c"
25
+ * // num$ "A" "B" "C"
26
+ * // indexed$ "0: A" "1: B" "2: C"
27
27
  * //
28
28
  * // Explanation:
29
29
  * // - mapWithIndex transforms each value along with its index
@@ -31,38 +31,38 @@ import { withInitialValue } from './with-initial-value.mjs';
31
31
  *
32
32
  * const num$ = source<string>();
33
33
  *
34
- * const indexed$ = num$.pipe(mapWithIndex((x, i) => `${i}: ${x}`));
34
+ * const indexed$ = num$.pipe(map((x, i) => `${i}: ${x}`));
35
35
  *
36
- * const mut_history: string[] = [];
36
+ * const valueHistory: string[] = [];
37
37
  *
38
38
  * indexed$.subscribe((s) => {
39
- * mut_history.push(s);
39
+ * valueHistory.push(s);
40
40
  * });
41
41
  *
42
- * num$.next('a'); // 0: a
42
+ * num$.next('A'); // 0: A
43
43
  *
44
- * num$.next('b'); // 1: b
44
+ * num$.next('B'); // 1: B
45
45
  *
46
- * num$.next('c'); // 2: c
46
+ * num$.next('C'); // 2: C
47
47
  *
48
- * assert.deepStrictEqual(mut_history, ['0: a', '1: b', '2: c']);
48
+ * assert.deepStrictEqual(valueHistory, ['0: A', '1: B', '2: C']);
49
49
  * ```
50
50
  */
51
- export const mapWithIndex = <A, B>(
51
+ export const map = <A, B>(
52
52
  mapFn: (x: A, index: SafeUint | -1) => B,
53
53
  ): KeepInitialValueOperator<A, B> =>
54
54
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
55
55
  ((parentObservable) =>
56
- new MapWithIndexObservableClass(
56
+ new MapObservableClass(
57
57
  parentObservable,
58
58
  mapFn,
59
59
  )) as KeepInitialValueOperator<A, B>;
60
60
 
61
61
  /* implementation */
62
62
 
63
- class MapWithIndexObservableClass<A, B>
63
+ class MapObservableClass<A, B>
64
64
  extends SyncChildObservableClass<B, readonly [A]>
65
- implements MapWithIndexOperatorObservable<A, B>
65
+ implements MapOperatorObservable<A, B>
66
66
  {
67
67
  readonly #mapFn: (x: A, index: SafeUint | -1) => B;
68
68
  #mut_index: SafeUint | -1;
@@ -83,19 +83,19 @@ class MapWithIndexObservableClass<A, B>
83
83
  this.#mapFn = mapFn;
84
84
  }
85
85
 
86
- override tryUpdate(updaterSymbol: UpdaterSymbol): void {
86
+ override tryUpdate(updateToken: UpdateToken): void {
87
87
  const par = this.parents[0];
88
88
 
89
89
  const sn = par.getSnapshot();
90
90
 
91
- if (par.updaterSymbol !== updaterSymbol || Optional.isNone(sn)) {
91
+ if (par.updateToken !== updateToken || Optional.isNone(sn)) {
92
92
  return; // skip update
93
93
  }
94
94
 
95
95
  this.#mut_index =
96
96
  this.#mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, this.#mut_index);
97
97
 
98
- this.setNext(this.#mapFn(sn.value, this.#mut_index), updaterSymbol);
98
+ this.setNext(this.#mapFn(sn.value, this.#mut_index), updateToken);
99
99
  }
100
100
  }
101
101
 
@@ -107,7 +107,7 @@ if (import.meta.vitest !== undefined) {
107
107
  {
108
108
  const s: Observable<number> = source<number>();
109
109
 
110
- const _d1 = s.pipe(mapWithIndex((x, i) => x + i));
110
+ const _d1 = s.pipe(map((x, i) => x + i));
111
111
 
112
112
  expectType<typeof _d1, Observable<number>>('=');
113
113
  }
@@ -117,7 +117,7 @@ if (import.meta.vitest !== undefined) {
117
117
 
118
118
  const m: InitializedObservable<number> = s.pipe(withInitialValue(0));
119
119
 
120
- const _d = m.pipe(mapWithIndex((x, i) => x + i));
120
+ const _d = m.pipe(map((x, i) => x + i));
121
121
 
122
122
  expectType<typeof _d, InitializedObservable<number>>('=');
123
123
  }