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
@@ -1,7 +1,54 @@
1
- import { Result } from 'ts-data-forge';
1
+ import { Result, type UnknownResult } 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 error value (`Err`) of a `Result` type emitted by the source.
7
+ * If the value is `Err`, the mapping function is applied; if `Ok`, it remains unchanged.
8
+ *
9
+ * @template R - The Result type from the source
10
+ * @template E2 - The type of the mapped error value
11
+ * @param mapFn - A function to transform the Err value
12
+ * @returns An operator that maps the Err side of Result emissions
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * // Timeline:
17
+ * //
18
+ * // result$ Ok(1) Err("bad") Err("fail")
19
+ * // mapped$ Ok(1) Err("BAD") Err("FAIL")
20
+ * //
21
+ * // Explanation:
22
+ * // - mapResultErr transforms the Err value of Result emissions
23
+ * // - Ok values pass through unchanged
24
+ *
25
+ * const result$ = source<Result<number, string>>();
26
+ *
27
+ * const mapped$ = result$.pipe(mapResultErr((e) => e.toUpperCase()));
28
+ *
29
+ * const valueHistory: Result<number, string>[] = [];
30
+ *
31
+ * mapped$.subscribe((v) => {
32
+ * valueHistory.push(v);
33
+ * });
34
+ *
35
+ * result$.next(Result.ok(1));
36
+ *
37
+ * assert.deepStrictEqual(valueHistory, [Result.ok(1)]);
38
+ *
39
+ * result$.next(Result.err('bad'));
40
+ *
41
+ * assert.deepStrictEqual(valueHistory, [Result.ok(1), Result.err('BAD')]);
42
+ *
43
+ * result$.next(Result.err('fail'));
44
+ *
45
+ * assert.deepStrictEqual(valueHistory, [
46
+ * Result.ok(1),
47
+ * Result.err('BAD'),
48
+ * Result.err('FAIL'),
49
+ * ]);
50
+ * ```
51
+ */
5
52
  export const mapResultErr = <R extends UnknownResult, E2>(
6
53
  mapFn: (x: Result.UnwrapErr<R>) => E2,
7
54
  ): KeepInitialValueOperator<R, Result<Result.UnwrapOk<R>, E2>> =>
@@ -1,7 +1,54 @@
1
- import { Result } from 'ts-data-forge';
1
+ import { Result, type UnknownResult } 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 success value (`Ok`) of a `Result` type emitted by the source.
7
+ * If the value is `Ok`, the mapping function is applied; if `Err`, it remains unchanged.
8
+ *
9
+ * @template R - The Result type from the source
10
+ * @template S2 - The type of the mapped success value
11
+ * @param mapFn - A function to transform the Ok value
12
+ * @returns An operator that maps the Ok side of Result emissions
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * // Timeline:
17
+ * //
18
+ * // result$ Ok(2) Err("e") Ok(5)
19
+ * // doubled$ Ok(4) Err("e") Ok(10)
20
+ * //
21
+ * // Explanation:
22
+ * // - mapResultOk transforms the Ok value of Result emissions
23
+ * // - Err values pass through unchanged
24
+ *
25
+ * const result$ = source<Result<number, string>>();
26
+ *
27
+ * const doubled$ = result$.pipe(mapResultOk((x) => x * 2));
28
+ *
29
+ * const valueHistory: Result<number, string>[] = [];
30
+ *
31
+ * doubled$.subscribe((v) => {
32
+ * valueHistory.push(v);
33
+ * });
34
+ *
35
+ * result$.next(Result.ok(2));
36
+ *
37
+ * assert.deepStrictEqual(valueHistory, [Result.ok(4)]);
38
+ *
39
+ * result$.next(Result.err('e'));
40
+ *
41
+ * assert.deepStrictEqual(valueHistory, [Result.ok(4), Result.err('e')]);
42
+ *
43
+ * result$.next(Result.ok(5));
44
+ *
45
+ * assert.deepStrictEqual(valueHistory, [
46
+ * Result.ok(4),
47
+ * Result.err('e'),
48
+ * Result.ok(10),
49
+ * ]);
50
+ * ```
51
+ */
5
52
  export const mapResultOk = <R extends UnknownResult, S2>(
6
53
  mapFn: (x: Result.UnwrapOk<R>) => S2,
7
54
  ): KeepInitialValueOperator<R, Result<S2, Result.UnwrapErr<R>>> =>
