@typed/fx 2.0.0-beta.0 → 2.0.0-beta.10

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 (640) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -21
  3. package/dist/Fx/Fx.d.ts +371 -19
  4. package/dist/Fx/Fx.d.ts.map +1 -1
  5. package/dist/Fx/Fx.js +37 -6
  6. package/dist/Fx/TypeId.d.ts +52 -6
  7. package/dist/Fx/TypeId.d.ts.map +1 -1
  8. package/dist/Fx/TypeId.js +41 -4
  9. package/dist/Fx/combinators/additive.d.ts +245 -0
  10. package/dist/Fx/combinators/additive.d.ts.map +1 -0
  11. package/dist/Fx/combinators/additive.js +243 -0
  12. package/dist/Fx/combinators/catch.d.ts +246 -12
  13. package/dist/Fx/combinators/catch.d.ts.map +1 -1
  14. package/dist/Fx/combinators/catch.js +236 -12
  15. package/dist/Fx/combinators/causes.d.ts +25 -2
  16. package/dist/Fx/combinators/causes.d.ts.map +1 -1
  17. package/dist/Fx/combinators/causes.js +25 -2
  18. package/dist/Fx/combinators/changesWithEffect.d.ts +40 -0
  19. package/dist/Fx/combinators/changesWithEffect.d.ts.map +1 -0
  20. package/dist/Fx/combinators/changesWithEffect.js +48 -0
  21. package/dist/Fx/combinators/compact.d.ts +18 -1
  22. package/dist/Fx/combinators/compact.d.ts.map +1 -1
  23. package/dist/Fx/combinators/compact.js +18 -1
  24. package/dist/Fx/combinators/concatMap.d.ts +86 -0
  25. package/dist/Fx/combinators/concatMap.d.ts.map +1 -0
  26. package/dist/Fx/combinators/concatMap.js +86 -0
  27. package/dist/Fx/combinators/continueWith.d.ts +113 -5
  28. package/dist/Fx/combinators/continueWith.d.ts.map +1 -1
  29. package/dist/Fx/combinators/continueWith.js +113 -5
  30. package/dist/Fx/combinators/debounce.d.ts +34 -0
  31. package/dist/Fx/combinators/debounce.d.ts.map +1 -0
  32. package/dist/Fx/combinators/debounce.js +35 -0
  33. package/dist/Fx/combinators/delay.d.ts +36 -0
  34. package/dist/Fx/combinators/delay.d.ts.map +1 -0
  35. package/dist/Fx/combinators/delay.js +33 -0
  36. package/dist/Fx/combinators/dropUntil.d.ts +71 -0
  37. package/dist/Fx/combinators/dropUntil.d.ts.map +1 -0
  38. package/dist/Fx/combinators/dropUntil.js +65 -0
  39. package/dist/Fx/combinators/during.d.ts +38 -0
  40. package/dist/Fx/combinators/during.d.ts.map +1 -0
  41. package/dist/Fx/combinators/during.js +85 -0
  42. package/dist/Fx/combinators/ensuring.d.ts +34 -4
  43. package/dist/Fx/combinators/ensuring.d.ts.map +1 -1
  44. package/dist/Fx/combinators/ensuring.js +34 -4
  45. package/dist/Fx/combinators/exhaustLatestMap.d.ts +41 -5
  46. package/dist/Fx/combinators/exhaustLatestMap.d.ts.map +1 -1
  47. package/dist/Fx/combinators/exhaustLatestMap.js +41 -5
  48. package/dist/Fx/combinators/exhaustLatestMapEffect.d.ts +40 -4
  49. package/dist/Fx/combinators/exhaustLatestMapEffect.d.ts.map +1 -1
  50. package/dist/Fx/combinators/exhaustLatestMapEffect.js +40 -4
  51. package/dist/Fx/combinators/exhaustMap.d.ts +38 -1
  52. package/dist/Fx/combinators/exhaustMap.d.ts.map +1 -1
  53. package/dist/Fx/combinators/exhaustMap.js +38 -1
  54. package/dist/Fx/combinators/exhaustMapEffect.d.ts +33 -1
  55. package/dist/Fx/combinators/exhaustMapEffect.d.ts.map +1 -1
  56. package/dist/Fx/combinators/exhaustMapEffect.js +33 -1
  57. package/dist/Fx/combinators/exit.d.ts +23 -2
  58. package/dist/Fx/combinators/exit.d.ts.map +1 -1
  59. package/dist/Fx/combinators/exit.js +23 -2
  60. package/dist/Fx/combinators/filter.d.ts +17 -1
  61. package/dist/Fx/combinators/filter.d.ts.map +1 -1
  62. package/dist/Fx/combinators/filter.js +17 -1
  63. package/dist/Fx/combinators/filterEffect.d.ts +22 -1
  64. package/dist/Fx/combinators/filterEffect.d.ts.map +1 -1
  65. package/dist/Fx/combinators/filterEffect.js +22 -1
  66. package/dist/Fx/combinators/filterMap.d.ts +20 -1
  67. package/dist/Fx/combinators/filterMap.d.ts.map +1 -1
  68. package/dist/Fx/combinators/filterMap.js +20 -1
  69. package/dist/Fx/combinators/filterMapEffect.d.ts +21 -1
  70. package/dist/Fx/combinators/filterMapEffect.d.ts.map +1 -1
  71. package/dist/Fx/combinators/filterMapEffect.js +21 -1
  72. package/dist/Fx/combinators/filterMapLoop.d.ts +20 -1
  73. package/dist/Fx/combinators/filterMapLoop.d.ts.map +1 -1
  74. package/dist/Fx/combinators/filterMapLoop.js +20 -1
  75. package/dist/Fx/combinators/filterMapLoopCause.d.ts +21 -1
  76. package/dist/Fx/combinators/filterMapLoopCause.d.ts.map +1 -1
  77. package/dist/Fx/combinators/filterMapLoopCause.js +21 -1
  78. package/dist/Fx/combinators/filterMapLoopCauseEffect.d.ts +21 -1
  79. package/dist/Fx/combinators/filterMapLoopCauseEffect.d.ts.map +1 -1
  80. package/dist/Fx/combinators/filterMapLoopCauseEffect.js +21 -1
  81. package/dist/Fx/combinators/filterMapLoopEffect.d.ts +21 -1
  82. package/dist/Fx/combinators/filterMapLoopEffect.d.ts.map +1 -1
  83. package/dist/Fx/combinators/filterMapLoopEffect.js +21 -1
  84. package/dist/Fx/combinators/flatMap.d.ts +50 -5
  85. package/dist/Fx/combinators/flatMap.d.ts.map +1 -1
  86. package/dist/Fx/combinators/flatMap.js +36 -3
  87. package/dist/Fx/combinators/flatMapConcurrently.d.ts +51 -4
  88. package/dist/Fx/combinators/flatMapConcurrently.d.ts.map +1 -1
  89. package/dist/Fx/combinators/flatMapConcurrently.js +51 -4
  90. package/dist/Fx/combinators/flatMapConcurrentlyEffect.d.ts +48 -4
  91. package/dist/Fx/combinators/flatMapConcurrentlyEffect.d.ts.map +1 -1
  92. package/dist/Fx/combinators/flatMapConcurrentlyEffect.js +40 -2
  93. package/dist/Fx/combinators/flatMapEffect.d.ts +46 -4
  94. package/dist/Fx/combinators/flatMapEffect.d.ts.map +1 -1
  95. package/dist/Fx/combinators/flatMapEffect.js +32 -2
  96. package/dist/Fx/combinators/flip.d.ts +34 -2
  97. package/dist/Fx/combinators/flip.d.ts.map +1 -1
  98. package/dist/Fx/combinators/flip.js +34 -2
  99. package/dist/Fx/combinators/gen.d.ts +29 -10
  100. package/dist/Fx/combinators/gen.d.ts.map +1 -1
  101. package/dist/Fx/combinators/gen.js +28 -4
  102. package/dist/Fx/combinators/genScoped.d.ts +33 -10
  103. package/dist/Fx/combinators/genScoped.d.ts.map +1 -1
  104. package/dist/Fx/combinators/genScoped.js +31 -3
  105. package/dist/Fx/combinators/grouped.d.ts +89 -0
  106. package/dist/Fx/combinators/grouped.d.ts.map +1 -0
  107. package/dist/Fx/combinators/grouped.js +146 -0
  108. package/dist/Fx/combinators/index.d.ts +45 -0
  109. package/dist/Fx/combinators/index.d.ts.map +1 -1
  110. package/dist/Fx/combinators/index.js +45 -0
  111. package/dist/Fx/combinators/keyed.d.ts +124 -10
  112. package/dist/Fx/combinators/keyed.d.ts.map +1 -1
  113. package/dist/Fx/combinators/keyed.js +69 -11
  114. package/dist/Fx/combinators/loop.d.ts +17 -1
  115. package/dist/Fx/combinators/loop.d.ts.map +1 -1
  116. package/dist/Fx/combinators/loop.js +17 -1
  117. package/dist/Fx/combinators/loopCause.d.ts +18 -1
  118. package/dist/Fx/combinators/loopCause.d.ts.map +1 -1
  119. package/dist/Fx/combinators/loopCause.js +18 -1
  120. package/dist/Fx/combinators/loopCauseEffect.d.ts +19 -1
  121. package/dist/Fx/combinators/loopCauseEffect.d.ts.map +1 -1
  122. package/dist/Fx/combinators/loopCauseEffect.js +19 -1
  123. package/dist/Fx/combinators/loopEffect.d.ts +24 -1
  124. package/dist/Fx/combinators/loopEffect.d.ts.map +1 -1
  125. package/dist/Fx/combinators/loopEffect.js +24 -1
  126. package/dist/Fx/combinators/map.d.ts +46 -1
  127. package/dist/Fx/combinators/map.d.ts.map +1 -1
  128. package/dist/Fx/combinators/map.js +43 -1
  129. package/dist/Fx/combinators/mapBoth.d.ts +40 -0
  130. package/dist/Fx/combinators/mapBoth.d.ts.map +1 -0
  131. package/dist/Fx/combinators/mapBoth.js +33 -0
  132. package/dist/Fx/combinators/mapEffect.d.ts +25 -1
  133. package/dist/Fx/combinators/mapEffect.d.ts.map +1 -1
  134. package/dist/Fx/combinators/mapEffect.js +25 -1
  135. package/dist/Fx/combinators/mapError.d.ts +33 -0
  136. package/dist/Fx/combinators/mapError.d.ts.map +1 -0
  137. package/dist/Fx/combinators/mapError.js +32 -0
  138. package/dist/Fx/combinators/mergeAll.d.ts +35 -1
  139. package/dist/Fx/combinators/mergeAll.d.ts.map +1 -1
  140. package/dist/Fx/combinators/mergeAll.js +35 -1
  141. package/dist/Fx/combinators/mergeOrdered.d.ts +36 -4
  142. package/dist/Fx/combinators/mergeOrdered.d.ts.map +1 -1
  143. package/dist/Fx/combinators/mergeOrdered.js +68 -14
  144. package/dist/Fx/combinators/onError.d.ts +34 -4
  145. package/dist/Fx/combinators/onError.d.ts.map +1 -1
  146. package/dist/Fx/combinators/onError.js +34 -4
  147. package/dist/Fx/combinators/onExit.d.ts +29 -3
  148. package/dist/Fx/combinators/onExit.d.ts.map +1 -1
  149. package/dist/Fx/combinators/onExit.js +29 -3
  150. package/dist/Fx/combinators/onInterrupt.d.ts +49 -4
  151. package/dist/Fx/combinators/onInterrupt.d.ts.map +1 -1
  152. package/dist/Fx/combinators/onInterrupt.js +49 -4
  153. package/dist/Fx/combinators/pairwise.d.ts +28 -0
  154. package/dist/Fx/combinators/pairwise.d.ts.map +1 -0
  155. package/dist/Fx/combinators/pairwise.js +31 -0
  156. package/dist/Fx/combinators/provide.d.ts +162 -8
  157. package/dist/Fx/combinators/provide.d.ts.map +1 -1
  158. package/dist/Fx/combinators/provide.js +154 -6
  159. package/dist/Fx/combinators/race.d.ts +92 -0
  160. package/dist/Fx/combinators/race.d.ts.map +1 -0
  161. package/dist/Fx/combinators/race.js +149 -0
  162. package/dist/Fx/combinators/repeat.d.ts +41 -0
  163. package/dist/Fx/combinators/repeat.d.ts.map +1 -0
  164. package/dist/Fx/combinators/repeat.js +57 -0
  165. package/dist/Fx/combinators/result.d.ts +45 -0
  166. package/dist/Fx/combinators/result.d.ts.map +1 -0
  167. package/dist/Fx/combinators/result.js +46 -0
  168. package/dist/Fx/combinators/retry.d.ts +53 -0
  169. package/dist/Fx/combinators/retry.d.ts.map +1 -0
  170. package/dist/Fx/combinators/retry.js +71 -0
  171. package/dist/Fx/combinators/sample.d.ts +31 -0
  172. package/dist/Fx/combinators/sample.d.ts.map +1 -0
  173. package/dist/Fx/combinators/sample.js +42 -0
  174. package/dist/Fx/combinators/scan.d.ts +72 -0
  175. package/dist/Fx/combinators/scan.d.ts.map +1 -0
  176. package/dist/Fx/combinators/scan.js +77 -0
  177. package/dist/Fx/combinators/since.d.ts +30 -0
  178. package/dist/Fx/combinators/since.d.ts.map +1 -0
  179. package/dist/Fx/combinators/since.js +39 -0
  180. package/dist/Fx/combinators/skip.d.ts +45 -1
  181. package/dist/Fx/combinators/skip.d.ts.map +1 -1
  182. package/dist/Fx/combinators/skip.js +43 -1
  183. package/dist/Fx/combinators/skipRepeats.d.ts +17 -1
  184. package/dist/Fx/combinators/skipRepeats.d.ts.map +1 -1
  185. package/dist/Fx/combinators/skipRepeats.js +17 -1
  186. package/dist/Fx/combinators/skipRepeatsWith.d.ts +18 -1
  187. package/dist/Fx/combinators/skipRepeatsWith.d.ts.map +1 -1
  188. package/dist/Fx/combinators/skipRepeatsWith.js +18 -1
  189. package/dist/Fx/combinators/skipWhile.d.ts +117 -0
  190. package/dist/Fx/combinators/skipWhile.d.ts.map +1 -0
  191. package/dist/Fx/combinators/skipWhile.js +134 -0
  192. package/dist/Fx/combinators/slice.d.ts +97 -2
  193. package/dist/Fx/combinators/slice.d.ts.map +1 -1
  194. package/dist/Fx/combinators/slice.js +45 -1
  195. package/dist/Fx/combinators/switchMap.d.ts +39 -1
  196. package/dist/Fx/combinators/switchMap.d.ts.map +1 -1
  197. package/dist/Fx/combinators/switchMap.js +43 -5
  198. package/dist/Fx/combinators/switchMapEffect.d.ts +38 -1
  199. package/dist/Fx/combinators/switchMapEffect.d.ts.map +1 -1
  200. package/dist/Fx/combinators/switchMapEffect.js +38 -1
  201. package/dist/Fx/combinators/take.d.ts +46 -1
  202. package/dist/Fx/combinators/take.d.ts.map +1 -1
  203. package/dist/Fx/combinators/take.js +44 -1
  204. package/dist/Fx/combinators/takeUntil.d.ts +62 -2
  205. package/dist/Fx/combinators/takeUntil.d.ts.map +1 -1
  206. package/dist/Fx/combinators/takeUntil.js +62 -2
  207. package/dist/Fx/combinators/takeWhile.d.ts +60 -0
  208. package/dist/Fx/combinators/takeWhile.d.ts.map +1 -0
  209. package/dist/Fx/combinators/takeWhile.js +54 -0
  210. package/dist/Fx/combinators/tapEffect.d.ts +17 -1
  211. package/dist/Fx/combinators/tapEffect.d.ts.map +1 -1
  212. package/dist/Fx/combinators/tapEffect.js +17 -1
  213. package/dist/Fx/combinators/throttle.d.ts +79 -0
  214. package/dist/Fx/combinators/throttle.d.ts.map +1 -0
  215. package/dist/Fx/combinators/throttle.js +99 -0
  216. package/dist/Fx/combinators/timeout.d.ts +76 -0
  217. package/dist/Fx/combinators/timeout.d.ts.map +1 -0
  218. package/dist/Fx/combinators/timeout.js +110 -0
  219. package/dist/Fx/combinators/tuple.d.ts +32 -2
  220. package/dist/Fx/combinators/tuple.d.ts.map +1 -1
  221. package/dist/Fx/combinators/tuple.js +36 -5
  222. package/dist/Fx/combinators/until.d.ts +27 -0
  223. package/dist/Fx/combinators/until.d.ts.map +1 -0
  224. package/dist/Fx/combinators/until.js +56 -0
  225. package/dist/Fx/combinators/unwrap.d.ts +31 -2
  226. package/dist/Fx/combinators/unwrap.d.ts.map +1 -1
  227. package/dist/Fx/combinators/unwrap.js +30 -1
  228. package/dist/Fx/combinators/unwrapScoped.d.ts +34 -1
  229. package/dist/Fx/combinators/unwrapScoped.d.ts.map +1 -1
  230. package/dist/Fx/combinators/unwrapScoped.js +34 -1
  231. package/dist/Fx/combinators/when.d.ts +37 -2
  232. package/dist/Fx/combinators/when.d.ts.map +1 -1
  233. package/dist/Fx/combinators/when.js +38 -3
  234. package/dist/Fx/combinators/withLatestFrom.d.ts +58 -0
  235. package/dist/Fx/combinators/withLatestFrom.d.ts.map +1 -0
  236. package/dist/Fx/combinators/withLatestFrom.js +68 -0
  237. package/dist/Fx/combinators/withSpan.d.ts +35 -1
  238. package/dist/Fx/combinators/withSpan.d.ts.map +1 -1
  239. package/dist/Fx/combinators/withSpan.js +34 -3
  240. package/dist/Fx/combinators/zip.d.ts +135 -0
  241. package/dist/Fx/combinators/zip.d.ts.map +1 -0
  242. package/dist/Fx/combinators/zip.js +160 -0
  243. package/dist/Fx/constructors/at.d.ts +23 -3
  244. package/dist/Fx/constructors/at.d.ts.map +1 -1
  245. package/dist/Fx/constructors/at.js +21 -1
  246. package/dist/Fx/constructors/die.d.ts +22 -1
  247. package/dist/Fx/constructors/die.d.ts.map +1 -1
  248. package/dist/Fx/constructors/die.js +22 -1
  249. package/dist/Fx/constructors/empty.d.ts +19 -1
  250. package/dist/Fx/constructors/empty.d.ts.map +1 -1
  251. package/dist/Fx/constructors/empty.js +19 -1
  252. package/dist/Fx/constructors/fail.d.ts +22 -1
  253. package/dist/Fx/constructors/fail.d.ts.map +1 -1
  254. package/dist/Fx/constructors/fail.js +22 -1
  255. package/dist/Fx/constructors/failCause.d.ts +23 -1
  256. package/dist/Fx/constructors/failCause.d.ts.map +1 -1
  257. package/dist/Fx/constructors/failCause.js +23 -1
  258. package/dist/Fx/constructors/fn.d.ts +116 -16
  259. package/dist/Fx/constructors/fn.d.ts.map +1 -1
  260. package/dist/Fx/constructors/fn.js +36 -0
  261. package/dist/Fx/constructors/fromEffect.d.ts +45 -3
  262. package/dist/Fx/constructors/fromEffect.d.ts.map +1 -1
  263. package/dist/Fx/constructors/fromEffect.js +45 -3
  264. package/dist/Fx/constructors/fromFailures.d.ts +25 -1
  265. package/dist/Fx/constructors/fromFailures.d.ts.map +1 -1
  266. package/dist/Fx/constructors/fromFailures.js +25 -1
  267. package/dist/Fx/constructors/fromIterable.d.ts +23 -1
  268. package/dist/Fx/constructors/fromIterable.d.ts.map +1 -1
  269. package/dist/Fx/constructors/fromIterable.js +23 -1
  270. package/dist/Fx/constructors/fromSchedule.d.ts +26 -1
  271. package/dist/Fx/constructors/fromSchedule.d.ts.map +1 -1
  272. package/dist/Fx/constructors/fromSchedule.js +28 -3
  273. package/dist/Fx/constructors/index.d.ts +2 -1
  274. package/dist/Fx/constructors/index.d.ts.map +1 -1
  275. package/dist/Fx/constructors/index.js +2 -1
  276. package/dist/Fx/constructors/interrupt.d.ts +22 -2
  277. package/dist/Fx/constructors/interrupt.d.ts.map +1 -1
  278. package/dist/Fx/constructors/interrupt.js +22 -2
  279. package/dist/Fx/constructors/make.d.ts +151 -4
  280. package/dist/Fx/constructors/make.d.ts.map +1 -1
  281. package/dist/Fx/constructors/make.js +60 -7
  282. package/dist/Fx/constructors/periodic.d.ts +31 -2
  283. package/dist/Fx/constructors/periodic.d.ts.map +1 -1
  284. package/dist/Fx/constructors/periodic.js +30 -1
  285. package/dist/Fx/constructors/succeed.d.ts +79 -7
  286. package/dist/Fx/constructors/succeed.d.ts.map +1 -1
  287. package/dist/Fx/constructors/succeed.js +79 -7
  288. package/dist/Fx/constructors/suspend.d.ts +28 -0
  289. package/dist/Fx/constructors/suspend.d.ts.map +1 -1
  290. package/dist/Fx/constructors/suspend.js +28 -0
  291. package/dist/Fx/constructors/sync.d.ts +32 -0
  292. package/dist/Fx/constructors/sync.d.ts.map +1 -0
  293. package/dist/Fx/constructors/sync.js +32 -0
  294. package/dist/Fx/internal/DeferredRef.d.ts +259 -7
  295. package/dist/Fx/internal/DeferredRef.d.ts.map +1 -1
  296. package/dist/Fx/internal/DeferredRef.js +260 -9
  297. package/dist/Fx/internal/UnionToTuple.d.ts +22 -0
  298. package/dist/Fx/internal/UnionToTuple.d.ts.map +1 -1
  299. package/dist/Fx/internal/diff.d.ts +586 -0
  300. package/dist/Fx/internal/diff.d.ts.map +1 -1
  301. package/dist/Fx/internal/diff.js +120 -9
  302. package/dist/Fx/internal/effectableEvaluateKey.d.ts +30 -0
  303. package/dist/Fx/internal/effectableEvaluateKey.d.ts.map +1 -0
  304. package/dist/Fx/internal/effectableEvaluateKey.js +29 -0
  305. package/dist/Fx/internal/effectableWithOverride.d.ts +55 -0
  306. package/dist/Fx/internal/effectableWithOverride.d.ts.map +1 -0
  307. package/dist/Fx/internal/effectableWithOverride.js +46 -0
  308. package/dist/Fx/internal/equivalence.d.ts +29 -0
  309. package/dist/Fx/internal/equivalence.d.ts.map +1 -1
  310. package/dist/Fx/internal/equivalence.js +29 -0
  311. package/dist/Fx/internal/multicast.d.ts +145 -2
  312. package/dist/Fx/internal/multicast.d.ts.map +1 -1
  313. package/dist/Fx/internal/multicast.js +146 -4
  314. package/dist/Fx/internal/ring-buffer.d.ts +149 -0
  315. package/dist/Fx/internal/ring-buffer.d.ts.map +1 -1
  316. package/dist/Fx/internal/ring-buffer.js +155 -0
  317. package/dist/Fx/internal/scope.d.ts +184 -0
  318. package/dist/Fx/internal/scope.d.ts.map +1 -1
  319. package/dist/Fx/internal/scope.js +150 -0
  320. package/dist/Fx/internal/yieldable.d.ts +117 -2
  321. package/dist/Fx/internal/yieldable.d.ts.map +1 -1
  322. package/dist/Fx/internal/yieldable.js +86 -3
  323. package/dist/Fx/run/collect.d.ts +93 -4
  324. package/dist/Fx/run/collect.d.ts.map +1 -1
  325. package/dist/Fx/run/collect.js +94 -5
  326. package/dist/Fx/run/first.d.ts +23 -1
  327. package/dist/Fx/run/first.d.ts.map +1 -1
  328. package/dist/Fx/run/first.js +23 -1
  329. package/dist/Fx/run/fork.d.ts +52 -2
  330. package/dist/Fx/run/fork.d.ts.map +1 -1
  331. package/dist/Fx/run/fork.js +52 -2
  332. package/dist/Fx/run/observe.d.ts +112 -4
  333. package/dist/Fx/run/observe.d.ts.map +1 -1
  334. package/dist/Fx/run/observe.js +137 -16
  335. package/dist/Fx/run/runPromise.d.ts +45 -2
  336. package/dist/Fx/run/runPromise.d.ts.map +1 -1
  337. package/dist/Fx/run/runPromise.js +45 -2
  338. package/dist/Fx/stream.d.ts +92 -0
  339. package/dist/Fx/stream.d.ts.map +1 -1
  340. package/dist/Fx/stream.js +60 -1
  341. package/dist/Push/Push.d.ts +1286 -98
  342. package/dist/Push/Push.d.ts.map +1 -1
  343. package/dist/Push/Push.js +1074 -88
  344. package/dist/RefArray.d.ts +2 -0
  345. package/dist/RefArray.d.ts.map +1 -0
  346. package/dist/RefArray.js +1 -0
  347. package/dist/RefBigDecimal.d.ts +2 -0
  348. package/dist/RefBigDecimal.d.ts.map +1 -0
  349. package/dist/RefBigDecimal.js +1 -0
  350. package/dist/RefBigInt.d.ts +2 -0
  351. package/dist/RefBigInt.d.ts.map +1 -0
  352. package/dist/RefBigInt.js +1 -0
  353. package/dist/RefBoolean.d.ts +2 -0
  354. package/dist/RefBoolean.d.ts.map +1 -0
  355. package/dist/RefBoolean.js +1 -0
  356. package/dist/RefCause.d.ts +2 -0
  357. package/dist/RefCause.d.ts.map +1 -0
  358. package/dist/RefCause.js +1 -0
  359. package/dist/RefChunk.d.ts +2 -0
  360. package/dist/RefChunk.d.ts.map +1 -0
  361. package/dist/RefChunk.js +1 -0
  362. package/dist/RefDateTime.d.ts +2 -0
  363. package/dist/RefDateTime.d.ts.map +1 -0
  364. package/dist/RefDateTime.js +1 -0
  365. package/dist/RefDuration.d.ts +2 -0
  366. package/dist/RefDuration.d.ts.map +1 -0
  367. package/dist/RefDuration.js +1 -0
  368. package/dist/RefGraph.d.ts +2 -0
  369. package/dist/RefGraph.d.ts.map +1 -0
  370. package/dist/RefGraph.js +1 -0
  371. package/dist/RefHashMap.d.ts +2 -0
  372. package/dist/RefHashMap.d.ts.map +1 -0
  373. package/dist/RefHashMap.js +1 -0
  374. package/dist/RefHashRing.d.ts +2 -0
  375. package/dist/RefHashRing.d.ts.map +1 -0
  376. package/dist/RefHashRing.js +1 -0
  377. package/dist/RefHashSet.d.ts +2 -0
  378. package/dist/RefHashSet.d.ts.map +1 -0
  379. package/dist/RefHashSet.js +1 -0
  380. package/dist/RefIterable.d.ts +2 -0
  381. package/dist/RefIterable.d.ts.map +1 -0
  382. package/dist/RefIterable.js +1 -0
  383. package/dist/RefOption.d.ts +2 -0
  384. package/dist/RefOption.d.ts.map +1 -0
  385. package/dist/RefOption.js +1 -0
  386. package/dist/RefRecord.d.ts +2 -0
  387. package/dist/RefRecord.d.ts.map +1 -0
  388. package/dist/RefRecord.js +1 -0
  389. package/dist/RefResult.d.ts +2 -0
  390. package/dist/RefResult.d.ts.map +1 -0
  391. package/dist/RefResult.js +1 -0
  392. package/dist/RefString.d.ts +2 -0
  393. package/dist/RefString.d.ts.map +1 -0
  394. package/dist/RefString.js +1 -0
  395. package/dist/RefStruct.d.ts +2 -0
  396. package/dist/RefStruct.d.ts.map +1 -0
  397. package/dist/RefStruct.js +1 -0
  398. package/dist/RefSubject/Hydration.d.ts +504 -0
  399. package/dist/RefSubject/Hydration.d.ts.map +1 -0
  400. package/dist/RefSubject/Hydration.js +300 -0
  401. package/dist/RefSubject/RefArray.d.ts +382 -35
  402. package/dist/RefSubject/RefArray.d.ts.map +1 -1
  403. package/dist/RefSubject/RefArray.js +374 -40
  404. package/dist/RefSubject/RefBigDecimal.d.ts +241 -21
  405. package/dist/RefSubject/RefBigDecimal.d.ts.map +1 -1
  406. package/dist/RefSubject/RefBigDecimal.js +229 -20
  407. package/dist/RefSubject/RefBigInt.d.ts +181 -16
  408. package/dist/RefSubject/RefBigInt.d.ts.map +1 -1
  409. package/dist/RefSubject/RefBigInt.js +169 -15
  410. package/dist/RefSubject/RefBoolean.d.ts +181 -16
  411. package/dist/RefSubject/RefBoolean.d.ts.map +1 -1
  412. package/dist/RefSubject/RefBoolean.js +169 -15
  413. package/dist/RefSubject/RefCause.d.ts +133 -12
  414. package/dist/RefSubject/RefCause.d.ts.map +1 -1
  415. package/dist/RefSubject/RefCause.js +121 -11
  416. package/dist/RefSubject/RefChunk.d.ts +481 -76
  417. package/dist/RefSubject/RefChunk.d.ts.map +1 -1
  418. package/dist/RefSubject/RefChunk.js +471 -75
  419. package/dist/RefSubject/RefDateTime.d.ts +137 -16
  420. package/dist/RefSubject/RefDateTime.d.ts.map +1 -1
  421. package/dist/RefSubject/RefDateTime.js +122 -12
  422. package/dist/RefSubject/RefDuration.d.ts +169 -15
  423. package/dist/RefSubject/RefDuration.d.ts.map +1 -1
  424. package/dist/RefSubject/RefDuration.js +157 -14
  425. package/dist/RefSubject/RefGraph.d.ts +349 -35
  426. package/dist/RefSubject/RefGraph.d.ts.map +1 -1
  427. package/dist/RefSubject/RefGraph.js +334 -32
  428. package/dist/RefSubject/RefHashMap.d.ts +323 -28
  429. package/dist/RefSubject/RefHashMap.d.ts.map +1 -1
  430. package/dist/RefSubject/RefHashMap.js +317 -29
  431. package/dist/RefSubject/RefHashRing.d.ts +159 -15
  432. package/dist/RefSubject/RefHashRing.d.ts.map +1 -1
  433. package/dist/RefSubject/RefHashRing.js +145 -12
  434. package/dist/RefSubject/RefHashSet.d.ts +251 -22
  435. package/dist/RefSubject/RefHashSet.d.ts.map +1 -1
  436. package/dist/RefSubject/RefHashSet.js +238 -20
  437. package/dist/RefSubject/RefIterable.d.ts +358 -32
  438. package/dist/RefSubject/RefIterable.d.ts.map +1 -1
  439. package/dist/RefSubject/RefIterable.js +350 -30
  440. package/dist/RefSubject/RefOption.d.ts +157 -14
  441. package/dist/RefSubject/RefOption.d.ts.map +1 -1
  442. package/dist/RefSubject/RefOption.js +145 -13
  443. package/dist/RefSubject/RefRecord.d.ts +402 -64
  444. package/dist/RefSubject/RefRecord.d.ts.map +1 -1
  445. package/dist/RefSubject/RefRecord.js +364 -39
  446. package/dist/RefSubject/RefResult.d.ts +167 -35
  447. package/dist/RefSubject/RefResult.d.ts.map +1 -1
  448. package/dist/RefSubject/RefResult.js +133 -12
  449. package/dist/RefSubject/RefString.d.ts +205 -18
  450. package/dist/RefSubject/RefString.d.ts.map +1 -1
  451. package/dist/RefSubject/RefString.js +193 -17
  452. package/dist/RefSubject/RefStruct.d.ts +169 -14
  453. package/dist/RefSubject/RefStruct.d.ts.map +1 -1
  454. package/dist/RefSubject/RefStruct.js +157 -13
  455. package/dist/RefSubject/RefSubject.d.ts +1242 -43
  456. package/dist/RefSubject/RefSubject.d.ts.map +1 -1
  457. package/dist/RefSubject/RefSubject.js +1012 -86
  458. package/dist/RefSubject/RefTrie.d.ts +323 -37
  459. package/dist/RefSubject/RefTrie.d.ts.map +1 -1
  460. package/dist/RefSubject/RefTrie.js +311 -31
  461. package/dist/RefSubject/RefTuple.d.ts +127 -11
  462. package/dist/RefSubject/RefTuple.d.ts.map +1 -1
  463. package/dist/RefSubject/RefTuple.js +114 -9
  464. package/dist/RefSubject/index.d.ts +1 -0
  465. package/dist/RefSubject/index.d.ts.map +1 -1
  466. package/dist/RefSubject/index.js +1 -0
  467. package/dist/RefSubject.d.ts +2 -1
  468. package/dist/RefSubject.d.ts.map +1 -1
  469. package/dist/RefSubject.js +2 -1
  470. package/dist/RefTrie.d.ts +2 -0
  471. package/dist/RefTrie.d.ts.map +1 -0
  472. package/dist/RefTrie.js +1 -0
  473. package/dist/RefTuple.d.ts +2 -0
  474. package/dist/RefTuple.d.ts.map +1 -0
  475. package/dist/RefTuple.js +1 -0
  476. package/dist/Sink/Sink.d.ts +396 -23
  477. package/dist/Sink/Sink.d.ts.map +1 -1
  478. package/dist/Sink/Sink.js +55 -7
  479. package/dist/Sink/combinators.d.ts +789 -3
  480. package/dist/Sink/combinators.d.ts.map +1 -1
  481. package/dist/Sink/combinators.js +812 -7
  482. package/dist/Subject/Subject.d.ts +1022 -27
  483. package/dist/Subject/Subject.d.ts.map +1 -1
  484. package/dist/Subject/Subject.js +909 -43
  485. package/dist/Versioned/Versioned.d.ts +475 -25
  486. package/dist/Versioned/Versioned.d.ts.map +1 -1
  487. package/dist/Versioned/Versioned.js +298 -46
  488. package/dist/index.d.ts +22 -3
  489. package/dist/index.d.ts.map +1 -1
  490. package/dist/index.js +22 -3
  491. package/package.json +125 -11
  492. package/dist/Fx/constructors/fromYieldable.d.ts +0 -12
  493. package/dist/Fx/constructors/fromYieldable.d.ts.map +0 -1
  494. package/dist/Fx/constructors/fromYieldable.js +0 -12
  495. package/src/Fx/Fx.ts +0 -164
  496. package/src/Fx/TypeId.ts +0 -25
  497. package/src/Fx/combinators/catch.ts +0 -165
  498. package/src/Fx/combinators/causes.ts +0 -23
  499. package/src/Fx/combinators/compact.ts +0 -15
  500. package/src/Fx/combinators/continueWith.ts +0 -78
  501. package/src/Fx/combinators/ensuring.ts +0 -23
  502. package/src/Fx/combinators/exhaustLatestMap.ts +0 -74
  503. package/src/Fx/combinators/exhaustLatestMapEffect.ts +0 -25
  504. package/src/Fx/combinators/exhaustMap.ts +0 -36
  505. package/src/Fx/combinators/exhaustMapEffect.ts +0 -23
  506. package/src/Fx/combinators/exit.ts +0 -15
  507. package/src/Fx/combinators/filter.ts +0 -22
  508. package/src/Fx/combinators/filterEffect.ts +0 -31
  509. package/src/Fx/combinators/filterMap.ts +0 -23
  510. package/src/Fx/combinators/filterMapEffect.ts +0 -32
  511. package/src/Fx/combinators/filterMapLoop.ts +0 -35
  512. package/src/Fx/combinators/filterMapLoopCause.ts +0 -36
  513. package/src/Fx/combinators/filterMapLoopCauseEffect.ts +0 -46
  514. package/src/Fx/combinators/filterMapLoopEffect.ts +0 -36
  515. package/src/Fx/combinators/flatMap.ts +0 -51
  516. package/src/Fx/combinators/flatMapConcurrently.ts +0 -36
  517. package/src/Fx/combinators/flatMapConcurrentlyEffect.ts +0 -26
  518. package/src/Fx/combinators/flatMapEffect.ts +0 -42
  519. package/src/Fx/combinators/flip.ts +0 -14
  520. package/src/Fx/combinators/gen.ts +0 -24
  521. package/src/Fx/combinators/genScoped.ts +0 -24
  522. package/src/Fx/combinators/index.ts +0 -51
  523. package/src/Fx/combinators/keyed.ts +0 -369
  524. package/src/Fx/combinators/loop.ts +0 -27
  525. package/src/Fx/combinators/loopCause.ts +0 -34
  526. package/src/Fx/combinators/loopCauseEffect.ts +0 -36
  527. package/src/Fx/combinators/loopEffect.ts +0 -34
  528. package/src/Fx/combinators/map.ts +0 -22
  529. package/src/Fx/combinators/mapEffect.ts +0 -32
  530. package/src/Fx/combinators/mergeAll.ts +0 -22
  531. package/src/Fx/combinators/mergeOrdered.ts +0 -123
  532. package/src/Fx/combinators/onError.ts +0 -40
  533. package/src/Fx/combinators/onExit.ts +0 -82
  534. package/src/Fx/combinators/onInterrupt.ts +0 -87
  535. package/src/Fx/combinators/provide.ts +0 -62
  536. package/src/Fx/combinators/skip.ts +0 -20
  537. package/src/Fx/combinators/skipRepeats.ts +0 -15
  538. package/src/Fx/combinators/skipRepeatsWith.ts +0 -40
  539. package/src/Fx/combinators/slice.ts +0 -32
  540. package/src/Fx/combinators/switchMap.ts +0 -55
  541. package/src/Fx/combinators/switchMapEffect.ts +0 -25
  542. package/src/Fx/combinators/take.ts +0 -17
  543. package/src/Fx/combinators/takeUntil.ts +0 -50
  544. package/src/Fx/combinators/tapEffect.ts +0 -39
  545. package/src/Fx/combinators/tuple.ts +0 -79
  546. package/src/Fx/combinators/unwrap.ts +0 -21
  547. package/src/Fx/combinators/unwrapScoped.ts +0 -26
  548. package/src/Fx/combinators/when.ts +0 -64
  549. package/src/Fx/combinators/withSpan.ts +0 -24
  550. package/src/Fx/constructors/at.ts +0 -23
  551. package/src/Fx/constructors/die.ts +0 -17
  552. package/src/Fx/constructors/empty.ts +0 -10
  553. package/src/Fx/constructors/fail.ts +0 -14
  554. package/src/Fx/constructors/failCause.ts +0 -14
  555. package/src/Fx/constructors/fn.ts +0 -245
  556. package/src/Fx/constructors/fromEffect.ts +0 -24
  557. package/src/Fx/constructors/fromFailures.ts +0 -19
  558. package/src/Fx/constructors/fromIterable.ts +0 -15
  559. package/src/Fx/constructors/fromSchedule.ts +0 -18
  560. package/src/Fx/constructors/fromYieldable.ts +0 -17
  561. package/src/Fx/constructors/index.ts +0 -15
  562. package/src/Fx/constructors/interrupt.ts +0 -13
  563. package/src/Fx/constructors/make.ts +0 -103
  564. package/src/Fx/constructors/periodic.ts +0 -15
  565. package/src/Fx/constructors/succeed.ts +0 -37
  566. package/src/Fx/constructors/suspend.ts +0 -6
  567. package/src/Fx/index.ts +0 -6
  568. package/src/Fx/internal/DeferredRef.ts +0 -87
  569. package/src/Fx/internal/UnionToTuple.ts +0 -12
  570. package/src/Fx/internal/diff.ts +0 -191
  571. package/src/Fx/internal/equivalence.ts +0 -12
  572. package/src/Fx/internal/multicast.ts +0 -51
  573. package/src/Fx/internal/ring-buffer.ts +0 -60
  574. package/src/Fx/internal/scope.ts +0 -58
  575. package/src/Fx/internal/yieldable.ts +0 -31
  576. package/src/Fx/run/collect.ts +0 -79
  577. package/src/Fx/run/first.ts +0 -20
  578. package/src/Fx/run/fork.ts +0 -40
  579. package/src/Fx/run/index.ts +0 -5
  580. package/src/Fx/run/observe.ts +0 -114
  581. package/src/Fx/run/runPromise.ts +0 -32
  582. package/src/Fx/stream.ts +0 -42
  583. package/src/Fx.catch.test.ts +0 -61
  584. package/src/Fx.fn.test.ts +0 -51
  585. package/src/Fx.lifecycle.test.ts +0 -80
  586. package/src/Fx.test.ts +0 -71
  587. package/src/Fx.ts +0 -1
  588. package/src/Push/Push.ts +0 -903
  589. package/src/Push/index.ts +0 -1
  590. package/src/Push.test.ts +0 -26
  591. package/src/Push.ts +0 -1
  592. package/src/RefSubject/RefArray.ts +0 -512
  593. package/src/RefSubject/RefBigDecimal.test.ts +0 -56
  594. package/src/RefSubject/RefBigDecimal.ts +0 -295
  595. package/src/RefSubject/RefBigInt.test.ts +0 -56
  596. package/src/RefSubject/RefBigInt.ts +0 -189
  597. package/src/RefSubject/RefBoolean.test.ts +0 -57
  598. package/src/RefSubject/RefBoolean.ts +0 -185
  599. package/src/RefSubject/RefCause.test.ts +0 -53
  600. package/src/RefSubject/RefCause.ts +0 -146
  601. package/src/RefSubject/RefChunk.ts +0 -510
  602. package/src/RefSubject/RefDateTime.test.ts +0 -43
  603. package/src/RefSubject/RefDateTime.ts +0 -264
  604. package/src/RefSubject/RefDuration.test.ts +0 -49
  605. package/src/RefSubject/RefDuration.ts +0 -188
  606. package/src/RefSubject/RefGraph.ts +0 -650
  607. package/src/RefSubject/RefHashMap.ts +0 -465
  608. package/src/RefSubject/RefHashRing.ts +0 -262
  609. package/src/RefSubject/RefHashSet.ts +0 -308
  610. package/src/RefSubject/RefIterable.ts +0 -445
  611. package/src/RefSubject/RefOption.test.ts +0 -67
  612. package/src/RefSubject/RefOption.ts +0 -193
  613. package/src/RefSubject/RefRecord.ts +0 -612
  614. package/src/RefSubject/RefResult.test.ts +0 -63
  615. package/src/RefSubject/RefResult.ts +0 -209
  616. package/src/RefSubject/RefString.test.ts +0 -61
  617. package/src/RefSubject/RefString.ts +0 -256
  618. package/src/RefSubject/RefStruct.test.ts +0 -60
  619. package/src/RefSubject/RefStruct.ts +0 -253
  620. package/src/RefSubject/RefSubject.ts +0 -2545
  621. package/src/RefSubject/RefTrie.ts +0 -356
  622. package/src/RefSubject/RefTuple.test.ts +0 -60
  623. package/src/RefSubject/RefTuple.ts +0 -231
  624. package/src/RefSubject/index.ts +0 -21
  625. package/src/RefSubject.test.ts +0 -65
  626. package/src/RefSubject.ts +0 -1
  627. package/src/Sink/Sink.ts +0 -159
  628. package/src/Sink/combinators.ts +0 -993
  629. package/src/Sink/index.ts +0 -2
  630. package/src/Sink.ts +0 -1
  631. package/src/Subject/Subject.ts +0 -441
  632. package/src/Subject/index.ts +0 -1
  633. package/src/Subject.test.ts +0 -47
  634. package/src/Subject.ts +0 -1
  635. package/src/Versioned/Versioned.ts +0 -521
  636. package/src/Versioned/index.ts +0 -1
  637. package/src/Versioned.test.ts +0 -23
  638. package/src/Versioned.ts +0 -1
  639. package/src/index.ts +0 -7
  640. package/tsconfig.json +0 -6
