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
@@ -4,7 +4,7 @@ import {
4
4
  type KeepInitialValueOperator,
5
5
  type Observable,
6
6
  type TakeUntilOperatorObservable,
7
- type UpdaterSymbol,
7
+ type UpdateToken,
8
8
  } from '../types/index.mjs';
9
9
 
10
10
  /**
@@ -34,25 +34,25 @@ import {
34
34
  *
35
35
  * const limited$ = num$.pipe(takeUntil(stopNotifier));
36
36
  *
37
- * const mut_history: number[] = [];
37
+ * const valueHistory: number[] = [];
38
38
  *
39
39
  * limited$.subscribe((x) => {
40
- * mut_history.push(x);
40
+ * valueHistory.push(x);
41
41
  * });
42
42
  *
43
43
  * num$.next(1); // logs: 1
44
44
  *
45
- * assert.deepStrictEqual(mut_history, [1]);
45
+ * assert.deepStrictEqual(valueHistory, [1]);
46
46
  *
47
47
  * num$.next(2); // logs: 2
48
48
  *
49
- * assert.deepStrictEqual(mut_history, [1, 2]);
49
+ * assert.deepStrictEqual(valueHistory, [1, 2]);
50
50
  *
51
51
  * stop_();
52
52
  *
53
53
  * num$.next(3); // nothing logged (completed)
54
54
  *
55
- * assert.deepStrictEqual(mut_history, [1, 2]);
55
+ * assert.deepStrictEqual(valueHistory, [1, 2]);
56
56
  * ```
57
57
  */
58
58
  export const takeUntil = <A,>(
@@ -85,15 +85,15 @@ class TakeUntilObservableClass<A>
85
85
  );
86
86
  }
87
87
 
88
- override tryUpdate(updaterSymbol: UpdaterSymbol): void {
88
+ override tryUpdate(updateToken: UpdateToken): void {
89
89
  const par = this.parents[0];
90
90
 
91
91
  const sn = par.getSnapshot();
92
92
 
93
- if (par.updaterSymbol !== updaterSymbol || Optional.isNone(sn)) {
93
+ if (par.updateToken !== updateToken || Optional.isNone(sn)) {
94
94
  return; // skip update
95
95
  }
96
96
 
97
- this.setNext(sn.value, updaterSymbol);
97
+ this.setNext(sn.value, updateToken);
98
98
  }
99
99
  }
@@ -12,7 +12,7 @@ import {
12
12
  type InitializedObservable,
13
13
  type Observable,
14
14
  type TakeWhileOperatorObservable,
15
- type UpdaterSymbol,
15
+ type UpdateToken,
16
16
  } from '../types/index.mjs';
17
17
  import { withInitialValue } from './with-initial-value.mjs';
18
18
 
@@ -28,7 +28,7 @@ import { withInitialValue } from './with-initial-value.mjs';
28
28
  * ```ts
29
29
  * // Timeline:
30
30
  * //
31
- * // num$ 1 2 3 4 5 6 (ignored)
31
+ * // num$ 1 2 3 4 5 6 1 2 (ignored)
32
32
  * // taken$ 1 2 3 4 | (completes)
33
33
  * //
34
34
  * // Explanation:
@@ -40,27 +40,35 @@ import { withInitialValue } from './with-initial-value.mjs';
40
40
  *
41
41
  * const taken$ = num$.pipe(takeWhile((x) => x < 5));
42
42
  *
43
- * const mut_history: number[] = [];
43
+ * const valueHistory: number[] = [];
44
44
  *
45
45
  * taken$.subscribe((x) => {
46
- * mut_history.push(x);
46
+ * valueHistory.push(x);
47
47
  * });
48
48
  *
49
49
  * num$.next(1); // logs: 1
50
50
  *
51
- * assert.deepStrictEqual(mut_history, [1]);
51
+ * assert.deepStrictEqual(valueHistory, [1]);
52
52
  *
53
53
  * num$.next(2); // logs: 2
54
54
  *
55
- * assert.deepStrictEqual(mut_history, [1, 2]);
55
+ * num$.next(3); // logs: 3
56
+ *
57
+ * num$.next(4); // logs: 4
58
+ *
59
+ * assert.deepStrictEqual(valueHistory, [1, 2, 3, 4]);
56
60
  *
57
61
  * num$.next(5); // nothing logged (completes)
58
62
  *
59
- * assert.deepStrictEqual(mut_history, [1, 2]);
63
+ * assert.deepStrictEqual(valueHistory, [1, 2, 3, 4]);
60
64
  *
61
65
  * num$.next(6); // nothing logged (already completed)
62
66
  *
63
- * assert.deepStrictEqual(mut_history, [1, 2]);
67
+ * assert.deepStrictEqual(valueHistory, [1, 2, 3, 4]);
68
+ *
69
+ * num$.next(1); // logs: 1
70
+ *
71
+ * assert.deepStrictEqual(valueHistory, [1, 2, 3, 4]);
64
72
  * ```
65
73
  */
66
74
  export const takeWhile =
@@ -99,12 +107,12 @@ class TakeWhileObservableClass<A>
99
107
  this.#predicate = predicate;
100
108
  }