@@ -1,5 +1,45 @@
1
+ import { map } from '../../operators/index.mjs';
1
2
  import { type KeepInitialValueOperator } from '../../types/index.mjs';
2
- import { map } from './map.mjs';
3
3
 
4
+ /**
5
+ * Maps all emitted values to a constant value, ignoring the source values.
6
+ * Equivalent to `map(() => value)`.
7
+ *
8
+ * @template A - The type of values from the source
9
+ * @template B - The type of the constant value
10
+ * @param value - The constant value to emit
11
+ * @returns An operator that always emits the given constant
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // Timeline:
16
+ * //
17
+ * // click$ MouseEvent MouseEvent MouseEvent
18
+ * // count$ 1 1 1
19
+ * //
20
+ * // Explanation:
21
+ * // - mapTo maps all emitted values to a constant value
22
+ * // - Ignores the source values entirely
23
+ * // - Useful for converting events to signals
24
+ *
25
+ * const click$ = source<string>();
26
+ *
27
+ * const one$ = click$.pipe(mapTo(1));
28
+ *
29
+ * const valueHistory: number[] = [];
30
+ *
31
+ * one$.subscribe((value) => {
32
+ * valueHistory.push(value);
33
+ * });
34
+ *
35
+ * click$.next('click1');
36
+ *
37
+ * click$.next('click2');
38
+ *
39
+ * click$.next('click3');
40
+ *
41
+ * assert.deepStrictEqual(valueHistory, [1, 1, 1]);
42
+ * ```
43
+ */
4
44
  export const mapTo = <A, B>(value: B): KeepInitialValueOperator<A, B> =>
5
45
  map(() => value);
@@ -1,6 +1,45 @@
1
+ import { map } from '../../operators/index.mjs';
1
2
  import { type KeepInitialValueOperator } from '../../types/index.mjs';
2
- import { map } from './map.mjs';
3
3
 
4
+ /**
5
+ * Extracts a property value from each emitted object by key.
6
+ * Equivalent to `map(value => value[key])`.
7
+ *
8
+ * @template A - The type of the emitted object
9
+ * @template K - The key to extract
10
+ * @param key - The property key to pluck
11
+ * @returns An operator that emits the property value
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // Timeline:
16
+ * //
17
+ * // user$ { name: "Alice", age: 25 } { name: "Bob", age: 30 }
18
+ * // name$ "Alice" "Bob"
19
+ * //
20
+ * // Explanation:
21
+ * // - getKey extracts a property value from each emitted object
22
+ * // - Equivalent to map(value => value[key])
23
+ *
24
+ * const user$ = source<Readonly<{ name: string; age: number }>>();
25
+ *
26
+ * const name$ = user$.pipe(getKey('name'));
27
+ *
28
+ * const valueHistory: string[] = [];
29
+ *
30
+ * name$.subscribe((n) => {
31
+ * valueHistory.push(n);
32
+ * });
33
+ *
34
+ * user$.next({ name: 'Alice', age: 25 });
35
+ *
36
+ * assert.deepStrictEqual(valueHistory, ['Alice']);
37
+ *
38
+ * user$.next({ name: 'Bob', age: 30 });
39
+ *
40
+ * assert.deepStrictEqual(valueHistory, ['Alice', 'Bob']);
41
+ * ```
42
+ */
4
43
  export const pluck = <A, K extends keyof A>(
5
44
  key: K,
6
45
  ): KeepInitialValueOperator<A, A[K]> => map((a) => a[key]);
@@ -1,7 +1,55 @@
1
1
  import { PositiveSafeInt } from 'ts-data-forge';
2
+ import { type PositiveSafeIntWithSmallInt } from 'ts-type-forge';
2
3
  import { skipWhile } from '../../operators/index.mjs';
3
4
  import { type DropInitialValueOperator } from '../../types/index.mjs';
4
5
 
