@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
@@ -1,23 +1,177 @@
1
+ import * as Effect from "effect/Effect";
1
2
  import * as Layer from "effect/Layer";
2
- import type * as ServiceMap from "effect/ServiceMap";
3
+ import * as Context from "effect/Context";
3
4
  import type { Fx } from "../Fx.js";
4
5
  /**
5
- * Provides context to an Fx from a Layer.
6
+ * Builds a Layer for each subscription and provides it to the entire Fx run.
6
7
  *
7
- * The context is provided to the entire Fx stream, including any effects run
8
- * during its execution. The context is scoped to the lifetime of the stream.
8
+ * @remarks
9
+ * ## Why
10
+ *
11
+ * Fx preserves Effect service requirements in `R`; providing a Layer closes
12
+ * those requirements while retaining acquisition failures and dependencies in
13
+ * the resulting type.
14
+ *
15
+ * ## Ownership and lifetime
16
+ *
17
+ * Each subscription creates a private Scope and builds the Layer inside it
18
+ * before the source starts. A build failure is sent to the sink and the source
19
+ * never runs. Otherwise the built Context is available to every source Effect,
20
+ * and the Scope closes with the source's success, failure, defect, or
21
+ * interruption. Provided services are removed from `R`; Layer dependencies and
22
+ * errors are added.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * import { Context, Effect, Layer } from "effect"
27
+ * import { provide } from "@typed/fx/Fx"
28
+ * import { fromEffect } from "@typed/fx/Fx"
29
+ *
30
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
31
+ * const request = fromEffect(Effect.map(Config, ({ url }) => url))
32
+ * const runnable = provide(request, Layer.succeed(Config, { url: "/api" }))
33
+ * ```
9
34
  *
10
35
  * @param layer - The Layer to provide.
11
36
  * @returns An `Fx` with the required context provided.
12
37
  * @since 1.0.0
13
- * @category combinators
38
+ * @category Providing services
14
39
  */
15
40
  export declare const provide: {
16
41
  <R2, E2 = never, R3 = never>(layer: Layer.Layer<R2, E2, R3>): <A, E, R>(fx: Fx<A, E, R>) => Fx<A, E | E2, Exclude<R, R2> | R3>;
17
42
  <A, E, R, R2, E2 = never, R3 = never>(fx: Fx<A, E, R>, layer: Layer.Layer<R2, E2, R3>): Fx<A, E | E2, Exclude<R, R2> | R3>;
18
43
  };