101
109
 
102
- override tryUpdate(updaterSymbol: UpdaterSymbol): void {
110
+ override tryUpdate(updateToken: UpdateToken): void {
103
111
  const par = this.parents[0];
104
112
 
105
113
  const sn = par.getSnapshot();
106
114
 
107
- if (par.updaterSymbol !== updaterSymbol || Optional.isNone(sn)) {
115
+ if (par.updateToken !== updateToken || Optional.isNone(sn)) {
108
116
  return; // skip update
109
117
  }
110
118
 
@@ -112,7 +120,7 @@ class TakeWhileObservableClass<A>
112
120
  this.#mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, this.#mut_index);
113
121
 
114
122
  if (this.#predicate(sn.value, this.#mut_index)) {
115
- this.setNext(sn.value, updaterSymbol);
123
+ this.setNext(sn.value, updateToken);
116
124
  } else {
117
125
  this.complete();
118
126
  }
@@ -3,8 +3,9 @@ import { SyncChildObservableClass } from '../class/index.mjs';
3
3
  import {
4
4
  type KeepInitialValueOperator,
5
5
  type Observable,
6
- type ThrottleTimeOperatorObservable,
7
- type UpdaterSymbol,
6
+ type ThrottleOperatorObservable,
7
+ type TimerId,
8
+ type UpdateToken,
8
9
  } from '../types/index.mjs';
9
10
 
10
11
  /**
@@ -17,68 +18,87 @@ import {
17
18
  *
18
19
  * @example
19
20
  * ```ts
20
- * // Timeline (1000ms throttle):
21
+ * // Timeline (250ms throttle):
21
22
  * //
22
- * // Time(ms) 0 100 200 300 ... 1000 1100 1200 ... 2000 2100
23
- * // scroll$ e1 e2 e3 e4 e5 e6 e7 e8 e9
24
- * // throttled$ e1 e5 e8
25
- * // |-------1000ms------> |------1000ms------> |------1000ms------>
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 -> |- 250ms -> |- 250ms ->
27
+ * // throttled$ 0 3 9 12 (emitted at start of window)
26
28
  * //
27
29
  * // Explanation:
28
- * // - throttleTime emits the first value immediately, then ignores subsequent values
29
- * // for the specified duration (1000ms)
30
- * // - At 0ms: e1 is emitted immediately
31
- * // - At 100-300ms: e2, e3, e4 are ignored (within 1000ms window)
32
- * // - At 1000ms: e5 is emitted (1000ms has passed since e1)
33
- * // - At 1100-1200ms: e6, e7 are ignored
34
- * // - At 2000ms: e8 is emitted (1000ms has passed since e5)
30
+ * // - throttle emits the FIRST value received, then ignores subsequent values
31
+ * // for the specified duration (250ms)
32
+ * // - Unlike audit (which emits the LAST value), throttle emits the FIRST
33
+ * // - Useful for rate-limiting scroll/resize events
35
34
  *
36
- * const scroll$ = source<number>();
35
+ * const input$ = source<number>();
37
36
  *
38
- * const throttled$ = scroll$.pipe(throttleTime(200));
37
+ * const throttled$ = input$.pipe(throttle(250));
39
38
  *
40
- * const mut_history: number[] = [];
39
+ * const valueHistory: number[] = [];
41
40
  *
42
41
  * throttled$.subscribe((value) => {
43
- * mut_history.push(value);
42
+ * valueHistory.push(value);
44
43
  * });
45
44
  *
46
- * scroll$.next(1);
45
+ * const sleep = (ms: number): Promise<void> =>
46
+ * new Promise((resolve) => {
47
+ * setTimeout(resolve, ms);
48
+ * });
47
49
  *
48
- * assert.deepStrictEqual(mut_history, [1]);
50
+ * input$.next(0);
49
51
  *
50
- * await new Promise((resolve) => {
51
- * setTimeout(resolve, 50);
52
- * });
52
+ * assert.deepStrictEqual(valueHistory, [0]);
53
53
  *
54
- * scroll$.next(2);
54
+ * await sleep(200);
55
55
  *
56
- * scroll$.next(3);
56
+ * input$.next(2);
57
57
  *
58
- * assert.deepStrictEqual(mut_history, [1]);
58
+ * assert.deepStrictEqual(valueHistory, [0]);
59
59
  *
60
- * await new Promise((resolve) => {
61
- * setTimeout(resolve, 200);
62
- * });
60
+ * await sleep(100);
61
+ *
62
+ * input$.next(3);
63
+ *
64
+ * assert.deepStrictEqual(valueHistory, [0, 3]);
65
+ *
66
+ * await sleep(300);
67
+ *
68
+ * input$.next(9);
69
+ *
70
+ * assert.deepStrictEqual(valueHistory, [0, 3, 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, [0, 3, 9]);
81
+ *
82
+ * await sleep(100);
63
83
  *
64
- * scroll$.next(4);
84
+ * input$.next(12);
65
85
  *
66
- * assert.deepStrictEqual(mut_history, [1, 4]);
86
+ * assert.deepStrictEqual(valueHistory, [0, 3, 9, 12]);
67
87
  * ```
68
88
  */
69
- export const throttleTime = <A,>(
89
+ export const throttle = <A,>(
70
90
  milliSeconds: number,
71
91
  ): KeepInitialValueOperator<A, A> =>
72
92
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
73
93
  ((parentObservable) =>
74
- new ThrottleTimeObservableClass(
94
+ new ThrottleObservableClass(
75
95
  parentObservable,
76
96
  milliSeconds,
77
97
  )) as KeepInitialValueOperator<A, A>;
78
98
 
79
- class ThrottleTimeObservableClass<A>
99
+ class ThrottleObservableClass<A>
80
100
  extends SyncChildObservableClass<A, readonly [A]>
81
- implements ThrottleTimeOperatorObservable<A>
101
+ implements ThrottleOperatorObservable<A>
82
102
  {
83
103
  readonly #milliSeconds: number;
84
104
  #mut_timerId: TimerId | undefined;
@@ -97,20 +117,20 @@ class ThrottleTimeObservableClass<A>
97
117
  this.#milliSeconds = milliSeconds;
98
118
  }
99
119
 
100
- override tryUpdate(updaterSymbol: UpdaterSymbol): void {
120
+ override tryUpdate(updateToken: UpdateToken): void {
101
121
  const par = this.parents[0];
102
122
 
103
123
  const sn = par.getSnapshot();
104
124
 
105
125
  if (
106
- par.updaterSymbol !== updaterSymbol ||
126
+ par.updateToken !== updateToken ||
107
127
  Optional.isNone(sn) ||
108
128
  this.#mut_isSkipping
109
129
  ) {
110
130
  return; // skip update
111
131
  }
112
132
 
113
- this.setNext(sn.value, updaterSymbol);
133
+ this.setNext(sn.value, updateToken);
114
134
 
115
135
  this.#mut_isSkipping = true;
116
136
 
@@ -3,7 +3,7 @@ import { SyncChildObservableClass } from '../class/index.mjs';
3
3
  import {
4
4
  type KeepInitialValueOperator,
5
5
  type Observable,
6
- type UpdaterSymbol,
6
+ type UpdateToken,
7
7
  type WithBufferedFromOperatorObservable,
8
8
  } from '../types/index.mjs';
9
9
  import { maxDepth } from '../utils/index.mjs';
@@ -37,27 +37,27 @@ import { maxDepth } from '../utils/index.mjs';
37
37
  *
38
38
  * const result$ = trigger$.pipe(withBufferedFrom(data$));
39
39
  *
40
- * const mut_history: (readonly [number, readonly string[]])[] = [];
40
+ * const valueHistory: (readonly [number, readonly string[]])[] = [];
41
41
  *
42
42
  * result$.subscribe(([triggerValue, bufferedData]) => {
43
- * mut_history.push([triggerValue, bufferedData]);
43
+ * valueHistory.push([triggerValue, bufferedData]);
44
44
  * });
45
45
  *
46
- * data$.next('a');
46
+ * data$.next('A');
47
47
  *
48
- * data$.next('b');
48
+ * data$.next('B');
49
49
  *
50
50
  * trigger$.next(1);
51
51
  *
52
- * assert.deepStrictEqual(mut_history, [[1, ['a', 'b']]]);
52
+ * assert.deepStrictEqual(valueHistory, [[1, ['A', 'B']]]);
53
53
  *
54
- * data$.next('c');
54
+ * data$.next('C');
55
55
  *
56
56
  * trigger$.next(2);
57
57
  *
58
- * assert.deepStrictEqual(mut_history, [
59
- * [1, ['a', 'b']],
60
- * [2, ['c']],
58
+ * assert.deepStrictEqual(valueHistory, [
59
+ * [1, ['A', 'B']],
60
+ * [2, ['C']],
61
61
  * ]);
62
62
  * ```
63
63
  */
@@ -105,16 +105,16 @@ class WithBufferedFromObservableClass<A, B>
105
105
  });
106
106
  }
107
107
 
108
- override tryUpdate(updaterSymbol: UpdaterSymbol): void {
108
+ override tryUpdate(updateToken: UpdateToken): void {
109
109
  const par = this.parents[0];
110
110
 
111
111
  const sn = par.getSnapshot();
112
112
 
113
- if (par.updaterSymbol !== updaterSymbol || Optional.isNone(sn)) {
113
+ if (par.updateToken !== updateToken || Optional.isNone(sn)) {
114
114
  return; // skip update
115
115
  }
116
116
 
117
- this.setNext([sn.value, this.#mut_bufferedValues], updaterSymbol);
117
+ this.setNext([sn.value, this.#mut_bufferedValues], updateToken);
118
118
 
119
119
  this.#clearBuffer();
120
120
  }
@@ -3,7 +3,7 @@ import { SyncChildObservableClass } from '../class/index.mjs';
3
3
  import {
4
4
  type DropInitialValueOperator,
5
5
  type Observable,
6
- type UpdaterSymbol,
6
+ type UpdateToken,
7
7
  type WithCurrentValueFromOperatorObservable,
8
8
  } from '../types/index.mjs';
9
9
  import { maxDepth } from '../utils/index.mjs';
@@ -22,14 +22,15 @@ import { maxDepth } from '../utils/index.mjs';
22
22
  * // Timeline:
23
23
  * //
24
24
  * // name$ "Alice" "Bob" "Charlie"
25
- * // age$ 25 30 35 40
26
- * // result$ ["Alice",25] ["Bob",30] ["Bob",35] ["Charlie",40]
25
+ * // age$ 25 30
26
+ * // result$ (skip) ["Bob",25] ["Charlie",30]
27
27
  * //
28
28
  * // Explanation:
29
29
  * // - withCurrentValueFrom samples the current value from another observable
30
- * // - Emits a tuple [sourceValue, sampledValue] each time the source emits
30
+ * // - Emits a tuple [sourceValue, sampledValue] each time the SOURCE emits
31
+ * // - Does NOT emit when the sampled observable (age$) emits
31
32
  * // - Does not emit until both observables have emitted at least once
32
- * // - Similar to combine, but only emits when the source (not the sampled) emits
33
+ * // - "Alice" is skipped because age$ hasn't emitted yet
33
34
  *
34
35
  * const name$ = source<string>();
35
36
  *
@@ -37,27 +38,27 @@ import { maxDepth } from '../utils/index.mjs';
37
38
  *
38
39
  * const result$ = name$.pipe(withCurrentValueFrom(age$));
39
40
  *
40
- * const mut_history: (readonly [string, number])[] = [];
41
+ * const valueHistory: (readonly [string, number])[] = [];
41
42
  *
42
43
  * result$.subscribe(([name_, currentAge]) => {
43
- * mut_history.push([name_, currentAge]);
44
+ * valueHistory.push([name_, currentAge]);
44
45
  * });
45
46
  *
46
47
  * name$.next('Alice'); // nothing logged (age$ hasn't emitted)
47
48
  *
48
- * assert.deepStrictEqual(mut_history, []);
49
+ * assert.deepStrictEqual(valueHistory, []);
49
50
  *
50
51
  * age$.next(25);
51
52
  *
52
53
  * name$.next('Bob'); // logs: Bob is 25 years old
53
54
  *
54
- * assert.deepStrictEqual(mut_history, [['Bob', 25]]);
55
+ * assert.deepStrictEqual(valueHistory, [['Bob', 25]]);
55
56
  *
56
57
  * age$.next(30);
57
58
  *
58
59
  * name$.next('Charlie'); // logs: Charlie is 30 years old
59
60
  *
60
- * assert.deepStrictEqual(mut_history, [
61
+ * assert.deepStrictEqual(valueHistory, [
61
62
  * ['Bob', 25],
62
63
  * ['Charlie', 30],
63
64
  * ]);
@@ -99,12 +100,12 @@ class WithCurrentValueFromObservableClass<A, B>
99
100
  this.#observable = observable;
100
101
  }
101
102
 
102
- override tryUpdate(updaterSymbol: UpdaterSymbol): void {
103
+ override tryUpdate(updateToken: UpdateToken): void {
103
104
  const par = this.parents[0];
104
105
 
105
106
  const ps = par.getSnapshot();
106
107
 
107
- if (par.updaterSymbol !== updaterSymbol || Optional.isNone(ps)) {
108
+ if (par.updateToken !== updateToken || Optional.isNone(ps)) {
108
109
  return; // skip update
109
110
  }
110
111
 
@@ -112,6 +113,6 @@ class WithCurrentValueFromObservableClass<A, B>
112
113
 
113
114
  if (Optional.isNone(curr)) return; // skip update
114
115
 
115
- this.setNext([ps.value, curr.value], updaterSymbol);
116
+ this.setNext([ps.value, curr.value], updateToken);
116
117
  }
117
118
  }
@@ -4,7 +4,7 @@ import { source } from '../create/index.mjs';
4
4
  import {
5
5
  type InitializedObservable,
6
6
  type Observable,
7
- type UpdaterSymbol,
7
+ type UpdateToken,
8
8
  type WithInitialValueOperator,
9
9
  type WithInitialValueOperatorObservable,
10
10
  } from '../types/index.mjs';
@@ -37,21 +37,21 @@ import {
37
37
  *
38
38
  * const initialized$ = num$.pipe(withInitialValue(0));
39
39
  *
40
- * const mut_history: number[] = [];
40
+ * const valueHistory: number[] = [];
41
41
  *
42
42
  * initialized$.subscribe((x) => {
43
- * mut_history.push(x);
43
+ * valueHistory.push(x);
44
44
  * });
45
45
  *
46
- * assert.deepStrictEqual(mut_history, [0]);
46
+ * assert.deepStrictEqual(valueHistory, [0]);
47
47
  *
48
48
  * num$.next(1); // logs: 1
49
49
  *
50
- * assert.deepStrictEqual(mut_history, [0, 1]);
50
+ * assert.deepStrictEqual(valueHistory, [0, 1]);
51
51
  *
52
52
  * num$.next(2); // logs: 2
53
53
  *
54
- * assert.deepStrictEqual(mut_history, [0, 1, 2]);
54
+ * assert.deepStrictEqual(valueHistory, [0, 1, 2]);
55
55
  * ```
56
56
  */
57
57
  export const withInitialValue =
@@ -70,16 +70,16 @@ class WithInitialValueObservableClass<A, I>
70
70
  });
71
71
  }
72
72
 
73
- override tryUpdate(updaterSymbol: UpdaterSymbol): void {
73
+ override tryUpdate(updateToken: UpdateToken): void {
74
74
  const par = this.parents[0];
75
75
 
76
76
  const sn = par.getSnapshot();
77
77
 
78
- if (par.updaterSymbol !== updaterSymbol || Optional.isNone(sn)) {
78
+ if (par.updateToken !== updateToken || Optional.isNone(sn)) {
79
79
  return; // skip update
80
80
  }
81
81
 
82
- this.setNext(sn.value, updaterSymbol);
82
+ this.setNext(sn.value, updateToken);
83
83
  }
84
84
  }
85
85
 
@@ -1,10 +1,60 @@
1
- import { mapWithIndex } from '../../operators/index.mjs';
1
+ import { type SafeUint } from 'ts-type-forge';
2
+ import { map } from '../../operators/index.mjs';
2
3
  import { type KeepInitialValueOperator } from '../../types/index.mjs';
3
4
 
5
+ /**
6
+ * Attaches a sequential index to each emitted value, producing `[index, value]` tuples.
7
+ * Index starts at 0 and increments with each emission.
8
+ *
9
+ * @template A - The type of values from the source
10
+ * @returns An operator that emits `[index, value]` tuples
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // Timeline:
15
+ * //
16
+ * // letter$ "A" "B" "C"
17
+ * // indexed$ [0,"A"] [1,"B"] [2,"C"]
18
+ * //
19
+ * // Explanation:
20
+ * // - attachIndex attaches a sequential index to each emitted value
21
+ * // - Produces [index, value] tuples
22
+ * // - Index starts at 0 and increments with each emission
23
+ *
24
+ * const letter$ = source<string>();
25
+ *
26
+ * const indexed$ = letter$.pipe(attachIndex());
27
+ *
28
+ * const valueHistory: (readonly [number, string])[] = [];
29
+ *
30
+ * indexed$.subscribe(([i, letter]) => {
31
+ * valueHistory.push([i, letter]);
32
+ * });
33
+ *
34
+ * letter$.next('A');
35
+ *
36
+ * assert.deepStrictEqual(valueHistory, [[0, 'A']]);
37
+ *
38
+ * letter$.next('B');
39
+ *
40
+ * assert.deepStrictEqual(valueHistory, [
41
+ * [0, 'A'],
42
+ * [1, 'B'],
43
+ * ]);
44
+ *
45
+ * letter$.next('C');
46
+ *
47
+ * assert.deepStrictEqual(valueHistory, [
48
+ * [0, 'A'],
49
+ * [1, 'B'],
50
+ * [2, 'C'],
51
+ * ]);
52
+ * ```
53
+ */
4
54
  export const withIndex = <A,>(): KeepInitialValueOperator<
5
55
  A,
6
56
  readonly [SafeUint | -1, A]
7
- > => mapWithIndex((a, i) => [i, a] as const);
57
+ > => map((a, i) => [i, a] as const);
8
58
 
9
59
  /**
10
60
  * Alias for `withIndex`.
@@ -3,7 +3,6 @@ export * from './map-optional.mjs';
3
3
  export * from './map-result-err.mjs';
4
4
  export * from './map-result-ok.mjs';
5
5
  export * from './map-to.mjs';
6
- export * from './map.mjs';
7
6
  export * from './pluck.mjs';
8
7
  export * from './skip.mjs';
9
8
  export * from './take.mjs';
@@ -1,7 +1,54 @@
1
- import { Optional } from 'ts-data-forge';
1
+ import { Optional, type UnknownOptional } from 'ts-data-forge';
2
+ import { map } from '../../operators/index.mjs';
2
3
  import { type KeepInitialValueOperator } from '../../types/index.mjs';
3
- import { map } from './map.mjs';
4
4
 
5
+ /**
6
+ * Transforms the inner value of an `Optional` type emitted by the source.
7
+ * If the value is `Some`, the mapping function is applied; if `None`, it remains `None`.
8
+ *
9
+ * @template O - The Optional type from the source
10
+ * @template B - The type of the mapped inner value
11
+ * @param mapFn - A function to transform the unwrapped value
12
+ * @returns An operator that maps the inner value of Optional emissions
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * // Timeline:
17
+ * //
18
+ * // value$ Some(2) None Some(5)
19
+ * // doubled$ Some(4) None Some(10)
20
+ * //
21
+ * // Explanation:
22
+ * // - mapOptional transforms the inner value of Optional emissions
23
+ * // - Some values are mapped; None values pass through unchanged
24
+ *
25
+ * const value$ = source<Optional<number>>();
26
+ *
27
+ * const doubled$ = value$.pipe(mapOptional((x) => x * 2));
28
+ *
29
+ * const valueHistory: Optional<number>[] = [];
30
+ *
31
+ * doubled$.subscribe((v) => {
32
+ * valueHistory.push(v);
33
+ * });
34
+ *
35
+ * value$.next(Optional.some(2));
36
+ *
37
+ * assert.deepStrictEqual(valueHistory, [Optional.some(4)]);
38
+ *
39
+ * value$.next(Optional.none);
40
+ *
41
+ * assert.deepStrictEqual(valueHistory, [Optional.some(4), Optional.none]);
42
+ *
43
+ * value$.next(Optional.some(5));
44
+ *
45
+ * assert.deepStrictEqual(valueHistory, [
46
+ * Optional.some(4),
47
+ * Optional.none,
48
+ * Optional.some(10),
49
+ * ]);
50
+ * ```
51
+ */
5
52
  export const mapOptional = <O extends UnknownOptional, B>(
6
53
  mapFn: (x: Optional.Unwrap<O>) => B,
7
54
  ): KeepInitialValueOperator<O, Optional<B>> =>