6
+ /**
7
+ * Skips the first `n` emissions from the source observable.
8
+ * After `n` values are skipped, all subsequent values pass through.
9
+ *
10
+ * @template A - The type of values from the source
11
+ * @param n - The number of values to skip
12
+ * @returns An operator that skips the first n emissions
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * // Timeline:
17
+ * //
18
+ * // num$ 1 2 3 4 5
19
+ * // skipped$ 3 4 5
20
+ * // |skip 2|
21
+ * //
22
+ * // Explanation:
23
+ * // - skip ignores the first n emissions from the source
24
+ * // - After n values are skipped, all subsequent values pass through
25
+ *
26
+ * const num$ = source<number>();
27
+ *
28
+ * const skipped$ = num$.pipe(skip(2));
29
+ *
30
+ * const valueHistory: number[] = [];
31
+ *
32
+ * skipped$.subscribe((x) => {
33
+ * valueHistory.push(x);
34
+ * });
35
+ *
36
+ * num$.next(1); // skipped
37
+ *
38
+ * num$.next(2); // skipped
39
+ *
40
+ * assert.deepStrictEqual(valueHistory, []);
41
+ *
42
+ * num$.next(3); // logs: 3
43
+ *
44
+ * assert.deepStrictEqual(valueHistory, [3]);
45
+ *
46
+ * num$.next(4); // logs: 4
47
+ *
48
+ * num$.next(5); // logs: 5
49
+ *
50
+ * assert.deepStrictEqual(valueHistory, [3, 4, 5]);
51
+ * ```
52
+ */
5
53
  export const skip = <A,>(
6
54
  n: PositiveSafeIntWithSmallInt,
7
55
  ): DropInitialValueOperator<A, A> =>
@@ -1,6 +1,48 @@
1
+ import { type PositiveSafeIntWithSmallInt } from 'ts-type-forge';
1
2
  import { takeWhile } from '../../operators/index.mjs';
2
3
  import { type DropInitialValueOperator } from '../../types/index.mjs';
3
4
 
5
+ /**
6
+ * Takes only the first `n` emissions from the source observable, then completes.
7
+ *
8
+ * @template A - The type of values from the source
9
+ * @param n - The number of values to take
10
+ * @returns An operator that takes the first n emissions
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // Timeline:
15
+ * //
16
+ * // num$ 1 2 3 4 (ignored)
17
+ * // taken$ 1 2 3 | (completes)
18
+ * //
19
+ * // Explanation:
20
+ * // - take emits only the first n values, then completes
21
+ * // - Subsequent emissions from the source are ignored
22
+ *
23
+ * const num$ = source<number>();
24
+ *
25
+ * const taken$ = num$.pipe(take(3));
26
+ *
27
+ * const valueHistory: number[] = [];
28
+ *
29
+ * taken$.subscribe((x) => {
30
+ * valueHistory.push(x);
31
+ * });
32
+ *
33
+ * num$.next(1);
34
+ *
35
+ * num$.next(2);
36
+ *
37
+ * num$.next(3);
38
+ *
39
+ * assert.deepStrictEqual(valueHistory, [1, 2, 3]);
40
+ *
41
+ * num$.next(4); // ignored (already completed)
42
+ *
43
+ * assert.deepStrictEqual(valueHistory, [1, 2, 3]);
44
+ * ```
45
+ */
4
46
  export const take = <A,>(
5
47
  n: PositiveSafeIntWithSmallInt,
6
48
  ): DropInitialValueOperator<A, A> => takeWhile((_, index) => index + 1 <= n);
@@ -1,7 +1,48 @@
1
- import { Optional } from 'ts-data-forge';
1
+ import { Optional, type UnknownOptional } from 'ts-data-forge';
2
+ import { type Fn } from 'ts-type-forge';
3
+ import { map } from '../../operators/index.mjs';
2
4
  import { type KeepInitialValueOperator } from '../../types/index.mjs';
3
- import { map } from './map.mjs';
4
5
 
6
+ /**
7
+ * Unwraps `Optional` values, converting `Some(value)` to `value` and `None` to `undefined`.
8
+ *
9
+ * @template O - The Optional type from the source
10
+ * @returns An operator that unwraps Optional emissions
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // Timeline:
15
+ * //
16
+ * // opt$ Some(42) None Some(7)
17
+ * // unwrapped$ 42 undefined 7
18
+ * //
19
+ * // Explanation:
20
+ * // - unwrapOptional converts Some(value) to value, and None to undefined
21
+ * // - Useful for extracting raw values from Optional streams
22
+ *
23
+ * const opt$ = source<Optional<number>>();
24
+ *
25
+ * const unwrapped$ = opt$.pipe(unwrapOptional());
26
+ *
27
+ * const valueHistory: (number | undefined)[] = [];
28
+ *
29
+ * unwrapped$.subscribe((v) => {
30
+ * valueHistory.push(v);
31
+ * });
32
+ *
33
+ * opt$.next(Optional.some(42));
34
+ *
35
+ * assert.deepStrictEqual(valueHistory, [42]);
36
+ *
37
+ * opt$.next(Optional.none);
38
+ *
39
+ * assert.deepStrictEqual(valueHistory, [42, undefined]);
40
+ *
41
+ * opt$.next(Optional.some(7));
42
+ *
43
+ * assert.deepStrictEqual(valueHistory, [42, undefined, 7]);
44
+ * ```
45
+ */
5
46
  export const unwrapOptional = <