19
- export declare const provideServices: {
20
- <R2>(services: ServiceMap.ServiceMap<R2>): <A, E, R>(fx: Fx<A, E, R>) => Fx<A, E, Exclude<R, R2>>;
21
- <A, E, R, R2>(fx: Fx<A, E, R>, services: ServiceMap.ServiceMap<R2>): Fx<A, E, Exclude<R, R2>>;
44
+ /**
45
+ * Provides an already-built Effect Context to the entire Fx run.
46
+ *
47
+ * @remarks
48
+ * ## Why
49
+ *
50
+ * Callers that already own service instances should not rebuild them through a
51
+ * resourceful Layer merely to satisfy an Fx's environment.
52
+ *
53
+ * ## Ownership and lifetime
54
+ *
55
+ * The Context is captured when this combinator is created and reused for each
56
+ * subscription. Its services are available to all source Effects and removed
57
+ * from `R`. This function does not acquire or release those service values;
58
+ * their owner must keep them valid for every subscription that uses the result.
59
+ * Source completion, failure, and interruption are unchanged.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * import { Context, Effect } from "effect"
64
+ * import { provideContext } from "@typed/fx/Fx"
65
+ * import { fromEffect } from "@typed/fx/Fx"
66
+ *
67
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
68
+ * const context = Context.make(Config, { url: "/api" })
69
+ * const runnable = provideContext(fromEffect(Effect.map(Config, (x) => x.url)), context)
70
+ * ```
71
+ *
72
+ * @since 1.0.0
73
+ * @category Providing services
74
+ */
75
+ export declare const provideContext: {
76
+ <R2>(services: Context.Context<R2>): <A, E, R>(fx: Fx<A, E, R>) => Fx<A, E, Exclude<R, R2>>;
77
+ <A, E, R, R2>(fx: Fx<A, E, R>, services: Context.Context<R2>): Fx<A, E, Exclude<R, R2>>;
78
+ };
79
+ /**
80
+ * Provides one existing service value to the entire Fx run.
81
+ *
82
+ * @remarks
83
+ * ## Why
84
+ *
85
+ * This is the precise single-service form of {@link provideContext}, useful for
86
+ * tests and application edges where the instance is already owned.
87
+ *
88
+ * ## Ownership and lifetime
89
+ *
90
+ * The service value is captured and reused for every subscription. It is not
91
+ * acquired or finalized here; its caller owns its lifetime. The matching
92
+ * service identifier is removed from `R`, while values, errors, ordering, and
93
+ * interruption remain those of the source.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * import { Context, Effect } from "effect"
98
+ * import { provideService } from "@typed/fx/Fx"
99
+ * import { fromEffect } from "@typed/fx/Fx"
100
+ *
101
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
102
+ * const runnable = provideService(
103
+ * fromEffect(Effect.map(Config, (x) => x.url)),
104
+ * Config,
105
+ * { url: "/api" }
106
+ * )
107
+ * ```
108
+ *
109
+ * @param tag - The service tag (identifier).
110
+ * @param service - The service implementation.
111
+ * @returns An `Fx` with the required service provided.
112
+ * @since 1.0.0
113
+ * @category Providing services
114
+ */
115
+ export declare const provideService: {
116
+ <Id, S>(tag: Context.Service<Id, S>, service: S): <A, E, R>(fx: Fx<A, E, R>) => Fx<A, E, Exclude<R, Id>>;
117
+ <A, E, R, Id, S>(fx: Fx<A, E, R>, tag: Context.Service<Id, S>, service: S): Fx<A, E, Exclude<R, Id>>;
118
+ };
119
+ /**
120
+ * Acquires one service with an Effect before running the Fx.
121
+ *
122
+ * @remarks
123
+ * ## Why
124
+ *
125
+ * Some service instances require effectful configuration but do not warrant a
126
+ * separately named Layer. This keeps acquisition failure and dependencies
127
+ * explicit in the returned Fx type.
128
+ *
129
+ * ## Ownership and lifetime
130
+ *
131
+ * The service Effect runs once per subscription while {@link provide} builds
132
+ * its Layer. A failure prevents the source from starting. On success, the
133
+ * service is available for the whole source run and its identifier is removed
134
+ * from `R`; acquisition errors and every requirement in `R2` are added. In
135
+ * particular, an `Effect.acquireRelease` service Effect still leaves
136
+ * `Scope.Scope` in the returned Fx requirements—the private Layer Scope does
137
+ * not erase that public requirement. The caller must provide that Scope.
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * import { Context, Effect } from "effect"
142
+ * import { provideServiceEffect } from "@typed/fx/Fx"
143
+ * import { fromEffect } from "@typed/fx/Fx"
144
+ *
145
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
146
+ * const request = fromEffect(Effect.map(Config, (x) => x.url))
147
+ * const runnable = provideServiceEffect(request, Config, Effect.succeed({ url: "/api" }))
148
+ * ```
149
+ *
150
+ * @example Scoped acquisition keeps `Scope` in the returned Fx requirements
151
+ * ```ts
152
+ * import { Context, Effect } from "effect"
153
+ * import { provideServiceEffect } from "@typed/fx/Fx"
154
+ * import { fromEffect } from "@typed/fx/Fx"
155
+ * import { collectAll } from "@typed/fx/Fx"
156
+ *
157
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
158
+ * const request = fromEffect(Effect.map(Config, (x) => x.url))
159
+ * const acquired = Effect.acquireRelease(
160
+ * Effect.succeed({ url: "/api" }),
161
+ * () => Effect.void
162
+ * )
163
+ * const scopedFx = provideServiceEffect(request, Config, acquired)
164
+ * const program = Effect.scoped(collectAll(scopedFx))
165
+ * ```
166
+ *
167
+ * @param tag - The service tag (identifier).
168
+ * @param serviceEffect - Effect that produces the service (may have its own requirements).
169
+ * @returns An `Fx` with the required service provided.
170
+ * @since 1.0.0
171
+ * @category Providing services
172
+ */
173
+ export declare const provideServiceEffect: {
174
+ <Id, S, E2, R2>(tag: Context.Service<Id, S>, serviceEffect: Effect.Effect<S, E2, R2>): <A, E, R>(fx: Fx<A, E, R>) => Fx<A, E | E2, Exclude<R, Id> | R2>;
175
+ <A, E, R, Id, S, E2, R2>(fx: Fx<A, E, R>, tag: Context.Service<Id, S>, serviceEffect: Effect.Effect<S, E2, R2>): Fx<A, E | E2, Exclude<R, Id> | R2>;
22
176
  };
23
177
  //# sourceMappingURL=provide.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provide.d.ts","sourceRoot":"","sources":["../../../src/Fx/combinators/provide.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,EAAE;IACpB,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EACzB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAC7B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IAEpE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EAClC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACf,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAC7B,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;CAuBvC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE;IAC5B,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,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,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAElG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;CAK/F,CAAC"}
1
+ {"version":3,"file":"provide.d.ts","sourceRoot":"","sources":["../../../src/Fx/combinators/provide.ts"],"names":[],"mappings":"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"}
@@ -3,17 +3,42 @@ import * as Exit from "effect/Exit";
3
3
  import { dual } from "effect/Function";
4
4
  import * as Layer from "effect/Layer";
5
5
  import * as Scope from "effect/Scope";
6
+ import * as Context from "effect/Context";
6
7
  import { make } from "../constructors/make.js";
7
8
  /**
8
- * Provides context to an Fx from a Layer.
9
+ * Builds a Layer for each subscription and provides it to the entire Fx run.
9
10
  *
10
- * The context is provided to the entire Fx stream, including any effects run
11
- * during its execution. The context is scoped to the lifetime of the stream.
11
+ * @remarks
12
+ * ## Why
13
+ *
14
+ * Fx preserves Effect service requirements in `R`; providing a Layer closes
15
+ * those requirements while retaining acquisition failures and dependencies in
16
+ * the resulting type.
17
+ *
18
+ * ## Ownership and lifetime
19
+ *
20
+ * Each subscription creates a private Scope and builds the Layer inside it
21
+ * before the source starts. A build failure is sent to the sink and the source
22
+ * never runs. Otherwise the built Context is available to every source Effect,
23
+ * and the Scope closes with the source's success, failure, defect, or
24
+ * interruption. Provided services are removed from `R`; Layer dependencies and
25
+ * errors are added.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * import { Context, Effect, Layer } from "effect"
30
+ * import { provide } from "@typed/fx/Fx"
31
+ * import { fromEffect } from "@typed/fx/Fx"
32
+ *
33
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
34
+ * const request = fromEffect(Effect.map(Config, ({ url }) => url))
35
+ * const runnable = provide(request, Layer.succeed(Config, { url: "/api" }))
36
+ * ```
12
37
  *
13
38
  * @param layer - The Layer to provide.
14
39
  * @returns An `Fx` with the required context provided.
15
40
  * @since 1.0.0
16
- * @category combinators
41
+ * @category Providing services
17
42
  */
18
43
  export const provide = dual(2, (fx, layer) => make(Effect.fnUntraced(function* (sink) {
19
44
  const scope = yield* Scope.make();
@@ -22,6 +47,129 @@ export const provide = dual(2, (fx, layer) => make(Effect.fnUntraced(function* (
22
47
  yield* Scope.close(scope, servicesExit);
23
48
  return yield* sink.onFailure(servicesExit.cause);
24
49
  }
25
- return yield* fx.run(sink).pipe(Effect.provideServices(servicesExit.value), Effect.onExit((exit) => Scope.close(scope, exit)));
50
+ return yield* fx.run(sink).pipe(Effect.provideContext(servicesExit.value), Effect.onExit((exit) => Scope.close(scope, exit)));
26
51
  })));
27
- export const provideServices = dual(2, (fx, services) => provide(fx, Layer.succeedServices(services)));
52
+ /**
53
+ * Provides an already-built Effect Context to the entire Fx run.
54
+ *
55
+ * @remarks
56
+ * ## Why
57
+ *
58
+ * Callers that already own service instances should not rebuild them through a
59
+ * resourceful Layer merely to satisfy an Fx's environment.
60
+ *
61
+ * ## Ownership and lifetime
62
+ *
63
+ * The Context is captured when this combinator is created and reused for each
64
+ * subscription. Its services are available to all source Effects and removed
65
+ * from `R`. This function does not acquire or release those service values;
66
+ * their owner must keep them valid for every subscription that uses the result.
67
+ * Source completion, failure, and interruption are unchanged.
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * import { Context, Effect } from "effect"
72
+ * import { provideContext } from "@typed/fx/Fx"
73
+ * import { fromEffect } from "@typed/fx/Fx"
74
+ *
75
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
76
+ * const context = Context.make(Config, { url: "/api" })
77
+ * const runnable = provideContext(fromEffect(Effect.map(Config, (x) => x.url)), context)
78
+ * ```
79
+ *
80
+ * @since 1.0.0
81
+ * @category Providing services
82
+ */
83
+ export const provideContext = dual(2, (fx, services) => provide(fx, Layer.succeedContext(services)));
84
+ /**
85
+ * Provides one existing service value to the entire Fx run.
86
+ *
87
+ * @remarks
88
+ * ## Why
89
+ *
90
+ * This is the precise single-service form of {@link provideContext}, useful for
91
+ * tests and application edges where the instance is already owned.
92
+ *
93
+ * ## Ownership and lifetime
94
+ *
95
+ * The service value is captured and reused for every subscription. It is not
96
+ * acquired or finalized here; its caller owns its lifetime. The matching
97
+ * service identifier is removed from `R`, while values, errors, ordering, and
98
+ * interruption remain those of the source.
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * import { Context, Effect } from "effect"
103
+ * import { provideService } from "@typed/fx/Fx"
104
+ * import { fromEffect } from "@typed/fx/Fx"
105
+ *
106
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
107
+ * const runnable = provideService(
108
+ * fromEffect(Effect.map(Config, (x) => x.url)),
109
+ * Config,
110
+ * { url: "/api" }
111
+ * )
112
+ * ```
113
+ *
114
+ * @param tag - The service tag (identifier).
115
+ * @param service - The service implementation.
116
+ * @returns An `Fx` with the required service provided.
117
+ * @since 1.0.0
118
+ * @category Providing services
119
+ */
120
+ export const provideService = dual(3, (fx, tag, service) => provideContext(fx, Context.make(tag, service)));
121
+ /**
122
+ * Acquires one service with an Effect before running the Fx.
123
+ *
124
+ * @remarks
125
+ * ## Why
126
+ *
127
+ * Some service instances require effectful configuration but do not warrant a
128
+ * separately named Layer. This keeps acquisition failure and dependencies
129
+ * explicit in the returned Fx type.
130
+ *
131
+ * ## Ownership and lifetime
132
+ *
133
+ * The service Effect runs once per subscription while {@link provide} builds
134
+ * its Layer. A failure prevents the source from starting. On success, the
135
+ * service is available for the whole source run and its identifier is removed
136
+ * from `R`; acquisition errors and every requirement in `R2` are added. In
137
+ * particular, an `Effect.acquireRelease` service Effect still leaves
138
+ * `Scope.Scope` in the returned Fx requirements—the private Layer Scope does
139
+ * not erase that public requirement. The caller must provide that Scope.
140
+ *
141
+ * @example
142
+ * ```ts
143
+ * import { Context, Effect } from "effect"
144
+ * import { provideServiceEffect } from "@typed/fx/Fx"
145
+ * import { fromEffect } from "@typed/fx/Fx"
146
+ *
147
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
148
+ * const request = fromEffect(Effect.map(Config, (x) => x.url))
149
+ * const runnable = provideServiceEffect(request, Config, Effect.succeed({ url: "/api" }))
150
+ * ```
151
+ *
152
+ * @example Scoped acquisition keeps `Scope` in the returned Fx requirements
153
+ * ```ts
154
+ * import { Context, Effect } from "effect"
155
+ * import { provideServiceEffect } from "@typed/fx/Fx"
156
+ * import { fromEffect } from "@typed/fx/Fx"
157
+ * import { collectAll } from "@typed/fx/Fx"
158
+ *
159
+ * class Config extends Context.Service<Config, { readonly url: string }>()("Config") {}
160
+ * const request = fromEffect(Effect.map(Config, (x) => x.url))
161
+ * const acquired = Effect.acquireRelease(
162
+ * Effect.succeed({ url: "/api" }),
163
+ * () => Effect.void
164
+ * )
165
+ * const scopedFx = provideServiceEffect(request, Config, acquired)
166
+ * const program = Effect.scoped(collectAll(scopedFx))
167
+ * ```
168
+ *
169
+ * @param tag - The service tag (identifier).
170
+ * @param serviceEffect - Effect that produces the service (may have its own requirements).
171
+ * @returns An `Fx` with the required service provided.
172
+ * @since 1.0.0
173
+ * @category Providing services
174
+ */
175
+ export const provideServiceEffect = dual(3, (fx, tag, serviceEffect) => provide(fx, Layer.effect(tag, serviceEffect)));
@@ -0,0 +1,92 @@
1
+ import type { Fx } from "../Fx.js";
2
+ /**
3
+ * Runs two streams concurrently until one emits, then mirrors the winner and
4
+ * interrupts the other.
5
+ *
6
+ * A failure or completion from one side before the other emits does **not**
7
+ * win unless every side ends without emitting. After a winner is chosen, that
8
+ * stream's later failures are propagated.
9
+ *
10
+ * @remarks
11
+ * ## Why
12
+ *
13
+ * `race` selects a live producer by its first useful value rather than by setup,
14
+ * completion, or a fast failure. This is suitable for redundant sources where a
15
+ * producer that ends silently should not prevent another from becoming useful.
16
+ *
17
+ * ## Selection, ordering, and cardinality
18
+ *
19
+ * Both inputs start concurrently. The first emitted value atomically selects its
20
+ * producer; that value and all later values from the winner are forwarded in
21
+ * order. The loser emits nothing after selection and is interrupted. There is no
22
+ * buffering or replay.
23
+ *
24
+ * ## Ownership and lifetime
25
+ *
26
+ * Before a winner, a non-interruption failure is remembered but does not win; it
27
+ * is reported only if both inputs end without a value. After selection, winner
28
+ * failures are forwarded. Both environments remain required. The observing
29
+ * fiber owns both child fibers and interruption cancels the race and finalizers.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * import { Fx } from "@typed/fx"
34
+ * import { Effect } from "effect"
35
+ *
36
+ * const response = Fx.race(
37
+ * Fx.ensuring(Fx.at("slow", "50 millis"), Effect.log("slow closed")),
38
+ * Fx.ensuring(Fx.at("fast", "5 millis"), Effect.log("fast closed"))
39
+ * )
40
+ * Effect.runPromise(Fx.collectAll(response)).then(console.log)
41
+ * // "slow closed" proves loser cleanup; the winning finalizer also runs
42
+ * // resolves ["fast"]
43
+ * ```
44
+ *
45
+ * @since 1.0.0
46
+ * @category Concurrent work
47
+ */
48
+ export declare const race: {
49
+ <AR, ER, RR>(that: Fx<AR, ER, RR>): <AL, EL, RL>(self: Fx<AL, EL, RL>) => Fx<AL | AR, EL | ER, RL | RR>;
50
+ <AL, EL, RL, AR, ER, RR>(self: Fx<AL, EL, RL>, that: Fx<AR, ER, RR>): Fx<AL | AR, EL | ER, RL | RR>;
51
+ };
52
+ /**
53
+ * Races many streams: the first to emit wins and the rest are interrupted.
54
+ *
55
+ * @remarks
56
+ * ## Why
57
+ *
58
+ * `raceAll` extends {@link race} to a runtime-sized set while preserving the
59
+ * first-value selection rule.
60
+ *
61
+ * ## Selection, ordering, and cardinality
62
+ *
63
+ * All inputs start concurrently. The first emitted value selects one input and
64
+ * only that input's values are forwarded afterward. Zero inputs produce the
65
+ * empty Fx; one input is returned unchanged. No result buffer is retained.
66
+ *
67
+ * ## Ownership and lifetime
68
+ *
69
+ * Before selection, the first non-interruption failure is retained and reported
70
+ * only if every input ends without emitting. After selection, winner failures
71
+ * are forwarded. All environments are required. Losers are interrupted and the
72
+ * observing fiber owns cleanup for every child.
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * import { Fx } from "@typed/fx"
77
+ * import { Effect } from "effect"
78
+ *
79
+ * const response = Fx.raceAll(
80
+ * Fx.at("cache", "30 millis"),
81
+ * Fx.at("primary", "5 millis"),
82
+ * Fx.at("replica", "20 millis")
83
+ * )
84
+ * Effect.runPromise(Fx.collectAll(response)).then(console.log)
85
+ * // ["primary"]
86
+ * ```
87
+ *
88
+ * @since 1.0.0
89
+ * @category Concurrent work
90
+ */
91
+ export declare const raceAll: <FX extends ReadonlyArray<Fx<any, any, any>>>(...fxs: FX) => Fx<Fx.Success<FX[number]>, Fx.Error<FX[number]>, Fx.Services<FX[number]>>;
92
+ //# sourceMappingURL=race.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"race.d.ts","sourceRoot":"","sources":["../../../src/Fx/combinators/race.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,eAAO,MAAM,IAAI,EAAE;IACjB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACxG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACrB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACpB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GACnB,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;CAOlC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,eAAO,MAAM,OAAO,GAAI,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,UACzD,EAAE,KACT,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAwF1E,CAAC"}
@@ -0,0 +1,149 @@
1
+ import * as Cause from "effect/Cause";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Fiber from "effect/Fiber";
4
+ import { dual } from "effect/Function";
5
+ import * as Ref from "effect/Ref";
6
+ import * as SynchronizedRef from "effect/SynchronizedRef";
7
+ import { make as makeSink } from "../../Sink/Sink.js";
8
+ import { empty } from "../constructors/empty.js";
9
+ import { make } from "../constructors/make.js";
10
+ /**
11
+ * Runs two streams concurrently until one emits, then mirrors the winner and
12
+ * interrupts the other.
13
+ *
14
+ * A failure or completion from one side before the other emits does **not**
15
+ * win unless every side ends without emitting. After a winner is chosen, that
16
+ * stream's later failures are propagated.
17
+ *
18
+ * @remarks
19
+ * ## Why
20
+ *
21
+ * `race` selects a live producer by its first useful value rather than by setup,
22
+ * completion, or a fast failure. This is suitable for redundant sources where a
23
+ * producer that ends silently should not prevent another from becoming useful.
24
+ *
25
+ * ## Selection, ordering, and cardinality
26
+ *
27
+ * Both inputs start concurrently. The first emitted value atomically selects its
28
+ * producer; that value and all later values from the winner are forwarded in
29
+ * order. The loser emits nothing after selection and is interrupted. There is no
30
+ * buffering or replay.
31
+ *
32
+ * ## Ownership and lifetime
33
+ *
34
+ * Before a winner, a non-interruption failure is remembered but does not win; it
35
+ * is reported only if both inputs end without a value. After selection, winner
36
+ * failures are forwarded. Both environments remain required. The observing
37
+ * fiber owns both child fibers and interruption cancels the race and finalizers.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * import { Fx } from "@typed/fx"
42
+ * import { Effect } from "effect"
43
+ *
44
+ * const response = Fx.race(
45
+ * Fx.ensuring(Fx.at("slow", "50 millis"), Effect.log("slow closed")),
46
+ * Fx.ensuring(Fx.at("fast", "5 millis"), Effect.log("fast closed"))
47
+ * )
48
+ * Effect.runPromise(Fx.collectAll(response)).then(console.log)
49
+ * // "slow closed" proves loser cleanup; the winning finalizer also runs
50
+ * // resolves ["fast"]
51
+ * ```
52
+ *
53
+ * @since 1.0.0
54
+ * @category Concurrent work
55
+ */
56
+ export const race = dual(2, (self, that) => raceAll(self, that));
57
+ /**
58
+ * Races many streams: the first to emit wins and the rest are interrupted.
59
+ *
60
+ * @remarks
61
+ * ## Why
62
+ *
63
+ * `raceAll` extends {@link race} to a runtime-sized set while preserving the
64
+ * first-value selection rule.
65
+ *
66
+ * ## Selection, ordering, and cardinality
67
+ *
68
+ * All inputs start concurrently. The first emitted value selects one input and
69
+ * only that input's values are forwarded afterward. Zero inputs produce the
70
+ * empty Fx; one input is returned unchanged. No result buffer is retained.
71
+ *
72
+ * ## Ownership and lifetime
73
+ *
74
+ * Before selection, the first non-interruption failure is retained and reported
75
+ * only if every input ends without emitting. After selection, winner failures
76
+ * are forwarded. All environments are required. Losers are interrupted and the
77
+ * observing fiber owns cleanup for every child.
78
+ *
79
+ * @example
80
+ * ```ts
81
+ * import { Fx } from "@typed/fx"
82
+ * import { Effect } from "effect"
83
+ *
84
+ * const response = Fx.raceAll(
85
+ * Fx.at("cache", "30 millis"),
86
+ * Fx.at("primary", "5 millis"),
87
+ * Fx.at("replica", "20 millis")
88
+ * )
89
+ * Effect.runPromise(Fx.collectAll(response)).then(console.log)
90
+ * // ["primary"]
91
+ * ```
92
+ *
93
+ * @since 1.0.0
94
+ * @category Concurrent work
95
+ */
96
+ export const raceAll = (...fxs) => {
97
+ if (fxs.length === 0) {
98
+ return empty;
99
+ }
100
+ if (fxs.length === 1) {
101
+ return fxs[0];
102
+ }
103
+ return make((sink) => Effect.gen(function* () {
104
+ const winner = yield* SynchronizedRef.make(null);
105
+ const ended = yield* Ref.make(0);
106
+ const firstFail = yield* Ref.make(null);
107
+ const fibersRef = yield* Ref.make([]);
108
+ const interruptOthers = (except) => Effect.flatMap(Ref.get(fibersRef), (fibers) => Effect.forEach(fibers, (fiber, i) => (i === except ? Effect.void : Fiber.interrupt(fiber)), { discard: true }));
109
+ const markEnded = Effect.gen(function* () {
110
+ const current = yield* SynchronizedRef.get(winner);
111
+ if (current !== null)
112
+ return;
113
+ const n = yield* Ref.updateAndGet(ended, (count) => count + 1);
114
+ if (n === fxs.length) {
115
+ const cause = yield* Ref.get(firstFail);
116
+ if (cause !== null) {
117
+ yield* sink.onFailure(cause);
118
+ }
119
+ }
120
+ });
121
+ const fibers = [];
122
+ for (let i = 0; i < fxs.length; i++) {
123
+ const fx = fxs[i];
124
+ const fiber = yield* Effect.forkChild(Effect.flatMap(SynchronizedRef.get(winner), (already) => already !== null
125
+ ? Effect.void
126
+ : fx
127
+ .run(makeSink((cause) => Effect.flatMap(SynchronizedRef.get(winner), (w) => {
128
+ if (w === i)
129
+ return sink.onFailure(cause);
130
+ if (w === null && !Cause.hasInterruptsOnly(cause)) {
131
+ return Ref.update(firstFail, (prev) => prev ?? cause);
132
+ }
133
+ return Effect.void;
134
+ }), (a) => SynchronizedRef.updateEffect(winner, (w) => {
135
+ if (w === null) {
136
+ return interruptOthers(i).pipe(Effect.andThen(sink.onSuccess(a)), Effect.as(i));
137
+ }
138
+ if (w === i) {
139
+ return sink.onSuccess(a).pipe(Effect.as(w));
140
+ }
141
+ return Effect.succeed(w);
142
+ })))
143
+ .pipe(Effect.ensuring(markEnded))), { startImmediately: true, uninterruptible: false });
144
+ fibers.push(fiber);
145
+ }
146
+ yield* Ref.set(fibersRef, fibers);
147
+ yield* Effect.forEach(fibers, (fiber) => Fiber.join(fiber).pipe(Effect.catchCause(() => Effect.void)), { concurrency: "unbounded", discard: true });
148
+ }));
149
+ };
@@ -0,0 +1,41 @@
1
+ import * as Schedule from "effect/Schedule";
2
+ import type { Fx } from "../Fx.js";
3
+ /**
4
+ * Repeats the entire stream according to `schedule` after each successful
5
+ * completion. Failures are not repeated.
6
+ *
7
+ * `Schedule.recurs(n)` runs the stream `n + 1` times (the original plus `n`
8
+ * repeats), matching Effect `Stream.repeat`.
9
+ *
10
+ * @remarks
11
+ * ## Why
12
+ *
13
+ * Repetition is a subscription-level decision: after one producer completes,
14
+ * a Schedule decides whether and when a fresh run should begin. Keeping that
15
+ * decision in Effect's Schedule preserves typed timing services and failures.
16
+ *
17
+ * ## Ownership and lifetime
18
+ *
19
+ * Runs are strictly sequential. Every source value is forwarded before the
20
+ * Schedule is stepped with `void`; a successful step sleeps as configured and
21
+ * starts a new source run. A source failure stops immediately and is never
22
+ * repeated. Schedule failure is forwarded; Schedule completion ends normally.
23
+ * Interruption cancels the active source or schedule sleep. No runs overlap.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { Schedule } from "effect"
28
+ * import { repeat } from "@typed/fx/Fx"
29
+ * import { succeed } from "@typed/fx/Fx"
30
+ *
31
+ * const threeTicks = repeat(succeed("tick"), Schedule.recurs(2))
32
+ * ```
33
+ *
34
+ * @since 1.0.0
35
+ * @category Time and rate
36
+ */
37
+ export declare const repeat: {
38
+ <X, E2, R2>(schedule: Schedule.Schedule<X, void, E2, R2>): <A, E, R>(self: Fx<A, E, R>) => Fx<A, E | E2, R | R2>;
39
+ <A, E, R, X, E2, R2>(self: Fx<A, E, R>, schedule: Schedule.Schedule<X, void, E2, R2>): Fx<A, E | E2, R | R2>;
40
+ };
41
+ //# sourceMappingURL=repeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repeat.d.ts","sourceRoot":"","sources":["../../../src/Fx/combinators/repeat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,MAAM,EAAE;IACnB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,GAC3C,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,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,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,GAC3C,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;CAoC1B,CAAC"}