@@ -5,10 +5,26 @@ import { make } from "../constructors/make.js";
5
5
  /**
6
6
  * Performs an effect for each element of the Fx, without changing the elements.
7
7
  *
8
+ * @remarks
9
+ * ## Why
10
+ * `tap` sequences an observation or side effect before forwarding each original value. It emits
11
+ * exactly once per successful callback, in source order; callback failure prevents that value.
12
+ *
13
+ * ## Ownership and lifetime
14
+ * Returned Effects run in the consumer path and are interrupted with it; a `void` callback is
15
+ * treated as `Effect.void`. Callback failures and services remain visible in the result type.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { Effect } from "effect"
20
+ * import { Fx } from "@typed/fx"
21
+ * const logged = Fx.fromIterable([1, 2]).pipe(Fx.tap((n) => Effect.log(n)))
22
+ * ```
23
+ *
8
24
  * @param f - An effectful function to apply to each element.
9
25
  * @returns An `Fx` that emits the original elements.
10
26
  * @since 1.0.0
11
- * @category combinators
27
+ * @category Transforming values
12
28
  */
13
29
  export const tap = dual(2, (self, f) => make((sink) => self.run(sinkCore.tapEffect(sink, (a) => {
14
30
  const x = f(a);
@@ -0,0 +1,79 @@
1
+ import { Duration, Scope } from "effect";
2
+ import type { Fx } from "../Fx.js";
3
+ /**
4
+ * Options for {@link throttle}. A duration-only call is leading-edge
5
+ * (`{ leading: true, trailing: false }`).
6
+ *
7
+ * @remarks
8
+ * ## Why
9
+ *
10
+ * Leading and trailing edges answer different interaction needs, so the
11
+ * window policy is explicit rather than hidden behind separate operators.
12
+ *
13
+ * ## Ownership and lifetime
14
+ *
15
+ * This immutable value owns no resource. `throttle` reads it when constructing
16
+ * the Fx; the resulting subscription owns the timer and pending value.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * import type { ThrottleOptions } from "@typed/fx/Fx"
21
+ *
22
+ * const options: ThrottleOptions = {
23
+ * duration: "250 millis",
24
+ * leading: true,
25
+ * trailing: true
26
+ * }
27
+ * ```
28
+ *
29
+ * @since 1.0.0
30
+ * @category Operator options
31
+ */
32
+ export type ThrottleOptions = {
33
+ readonly duration: Duration.Input;
34
+ readonly leading?: boolean | undefined;
35
+ readonly trailing?: boolean | undefined;
36
+ };
37
+ /**
38
+ * Limits emissions to configured leading and trailing edges of fixed windows.
39
+ *
40
+ * Pass `{ duration, leading, trailing }` for trailing or both-edge behavior.
41
+ * A duration alone defaults to `{ leading: true, trailing: false }`.
42
+ *
43
+ * @remarks
44
+ * ## Why
45
+ *
46
+ * Throttling bounds push frequency while allowing immediate feedback, a final
47
+ * settled value, or both, without moving timing state outside the Fx graph.
48
+ *
49
+ * ## Ownership and lifetime
50
+ *
51
+ * The first value opens a window. Leading mode emits it immediately. Values
52
+ * arriving while open replace one pending latest value; trailing mode emits
53
+ * that value when the timer closes, except that both-edge mode does not repeat
54
+ * the first value unless another arrived. Windows never overlap. Source errors
55
+ * propagate, source completion waits for the active window, and interruption
56
+ * stops the scoped timer and discards pending state.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * import { throttle } from "@typed/fx/Fx"
61
+ * import { fromIterable } from "@typed/fx/Fx"
62
+ *
63
+ * const bounded = throttle(fromIterable([1, 2, 3]), {
64
+ * duration: "250 millis",
65
+ * leading: true,
66
+ * trailing: true
67
+ * })
68
+ * ```
69
+ *
70
+ * @since 1.0.0
71
+ * @category Time and rate
72
+ */
73
+ export declare const throttle: {
74
+ (duration: Duration.Input): <A, E, R>(fx: Fx<A, E, R>) => Fx<A, E, R | Scope.Scope>;
75
+ (options: ThrottleOptions): <A, E, R>(fx: Fx<A, E, R>) => Fx<A, E, R | Scope.Scope>;
76
+ <A, E, R>(fx: Fx<A, E, R>, duration: Duration.Input): Fx<A, E, R | Scope.Scope>;
77
+ <A, E, R>(fx: Fx<A, E, R>, options: ThrottleOptions): Fx<A, E, R | Scope.Scope>;
78
+ };
79
+ //# sourceMappingURL=throttle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../../src/Fx/combinators/throttle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAOjD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAKnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACzC,CAAC;AAsEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,QAAQ,EAAE;IACrB,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC,OAAO,EAAE,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;CAoBjF,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { Duration, Effect } from "effect";
2
+ import * as FiberHandle from "effect/FiberHandle";
3
+ import { dual } from "effect/Function";
4
+ import * as Option from "effect/Option";
5
+ import * as Ref from "effect/Ref";
6
+ import { make as makeSink } from "../../Sink/Sink.js";
7
+ import { make } from "../constructors/make.js";
8
+ import { isFx } from "../TypeId.js";
9
+ import { exhaustMap } from "./exhaustMap.js";
10
+ import { extendScope } from "../internal/scope.js";
11
+ const isOptions = (u) => typeof u === "object" && u !== null && "duration" in u && !Duration.isDuration(u);
12
+ const resolve = (durationOrOptions) => {
13
+ if (isOptions(durationOrOptions)) {
14
+ return {
15
+ duration: durationOrOptions.duration,
16
+ leading: durationOrOptions.leading ?? true,
17
+ trailing: durationOrOptions.trailing ?? false,
18
+ };
19
+ }
20
+ return { duration: durationOrOptions, leading: true, trailing: false };
21
+ };
22
+ const throttleWindow = (fx, duration, leading, trailing) => make(Effect.fn(function* (sink) {
23
+ const open = yield* Ref.make(false);
24
+ const pending = yield* Ref.make(Option.none());
25
+ const extra = yield* Ref.make(false);
26
+ const window = yield* FiberHandle.make();
27
+ const closeWindow = Effect.gen(function* () {
28
+ const hadExtra = yield* Ref.get(extra);
29
+ const shouldEmit = trailing && (!leading || hadExtra) ? yield* Ref.get(pending) : Option.none();
30
+ yield* Ref.set(open, false);
31
+ yield* Ref.set(pending, Option.none());
32
+ yield* Ref.set(extra, false);
33
+ if (Option.isSome(shouldEmit)) {
34
+ yield* sink.onSuccess(shouldEmit.value);
35
+ }
36
+ });
37
+ yield* fx.run(makeSink(sink.onFailure, (a) => Effect.gen(function* () {
38
+ const isOpen = yield* Ref.get(open);
39
+ if (!isOpen) {
40
+ yield* Ref.set(open, true);
41
+ yield* Ref.set(pending, Option.some(a));
42
+ yield* Ref.set(extra, false);
43
+ if (leading) {
44
+ yield* sink.onSuccess(a);
45
+ }
46
+ yield* FiberHandle.run(window, Effect.sleep(duration).pipe(Effect.andThen(closeWindow)));
47
+ return;
48
+ }
49
+ yield* Ref.set(pending, Option.some(a));
50
+ yield* Ref.set(extra, true);
51
+ })));
52
+ yield* FiberHandle.awaitEmpty(window);
53
+ }, extendScope));
54
+ /**
55
+ * Limits emissions to configured leading and trailing edges of fixed windows.
56
+ *
57
+ * Pass `{ duration, leading, trailing }` for trailing or both-edge behavior.
58
+ * A duration alone defaults to `{ leading: true, trailing: false }`.
59
+ *
60
+ * @remarks
61
+ * ## Why
62
+ *
63
+ * Throttling bounds push frequency while allowing immediate feedback, a final
64
+ * settled value, or both, without moving timing state outside the Fx graph.
65
+ *
66
+ * ## Ownership and lifetime
67
+ *
68
+ * The first value opens a window. Leading mode emits it immediately. Values
69
+ * arriving while open replace one pending latest value; trailing mode emits
70
+ * that value when the timer closes, except that both-edge mode does not repeat
71
+ * the first value unless another arrived. Windows never overlap. Source errors
72
+ * propagate, source completion waits for the active window, and interruption
73
+ * stops the scoped timer and discards pending state.
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * import { throttle } from "@typed/fx/Fx"
78
+ * import { fromIterable } from "@typed/fx/Fx"
79
+ *
80
+ * const bounded = throttle(fromIterable([1, 2, 3]), {
81
+ * duration: "250 millis",
82
+ * leading: true,
83
+ * trailing: true
84
+ * })
85
+ * ```
86
+ *
87
+ * @since 1.0.0
88
+ * @category Time and rate
89
+ */
90
+ export const throttle = dual((args) => isFx(args[0]), (fx, durationOrOptions) => {
91
+ const { duration, leading, trailing } = resolve(durationOrOptions);
92
+ if (leading && !trailing) {
93
+ return exhaustMap(fx, (a) => make(Effect.fn(function* (sink) {
94
+ yield* sink.onSuccess(a);
95
+ yield* Effect.sleep(duration);
96
+ })));
97
+ }
98
+ return throttleWindow(fx, duration, leading, trailing);
99
+ });
@@ -0,0 +1,76 @@
1
+ import * as Duration from "effect/Duration";
2
+ import type * as Scope from "effect/Scope";
3
+ import type { Fx } from "../Fx.js";
4
+ /**
5
+ * Completes the stream if it does not produce a value (or complete) within
6
+ * `duration` of the previous event. Matches Effect `Stream.timeout`.
7
+ *
8
+ * The timeout is reset after each emission. An infinite duration is a no-op;
9
+ * a zero duration completes immediately.
10
+ *
11
+ * @remarks
12
+ * ## Why
13
+ *
14
+ * Silence is meaningful in push systems. This operator turns an idle period
15
+ * into normal completion without inventing an error type.
16
+ *
17
+ * ## Ownership and lifetime
18
+ *
19
+ * Subscription starts the source and one scoped timer. Each delivered value
20
+ * forwards immediately and rearms the timer. If the timer wins, it interrupts
21
+ * the source and the result completes; the interrupt caused by that timeout is
22
+ * not forwarded. Source failure before the deadline propagates. Interruption
23
+ * clears both source fiber and timer. Infinite duration returns the source;
24
+ * zero duration never starts it.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * import { timeout } from "@typed/fx/Fx"
29
+ * import { periodic } from "@typed/fx/Fx"
30
+ *
31
+ * const bounded = timeout(periodic("1 second"), "250 millis")
32
+ * ```
33
+ *
34
+ * @since 1.0.0
35
+ * @category Time and rate
36
+ */
37
+ export declare const timeout: {
38
+ (duration: Duration.Input): <A, E, R>(self: Fx<A, E, R>) => Fx<A, E, R | Scope.Scope>;
39
+ <A, E, R>(self: Fx<A, E, R>, duration: Duration.Input): Fx<A, E, R | Scope.Scope>;
40
+ };
41
+ /**
42
+ * Switches to `fallback` if the source does not produce a value within
43
+ * `duration` of the previous event. Matches Effect `Stream.timeoutOrElse`
44
+ * and RxJS `timeoutTo`.
45
+ *
46
+ * @remarks
47
+ * ## Why
48
+ *
49
+ * A fallback lets an idle producer hand ownership to another push source while
50
+ * preserving both sources' precise values, failures, and services.
51
+ *
52
+ * ## Ownership and lifetime
53
+ *
54
+ * The source and resettable timer start first. On timeout the source is
55
+ * interrupted, then one fallback subscription starts; the two producers never
56
+ * overlap. A source failure before timeout propagates and does not start the
57
+ * fallback. Interruption stops the active producer and timer. Infinite duration
58
+ * returns the source unchanged; zero duration returns the fallback without
59
+ * starting the source.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * import { timeoutTo } from "@typed/fx/Fx"
64
+ * import { periodic, succeed } from "@typed/fx/Fx"
65
+ *
66
+ * const available = timeoutTo(periodic("1 second"), "250 millis", succeed("offline"))
67
+ * ```
68
+ *
69
+ * @since 1.0.0
70
+ * @category Time and rate
71
+ */
72
+ export declare const timeoutTo: {
73
+ <B, E2, R2>(duration: Duration.Input, fallback: Fx<B, E2, R2>): <A, E, R>(self: Fx<A, E, R>) => Fx<A | B, E | E2, R | R2 | Scope.Scope>;
74
+ <A, E, R, B, E2, R2>(self: Fx<A, E, R>, duration: Duration.Input, fallback: Fx<B, E2, R2>): Fx<A | B, E | E2, R | R2 | Scope.Scope>;
75
+ };
76
+ //# sourceMappingURL=timeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../../src/Fx/combinators/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAM5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAI3C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AA6CnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,OAAO,EAAE;IACpB,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACtF,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;CAMlF,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,SAAS,EAAE;IACtB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EACR,QAAQ,EAAE,QAAQ,CAAC,KAAK,EACxB,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GACtB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EACjB,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACjB,QAAQ,EAAE,QAAQ,CAAC,KAAK,EACxB,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GACtB,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;CAa5C,CAAC"}
@@ -0,0 +1,110 @@
1
+ import * as Duration from "effect/Duration";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Fiber from "effect/Fiber";
4
+ import * as FiberHandle from "effect/FiberHandle";
5
+ import { dual } from "effect/Function";
6
+ import * as Ref from "effect/Ref";
7
+ import { make as makeSink } from "../../Sink/Sink.js";
8
+ import { empty } from "../constructors/empty.js";
9
+ import { make } from "../constructors/make.js";
10
+ import { extendScope } from "../internal/scope.js";
11
+ const runTimed = (self, duration, fallback) => make(Effect.fn(function* (sink) {
12
+ const timedOut = yield* Ref.make(false);
13
+ const sourceFiber = yield* Ref.make(null);
14
+ const timer = yield* FiberHandle.make();
15
+ const onTimeout = Effect.gen(function* () {
16
+ yield* Ref.set(timedOut, true);
17
+ const fiber = yield* Ref.get(sourceFiber);
18
+ if (fiber)
19
+ yield* Fiber.interrupt(fiber);
20
+ });
21
+ const arm = FiberHandle.run(timer, Effect.sleep(duration).pipe(Effect.andThen(onTimeout)));
22
+ const fiber = yield* Effect.forkChild(self.run(makeSink((cause) => Effect.flatMap(Ref.get(timedOut), (didTimeout) => didTimeout ? Effect.void : sink.onFailure(cause)), (a) => sink.onSuccess(a).pipe(Effect.andThen(arm)))));
23
+ yield* Ref.set(sourceFiber, fiber);
24
+ yield* arm;
25
+ yield* Fiber.join(fiber).pipe(Effect.catchCause(() => Effect.void));
26
+ yield* FiberHandle.clear(timer);
27
+ if ((yield* Ref.get(timedOut)) && fallback !== undefined) {
28
+ yield* fallback.run(sink);
29
+ }
30
+ }, extendScope));
31
+ /**
32
+ * Completes the stream if it does not produce a value (or complete) within
33
+ * `duration` of the previous event. Matches Effect `Stream.timeout`.
34
+ *
35
+ * The timeout is reset after each emission. An infinite duration is a no-op;
36
+ * a zero duration completes immediately.
37
+ *
38
+ * @remarks
39
+ * ## Why
40
+ *
41
+ * Silence is meaningful in push systems. This operator turns an idle period
42
+ * into normal completion without inventing an error type.
43
+ *
44
+ * ## Ownership and lifetime
45
+ *
46
+ * Subscription starts the source and one scoped timer. Each delivered value
47
+ * forwards immediately and rearms the timer. If the timer wins, it interrupts
48
+ * the source and the result completes; the interrupt caused by that timeout is
49
+ * not forwarded. Source failure before the deadline propagates. Interruption
50
+ * clears both source fiber and timer. Infinite duration returns the source;
51
+ * zero duration never starts it.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * import { timeout } from "@typed/fx/Fx"
56
+ * import { periodic } from "@typed/fx/Fx"
57
+ *
58
+ * const bounded = timeout(periodic("1 second"), "250 millis")
59
+ * ```
60
+ *
61
+ * @since 1.0.0
62
+ * @category Time and rate
63
+ */
64
+ export const timeout = dual(2, (self, duration) => {
65
+ const d = Duration.fromInputUnsafe(duration);
66
+ if (!Duration.isFinite(d))
67
+ return self;
68
+ if (Duration.isZero(d))
69
+ return empty;
70
+ return runTimed(self, d, undefined);
71
+ });
72
+ /**
73
+ * Switches to `fallback` if the source does not produce a value within
74
+ * `duration` of the previous event. Matches Effect `Stream.timeoutOrElse`
75
+ * and RxJS `timeoutTo`.
76
+ *
77
+ * @remarks
78
+ * ## Why
79
+ *
80
+ * A fallback lets an idle producer hand ownership to another push source while
81
+ * preserving both sources' precise values, failures, and services.
82
+ *
83
+ * ## Ownership and lifetime
84
+ *
85
+ * The source and resettable timer start first. On timeout the source is
86
+ * interrupted, then one fallback subscription starts; the two producers never
87
+ * overlap. A source failure before timeout propagates and does not start the
88
+ * fallback. Interruption stops the active producer and timer. Infinite duration
89
+ * returns the source unchanged; zero duration returns the fallback without
90
+ * starting the source.
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * import { timeoutTo } from "@typed/fx/Fx"
95
+ * import { periodic, succeed } from "@typed/fx/Fx"
96
+ *
97
+ * const available = timeoutTo(periodic("1 second"), "250 millis", succeed("offline"))
98
+ * ```
99
+ *
100
+ * @since 1.0.0
101
+ * @category Time and rate
102
+ */
103
+ export const timeoutTo = dual(3, (self, duration, fallback) => {
104
+ const d = Duration.fromInputUnsafe(duration);
105
+ if (!Duration.isFinite(d))
106
+ return self;
107
+ if (Duration.isZero(d))
108
+ return fallback;
109
+ return runTimed(self, d, fallback);
110
+ });
@@ -4,10 +4,25 @@ import type { Fx } from "../Fx.js";
4
4
  * The resulting Fx waits for all input streams to emit at least once before emitting the first tuple.
5
5
  * Afterwards, it emits a new tuple whenever any input stream emits a new value.
6
6
  *
7
+ * @remarks
8
+ * ## Why
9
+ * `tuple` combines independent push sources by latest value while retaining their positional types.
10
+ * It emits nothing until every source has produced once, then emits a snapshot after any update.
11
+ *
12
+ * ## Ownership and lifetime
13
+ * All inputs run concurrently as children of the consumer and one latest value per input is retained
14
+ * for that run. Failure/interruption stops the group; normal completion waits for every input.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { Fx } from "@typed/fx"
19
+ * const point = Fx.tuple(Fx.succeed(10), Fx.succeed(20))
20
+ * ```
21
+ *
7
22
  * @param fxs - The Fx streams to combine.
8
23
  * @returns An `Fx` emitting tuples of values.
9
24
  * @since 1.0.0
10
- * @category combinators
25
+ * @category Combining sources
11
26
  */
12
27
  export declare function tuple<FX extends ReadonlyArray<Fx<any, any, any>>>(...fxs: FX): Fx<{
13
28
  readonly [K in keyof FX]: Fx.Success<FX[K]>;
@@ -16,10 +31,25 @@ export declare function tuple<FX extends ReadonlyArray<Fx<any, any, any>>>(...fx
16
31
  * Combines a record of Fx streams into a single Fx that emits a record of the latest values.
17
32
  * Similar to `tuple`, but for objects.
18
33
  *
34
+ * @remarks
35
+ * ## Why
36
+ * `struct` gives latest-value combination stable field names. It waits for every field once and
37
+ * then emits a new immutable record when any field source updates.
38
+ *
39
+ * ## Ownership and lifetime
40
+ * It delegates concurrent ownership and retained latest values to `tuple`. Input failures and
41
+ * services are unioned, and all runs end with the consuming Fx.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * import { Fx } from "@typed/fx"
46
+ * const user = Fx.struct({ name: Fx.succeed("Ada"), online: Fx.succeed(true) })
47
+ * ```
48
+ *
19
49
  * @param fxs - A record of Fx streams.
20
50
  * @returns An `Fx` emitting records of values.
21
51
  * @since 1.0.0
22
- * @category combinators
52
+ * @category Combining sources
23
53
  */
24
54
  export declare function struct<FXS extends Readonly<Record<string, Fx<any, any, any>>>>(fxs: FXS): Fx<{
25
55
  readonly [K in keyof FXS]: Fx.Success<FXS[K]>;
@@ -1 +1 @@
1
- {"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../../src/Fx/combinators/tuple.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAGnC;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAC/D,GAAG,GAAG,EAAE,EAAE,GACT,EAAE,CACH;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CAAE,EAC/C,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EACpB,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CACxB,CA+BA;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,GAAG,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAC5E,GAAG,EAAE,GAAG,GACP,EAAE,CACH;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,EACjD,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EACxB,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAC5B,CAOA"}
1
+ {"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../../src/Fx/combinators/tuple.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAGnC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAC/D,GAAG,GAAG,EAAE,EAAE,GACT,EAAE,CACH;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CAAE,EAC/C,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EACpB,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CACxB,CAiCA;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,MAAM,CAAC,GAAG,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAC5E,GAAG,EAAE,GAAG,GACP,EAAE,CACH;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,EACjD,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EACxB,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAC5B,CAOA"}
@@ -8,16 +8,32 @@ import { map } from "./map.js";
8
8
  * The resulting Fx waits for all input streams to emit at least once before emitting the first tuple.
9
9
  * Afterwards, it emits a new tuple whenever any input stream emits a new value.
10
10
  *
11
+ * @remarks
12
+ * ## Why
13
+ * `tuple` combines independent push sources by latest value while retaining their positional types.
14
+ * It emits nothing until every source has produced once, then emits a snapshot after any update.
15
+ *
16
+ * ## Ownership and lifetime
17
+ * All inputs run concurrently as children of the consumer and one latest value per input is retained
18
+ * for that run. Failure/interruption stops the group; normal completion waits for every input.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import { Fx } from "@typed/fx"
23
+ * const point = Fx.tuple(Fx.succeed(10), Fx.succeed(20))
24
+ * ```
25
+ *
11
26
  * @param fxs - The Fx streams to combine.
12
27
  * @returns An `Fx` emitting tuples of values.
13
28
  * @since 1.0.0
14
- * @category combinators
29
+ * @category Combining sources
15
30
  */
16
31
  export function tuple(...fxs) {
17
32
  if (fxs.length === 0)
18
33
  return succeed([]);
19
- if (fxs.length === 1)
20
- return fxs[0];
34
+ if (fxs.length === 1) {
35
+ return map(fxs[0], (value) => [value]);
36
+ }
21
37
  return make(Effect.fn(function* (sink) {
22
38
  const len = fxs.length;
23
39
  // oxlint-disable-next-line unicorn/no-new-array
@@ -27,7 +43,7 @@ export function tuple(...fxs) {
27
43
  result[i] = value;
28
44
  filled.add(i);
29
45
  if (filled.size === len) {
30
- yield* sink.onSuccess(result);
46
+ yield* sink.onSuccess(result.slice(0));
31
47
  }
32
48
  }))), { concurrency: "unbounded", discard: true });
33
49
  }));
@@ -36,10 +52,25 @@ export function tuple(...fxs) {
36
52
  * Combines a record of Fx streams into a single Fx that emits a record of the latest values.
37
53
  * Similar to `tuple`, but for objects.
38
54
  *
55
+ * @remarks
56
+ * ## Why
57
+ * `struct` gives latest-value combination stable field names. It waits for every field once and
58
+ * then emits a new immutable record when any field source updates.
59
+ *
60
+ * ## Ownership and lifetime
61
+ * It delegates concurrent ownership and retained latest values to `tuple`. Input failures and
62
+ * services are unioned, and all runs end with the consuming Fx.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * import { Fx } from "@typed/fx"
67
+ * const user = Fx.struct({ name: Fx.succeed("Ada"), online: Fx.succeed(true) })
68
+ * ```
69
+ *
39
70
  * @param fxs - A record of Fx streams.
40
71
  * @returns An `Fx` emitting records of values.
41
72
  * @since 1.0.0
42
- * @category combinators
73
+ * @category Combining sources
43
74
  */
44
75
  export function struct(fxs) {
45
76
  return map(tuple(...Object.entries(fxs).map(([key, fx]) => map(fx, (value) => [key, value]))), Object.fromEntries);
@@ -0,0 +1,27 @@
1
+ import type { Fx } from "../Fx.js";
2
+ /**
3
+ * Forwards `events` until `signal` emits, then interrupts `events`.
4
+ *
5
+ * @remarks
6
+ * ## Why
7
+ * `until` gives an event source an external stop boundary. Event values retain their order until
8
+ * the first signal; the signal itself is not emitted and the event run then completes by interruption.
9
+ *
10
+ * ## Ownership and lifetime
11
+ * Both sources start behind one gate in a private Scope. Event completion cancels the signal;
12
+ * signaling cancels events; failures are forwarded unless they are the expected cancellation.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { Fx } from "@typed/fx"
17
+ * const bounded = Fx.until(Fx.fromIterable([1, 2, 3]), Fx.succeed("stop"))
18
+ * ```
19
+ *
20
+ * @since 1.0.0
21
+ * @category Time and rate
22
+ */
23
+ export declare const until: {
24
+ <B, E2, R2>(signal: Fx<B, E2, R2>): <A, E, R>(events: Fx<A, E, R>) => Fx<A, E | E2, R | R2>;
25
+ <A, E, R, B, E2, R2>(events: Fx<A, E, R>, signal: Fx<B, E2, R2>): Fx<A, E | E2, R | R2>;
26
+ };
27
+ //# sourceMappingURL=until.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"until.d.ts","sourceRoot":"","sources":["../../../src/Fx/combinators/until.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAInC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,KAAK,EAAE;IAClB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;CAmEzF,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { Cause, Deferred, Effect, Exit, Fiber, Ref, Scope } from "effect";
2
+ import { dual } from "effect/Function";
3
+ import { make } from "../constructors/make.js";
4
+ import { observe } from "../run/observe.js";
5
+ import { take } from "./take.js";
6
+ /**
7
+ * Forwards `events` until `signal` emits, then interrupts `events`.
8
+ *
9
+ * @remarks
10
+ * ## Why
11
+ * `until` gives an event source an external stop boundary. Event values retain their order until
12
+ * the first signal; the signal itself is not emitted and the event run then completes by interruption.
13
+ *
14
+ * ## Ownership and lifetime
15
+ * Both sources start behind one gate in a private Scope. Event completion cancels the signal;
16
+ * signaling cancels events; failures are forwarded unless they are the expected cancellation.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * import { Fx } from "@typed/fx"
21
+ * const bounded = Fx.until(Fx.fromIterable([1, 2, 3]), Fx.succeed("stop"))
22
+ * ```
23
+ *
24
+ * @since 1.0.0
25
+ * @category Time and rate
26
+ */
27
+ export const until = dual(2, (events, signal) => make(Effect.fn(function* (sink) {
28
+ const scope = yield* Scope.make();
29
+ const cancellingSignal = yield* Ref.make(false);
30
+ yield* Effect.gen(function* () {
31
+ const startupGate = yield* Deferred.make();
32
+ const eventsFiberRef = yield* Ref.make(null);
33
+ const signaled = yield* Ref.make(false);
34
+ const stopEvents = Effect.uninterruptible(Effect.gen(function* () {
35
+ yield* Ref.set(signaled, true);
36
+ const eventsFiber = yield* Ref.get(eventsFiberRef);
37
+ if (eventsFiber !== null)
38
+ yield* Fiber.interrupt(eventsFiber);
39
+ }));
40
+ const signalFiber = yield* Effect.forkIn(Deferred.await(startupGate).pipe(Effect.andThen(signal.pipe(take(1), observe(() => stopEvents))), Effect.catchCause((cause) => Effect.flatMap(Ref.get(cancellingSignal), (didCancelSignal) => didCancelSignal
41
+ ? Effect.failCause(cause)
42
+ : Effect.uninterruptible(sink.onFailure(cause).pipe(Effect.andThen(stopEvents)))))), scope);
43
+ const eventsFiber = yield* Effect.forkIn(Deferred.await(startupGate).pipe(Effect.andThen(events.run(sink))), scope);
44
+ yield* Ref.set(eventsFiberRef, eventsFiber);
45
+ yield* Deferred.succeed(startupGate, undefined);
46
+ const eventsExit = yield* Fiber.await(eventsFiber);
47
+ yield* Ref.set(cancellingSignal, true);
48
+ yield* Fiber.interrupt(signalFiber);
49
+ if (Exit.isFailure(eventsExit)) {
50
+ const didSignal = yield* Ref.get(signaled);
51
+ if (!(didSignal && Cause.hasInterruptsOnly(eventsExit.cause))) {
52
+ return yield* Effect.failCause(eventsExit.cause);
53
+ }
54
+ }
55
+ }).pipe(Effect.onExit((exit) => Ref.set(cancellingSignal, true).pipe(Effect.andThen(Scope.close(scope, exit)))));
56
+ })));
@@ -3,10 +3,39 @@ import type { Fx } from "../Fx.js";
3
3
  /**
4
4
  * Unwraps an Effect that produces an Fx into a single Fx.
5
5
  *
6
+ * @remarks
7
+ * ## Why
8
+ *
9
+ * `unwrap` defers choosing or acquiring a producer until observation, while
10
+ * keeping the Effect and the selected Fx in one typed push pipeline.
11
+ *
12
+ * ## Execution and cardinality
13
+ *
14
+ * Each observation runs `effect` once. On success, the produced Fx is observed
15
+ * and all of its values are forwarded in order. The acquisition Effect itself
16
+ * emits no value, and the inner is never started if acquisition fails.
17
+ *
18
+ * ## Ownership and lifetime
19
+ *
20
+ * Acquisition and inner failures are forwarded and both environments remain in
21
+ * the returned type. `unwrap` does not create a Scope or hide one: interruption
22
+ * stops whichever phase is active, and any resourceful Effect or inner Fx must
23
+ * expose and receive its own `Scope` requirement.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { Fx } from "@typed/fx"
28
+ * import { Effect } from "effect"
29
+ *
30
+ * const selected = Fx.unwrap(
31
+ * Effect.succeed(Fx.fromIterable(["ready", "running"]))
32
+ * )
33
+ * ```
34
+ *
6
35
  * @param effect - An `Effect` that produces an `Fx`.
7
36
  * @returns An `Fx` that runs the effect and then the produced Fx.
8
37
  * @since 1.0.0
9
- * @category combinators
38
+ * @category Generator composition
10
39
  */
11
- export declare const unwrap: <A, E, R, E2, R2>(effect: Effect.Effect<Fx<A, E, R>, E2, R2>) => Fx<A, E | E2, R | R2>;
40
+ export declare const unwrap: <A = never, E = never, R = never, E2 = never, R2 = never>(effect: Effect.Effect<Fx<A, E, R>, E2, R2>) => Fx<A, E | E2, R | R2>;
12
41
  //# sourceMappingURL=unwrap.d.ts.map