6
47
  O extends UnknownOptional,
7
48
  >(): KeepInitialValueOperator<O, Optional.Unwrap<O> | undefined> =>
@@ -1,7 +1,48 @@
1
- import { Result } from 'ts-data-forge';
1
+ import { Result, type UnknownResult } from 'ts-data-forge';
2
+ import { type Fn } from 'ts-type-forge';
3
+ import { map } from '../../operators/index.mjs';
2
4
  import { type KeepInitialValueOperator } from '../../types/index.mjs';
3
- import { map } from './map.mjs';
4
5
 
6
+ /**
7
+ * Unwraps the error value from a `Result`, converting `Err(error)` to `error` and `Ok` to `undefined`.
8
+ *
9
+ * @template R - The Result type from the source
10
+ * @returns An operator that unwraps the Err side of Result emissions
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // Timeline:
15
+ * //
16
+ * // result$ Ok(1) Err("fail") Ok(2)
17
+ * // unwrapped$ undefined "fail" undefined
18
+ * //
19
+ * // Explanation:
20
+ * // - unwrapResultErr converts Err(error) to error, and Ok to undefined
21
+ * // - Useful for extracting error values from Result streams
22
+ *
23
+ * const result$ = source<Result<number, string>>();
24
+ *
25
+ * const unwrapped$ = result$.pipe(unwrapResultErr());
26
+ *
27
+ * const valueHistory: (string | undefined)[] = [];
28
+ *
29
+ * unwrapped$.subscribe((v) => {
30
+ * valueHistory.push(v);
31
+ * });
32
+ *
33
+ * result$.next(Result.ok(1));
34
+ *
35
+ * assert.deepStrictEqual(valueHistory, [undefined]);
36
+ *
37
+ * result$.next(Result.err('fail'));
38
+ *
39
+ * assert.deepStrictEqual(valueHistory, [undefined, 'fail']);
40
+ *
41
+ * result$.next(Result.ok(2));
42
+ *
43
+ * assert.deepStrictEqual(valueHistory, [undefined, 'fail', undefined]);
44
+ * ```
45
+ */
5
46
  export const unwrapResultErr = <
6
47
  R extends UnknownResult,
7
48
  >(): KeepInitialValueOperator<R, Result.UnwrapErr<R> | undefined> =>
@@ -1,7 +1,48 @@
1
- import { Result } from 'ts-data-forge';
1
+ import { Result, type UnknownResult } from 'ts-data-forge';
2
+ import { type Fn } from 'ts-type-forge';
3
+ import { map } from '../../operators/index.mjs';
2
4
  import { type KeepInitialValueOperator } from '../../types/index.mjs';
3
- import { map } from './map.mjs';
4
5
 
6
+ /**
7
+ * Unwraps the success value from a `Result`, converting `Ok(value)` to `value` and `Err` to `undefined`.
8
+ *
9
+ * @template R - The Result type from the source
10
+ * @returns An operator that unwraps the Ok side of Result emissions
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // Timeline:
15
+ * //
16
+ * // result$ Ok(42) Err("e") Ok(7)
17
+ * // unwrapped$ 42 undefined 7
18
+ * //
19
+ * // Explanation:
20
+ * // - unwrapResultOk converts Ok(value) to value, and Err to undefined
21
+ * // - Useful for extracting success values from Result streams
22
+ *
23
+ * const result$ = source<Result<number, string>>();
24
+ *
25
+ * const unwrapped$ = result$.pipe(unwrapResultOk());
26
+ *
27
+ * const valueHistory: (number | undefined)[] = [];
28
+ *
29
+ * unwrapped$.subscribe((v) => {
30
+ * valueHistory.push(v);
31
+ * });
32
+ *
33
+ * result$.next(Result.ok(42));
34
+ *
35
+ * assert.deepStrictEqual(valueHistory, [42]);
36
+ *
37
+ * result$.next(Result.err('e'));
38
+ *
39
+ * assert.deepStrictEqual(valueHistory, [42, undefined]);
40
+ *
41
+ * result$.next(Result.ok(7));
42
+ *
43
+ * assert.deepStrictEqual(valueHistory, [42, undefined, 7]);
44
+ * ```
45
+ */
5
46
  export const unwrapResultOk = <
6
47
  R extends UnknownResult,
7
48
  >(): KeepInitialValueOperator<R, Result.UnwrapOk<R> | undefined> =>
@@ -1,5 +1,7 @@
1
+ import { type Brand } from 'ts-type-forge';
2
+
1
3
  export type ObservableId = Brand<symbol, 'observable-id'>;
2
4
 
3
5
  export type SubscriberId = Brand<symbol, 'subscriber-id'>;
4
6
 
5
- export type UpdaterSymbol = Brand<symbol, 'updater-symbol'>;
7
+ export type UpdateToken = Brand<symbol, 'update-token'>;
@@ -2,4 +2,5 @@ export * from './id.mjs';
2
2
  export * from './observable-family.mjs';
3
3
  export * from './observable-kind.mjs';
4
4
  export * from './observable.mjs';
5
+ export * from './timer.mjs';
5
6
  export * from './types.mjs';
@@ -1,4 +1,9 @@
1
1
  import { expectType, type Result } from 'ts-data-forge';
2
+ import {
3
+ type ArrayElement,
4
+ type NonEmptyArray,
5
+ type SafeUint,
6
+ } from 'ts-type-forge';
2
7
  import {
3
8
  type AsyncChildObservable,
4
9
  type InitializedObservable,
@@ -23,16 +28,6 @@ export type SourceObservable<A> = Readonly<{
23
28
  }> &
24
29
  RootObservable<A>;
25
30
 
26
- export type OfObservable<A> = Readonly<{
27
- emit: () => OfObservable<A>;
28
- }> &
29
- RootObservable<A>;
30
-
31
- export type FromArrayObservable<A> = Readonly<{
32
- emit: () => FromArrayObservable<A>;
33
- }> &
34
- RootObservable<A>;
35
-
36
31
  export type FromPromiseObservable<A, E = unknown> = RootObservable<
37
32
  Result<A, E>
38
33
  >;
@@ -41,13 +36,13 @@ export type FromSubscribableObservable<A, E = unknown> = RootObservable<
41
36
  Result<A, E>
42
37
  >;
43
38
 
44
- export type IntervalObservable = Readonly<{
45
- start: () => IntervalObservable;
39
+ export type CounterObservable = Readonly<{
40
+ start: () => void;
46
41
  }> &
47
42
  RootObservable<SafeUint>;
48
43
 
49
44
  export type TimerObservable = Readonly<{
50
- start: () => TimerObservable;
45
+ start: () => void;
51
46
  }> &
52
47
  RootObservable<0>;
53
48
 
@@ -77,7 +72,7 @@ namespace SynStateInternals {
77
72
  ? true
78
73
  : false;
79
74
 
80
- /** Evaluates True | false as true instead of boolean */
75
+ /** Evaluates true | false as true instead of boolean */
81
76
  type LogicalValue<B extends boolean> = readonly [B] extends readonly [true]
82
77
  ? true
83
78
  : readonly [B] extends readonly [false]
@@ -184,10 +179,7 @@ export type MergeObservableRefined<
184
179
  OS extends NonEmptyArray<Observable<unknown>>,
185
180
  > = SynStateInternals.MergeObservableRefinedImpl<OS>;
186
181
 
187
- export type MapWithIndexOperatorObservable<A, B> = SyncChildObservable<
188
- B,
189
- readonly [A]
190
- >;
182
+ export type MapOperatorObservable<A, B> = SyncChildObservable<B, readonly [A]>;
191
183
 
192
184
  export type PairwiseOperatorObservable<A> = SyncChildObservable<
193
185
  readonly [A, A],
@@ -231,19 +223,16 @@ export type SkipIfNoChangeOperatorObservable<A> = SyncChildObservable<
231
223
  readonly [A]
232
224
  >;
233
225
 
234
- export type ThrottleTimeOperatorObservable<A> = SyncChildObservable<
226
+ export type ThrottleOperatorObservable<A> = SyncChildObservable<
235
227
  A,
236
228
  readonly [A]
237
229
  >;
238
230
 
239
231
  // AsyncChildObservable
240
232
 
241
- export type AuditTimeOperatorObservable<A> = AsyncChildObservable<
242
- A,
243
- readonly [A]
244
- >;
233
+ export type AuditOperatorObservable<A> = AsyncChildObservable<A, readonly [A]>;
245
234
 
246
- export type DebounceTimeOperatorObservable<A> = AsyncChildObservable<
235
+ export type DebounceOperatorObservable<A> = AsyncChildObservable<
247
236
  A,
248
237
  readonly [A]
249
238
  >;
@@ -1,3 +1,5 @@
1
+ import { type StrictExclude } from 'ts-type-forge';
2
+
1
3
  export type ObservableKind = 'root' | 'sync child' | 'async child';
2
4
 
3
5
  export type ManagerObservableKind = StrictExclude<ObservableKind, 'sync child'>;
@@ -1,5 +1,6 @@
1
- import { expectType, type Optional } from 'ts-data-forge';
2
- import { type ObservableId, type UpdaterSymbol } from './id.mjs';
1
+ import { expectType, type Optional, type Some } from 'ts-data-forge';
2
+ import { type StrictOmit } from 'ts-type-forge';
3
+ import { type ObservableId, type UpdateToken } from './id.mjs';
3
4
  import { type ObservableKind } from './observable-kind.mjs';
4
5
  import { type NonEmptyUnknownList, type Subscription } from './types.mjs';
5
6
 
@@ -28,12 +29,12 @@ type CreateObservableType<A, Kind extends ObservableKind> = Readonly<{
28
29
  // state
29
30
  getSnapshot: () => Optional<A>;
30
31
  isCompleted: boolean;
31
- updaterSymbol: UpdaterSymbol;
32
+ updateToken: UpdateToken;
32
33
  hasSubscriber: boolean;
33
34
  hasChild: boolean;
34
35
  hasActiveChild: () => boolean;
35
36
 
36
- tryUpdate: (updaterSymbol: UpdaterSymbol) => void;
37
+ tryUpdate: (updateToken: UpdateToken) => void;
37
38
  tryComplete: () => void;
38
39
  complete: () => void;
39
40
  subscribe: (onNext: (v: A) => void, onComplete?: () => void) => Subscription;
@@ -0,0 +1,2 @@
1
+ // Timer types for Node.js/Browser compatibility
2
+ export type TimerId = ReturnType<typeof setTimeout>;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  type ObservableId,
3
3
  type SubscriberId,
4
- type UpdaterSymbol,
4
+ type UpdateToken,
5
5
  } from '../types/index.mjs';
6
6
 
7
7
  function* idMaker<T extends symbol>(): Generator<T, T, T> {
@@ -19,7 +19,7 @@ const observableIdMaker = idMaker<ObservableId>();
19
19
 
20
20
  const subscriberIdMaker = idMaker<SubscriberId>();
21
21
 
22
- const updaterSymbolMaker = idMaker<UpdaterSymbol>();
22
+ const updateTokenMaker = idMaker<UpdateToken>();
23
23
 
24
24
  export const issueObservableId = (): ObservableId =>
25
25
  observableIdMaker.next().value;
@@ -27,5 +27,5 @@ export const issueObservableId = (): ObservableId =>
27
27
  export const issueSubscriberId = (): SubscriberId =>
28
28
  subscriberIdMaker.next().value;
29
29
 
30
- export const issueUpdaterSymbol = (): UpdaterSymbol =>
31
- updaterSymbolMaker.next().value;
30
+ export const issueUpdateToken = (): UpdateToken =>
31
+ updateTokenMaker.next().value;
@@ -1,4 +1,5 @@
1
1
  import { Arr, asSafeInt, asUint32, SafeInt } from 'ts-data-forge';
2
+ import { type NegativeInt32, type Uint32 } from 'ts-type-forge';
2
3
 
3
4
  export const halfInt = (x: SafeInt): SafeInt =>
4
5
  x % 2 === 0
@@ -0,0 +1,17 @@
1
+ import { type Observable } from '../core/index.mjs';
2
+
3
+ export const collectToArray = <A,>(
4
+ observable: Observable<A>,
5
+ ): Promise<readonly A[]> =>
6
+ new Promise<readonly A[]>((resolve) => {
7
+ const mut_buffer: A[] = [];
8
+
9
+ observable.subscribe(
10
+ (value) => {
11
+ mut_buffer.push(value);
12
+ },
13
+ () => {
14
+ resolve(mut_buffer);
15
+ },
16
+ );
17
+ });