@typed/fx 1.12.6 → 1.14.0

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 (610) hide show
  1. package/dist/Computed.d.ts +42 -0
  2. package/dist/Computed.d.ts.map +1 -0
  3. package/dist/Computed.js +39 -0
  4. package/dist/Computed.js.map +1 -0
  5. package/dist/Filtered.d.ts +34 -0
  6. package/dist/Filtered.d.ts.map +1 -0
  7. package/dist/Filtered.js +40 -0
  8. package/dist/Filtered.js.map +1 -0
  9. package/dist/Fx.d.ts +2 -3
  10. package/dist/Fx.d.ts.map +1 -1
  11. package/dist/Fx.js +11 -26
  12. package/dist/Fx.js.map +1 -1
  13. package/dist/RefArray.d.ts +116 -0
  14. package/dist/RefArray.d.ts.map +1 -0
  15. package/dist/RefArray.js +67 -0
  16. package/dist/RefArray.js.map +1 -0
  17. package/dist/RefSubject.d.ts +25 -21
  18. package/dist/RefSubject.d.ts.map +1 -1
  19. package/dist/RefSubject.js +356 -248
  20. package/dist/RefSubject.js.map +1 -1
  21. package/dist/RefTransform.d.ts +51 -0
  22. package/dist/RefTransform.d.ts.map +1 -0
  23. package/dist/RefTransform.js +69 -0
  24. package/dist/RefTransform.js.map +1 -0
  25. package/dist/Subject.d.ts +1 -1
  26. package/dist/Subject.d.ts.map +1 -1
  27. package/dist/Subject.js +4 -4
  28. package/dist/Subject.js.map +1 -1
  29. package/dist/at.d.ts +1 -1
  30. package/dist/at.d.ts.map +1 -1
  31. package/dist/at.js +1 -1
  32. package/dist/at.js.map +1 -1
  33. package/dist/catchAllCause.d.ts +8 -1
  34. package/dist/catchAllCause.d.ts.map +1 -1
  35. package/dist/catchAllCause.js +23 -3
  36. package/dist/catchAllCause.js.map +1 -1
  37. package/dist/cjs/Computed.d.ts +42 -0
  38. package/dist/cjs/Computed.d.ts.map +1 -0
  39. package/dist/cjs/Computed.js +66 -0
  40. package/dist/cjs/Computed.js.map +1 -0
  41. package/dist/cjs/Filtered.d.ts +34 -0
  42. package/dist/cjs/Filtered.d.ts.map +1 -0
  43. package/dist/cjs/Filtered.js +67 -0
  44. package/dist/cjs/Filtered.js.map +1 -0
  45. package/dist/cjs/Fx.d.ts +2 -3
  46. package/dist/cjs/Fx.d.ts.map +1 -1
  47. package/dist/cjs/Fx.js +13 -28
  48. package/dist/cjs/Fx.js.map +1 -1
  49. package/dist/cjs/RefArray.d.ts +116 -0
  50. package/dist/cjs/RefArray.d.ts.map +1 -0
  51. package/dist/cjs/RefArray.js +97 -0
  52. package/dist/cjs/RefArray.js.map +1 -0
  53. package/dist/cjs/RefSubject.d.ts +25 -21
  54. package/dist/cjs/RefSubject.d.ts.map +1 -1
  55. package/dist/cjs/RefSubject.js +363 -251
  56. package/dist/cjs/RefSubject.js.map +1 -1
  57. package/dist/cjs/RefTransform.d.ts +51 -0
  58. package/dist/cjs/RefTransform.d.ts.map +1 -0
  59. package/dist/cjs/RefTransform.js +96 -0
  60. package/dist/cjs/RefTransform.js.map +1 -0
  61. package/dist/cjs/Subject.d.ts +1 -1
  62. package/dist/cjs/Subject.d.ts.map +1 -1
  63. package/dist/cjs/Subject.js +27 -4
  64. package/dist/cjs/Subject.js.map +1 -1
  65. package/dist/cjs/at.d.ts +1 -1
  66. package/dist/cjs/at.d.ts.map +1 -1
  67. package/dist/cjs/at.js +25 -2
  68. package/dist/cjs/at.js.map +1 -1
  69. package/dist/cjs/catchAllCause.d.ts +8 -1
  70. package/dist/cjs/catchAllCause.d.ts.map +1 -1
  71. package/dist/cjs/catchAllCause.js +48 -3
  72. package/dist/cjs/catchAllCause.js.map +1 -1
  73. package/dist/cjs/combineAll.d.ts.map +1 -1
  74. package/dist/cjs/combineAll.js +29 -6
  75. package/dist/cjs/combineAll.js.map +1 -1
  76. package/dist/cjs/combineAllDiscard.d.ts.map +1 -1
  77. package/dist/cjs/combineAllDiscard.js +28 -5
  78. package/dist/cjs/combineAllDiscard.js.map +1 -1
  79. package/dist/cjs/continueWith.d.ts +1 -1
  80. package/dist/cjs/continueWith.d.ts.map +1 -1
  81. package/dist/cjs/continueWith.js +25 -2
  82. package/dist/cjs/continueWith.js.map +1 -1
  83. package/dist/cjs/data-first.d.ts +10 -0
  84. package/dist/cjs/data-first.d.ts.map +1 -1
  85. package/dist/cjs/data-first.js +10 -0
  86. package/dist/cjs/data-first.js.map +1 -1
  87. package/dist/cjs/debounce.d.ts +1 -1
  88. package/dist/cjs/debounce.d.ts.map +1 -1
  89. package/dist/cjs/debounce.js +25 -2
  90. package/dist/cjs/debounce.js.map +1 -1
  91. package/dist/cjs/delay.d.ts.map +1 -1
  92. package/dist/cjs/delay.js +25 -2
  93. package/dist/cjs/delay.js.map +1 -1
  94. package/dist/cjs/empty.js +1 -1
  95. package/dist/cjs/empty.js.map +1 -1
  96. package/dist/cjs/exhaustMap.d.ts +1 -1
  97. package/dist/cjs/exhaustMap.d.ts.map +1 -1
  98. package/dist/cjs/exhaustMap.js.map +1 -1
  99. package/dist/cjs/exhaustMapCause.d.ts +2 -1
  100. package/dist/cjs/exhaustMapCause.d.ts.map +1 -1
  101. package/dist/cjs/exhaustMapCause.js +26 -2
  102. package/dist/cjs/exhaustMapCause.js.map +1 -1
  103. package/dist/cjs/exhaustMapLatest.d.ts +1 -1
  104. package/dist/cjs/exhaustMapLatest.d.ts.map +1 -1
  105. package/dist/cjs/exhaustMapLatest.js.map +1 -1
  106. package/dist/cjs/exhaustMapLatestCause.d.ts +2 -1
  107. package/dist/cjs/exhaustMapLatestCause.d.ts.map +1 -1
  108. package/dist/cjs/exhaustMapLatestCause.js +26 -2
  109. package/dist/cjs/exhaustMapLatestCause.js.map +1 -1
  110. package/dist/cjs/failCause.d.ts +1 -0
  111. package/dist/cjs/failCause.d.ts.map +1 -1
  112. package/dist/cjs/failCause.js +5 -1
  113. package/dist/cjs/failCause.js.map +1 -1
  114. package/dist/cjs/filter.d.ts.map +1 -1
  115. package/dist/cjs/filter.js +25 -2
  116. package/dist/cjs/filter.js.map +1 -1
  117. package/dist/cjs/filterMap.d.ts +1 -1
  118. package/dist/cjs/filterMap.d.ts.map +1 -1
  119. package/dist/cjs/filterMap.js +26 -2
  120. package/dist/cjs/filterMap.js.map +1 -1
  121. package/dist/cjs/flatMap.d.ts +1 -1
  122. package/dist/cjs/flatMap.d.ts.map +1 -1
  123. package/dist/cjs/flatMap.js.map +1 -1
  124. package/dist/cjs/fromArray.d.ts.map +1 -1
  125. package/dist/cjs/fromArray.js +27 -4
  126. package/dist/cjs/fromArray.js.map +1 -1
  127. package/dist/cjs/fromDequeue.d.ts +5 -0
  128. package/dist/cjs/fromDequeue.d.ts.map +1 -0
  129. package/dist/cjs/fromDequeue.js +49 -0
  130. package/dist/cjs/fromDequeue.js.map +1 -0
  131. package/dist/cjs/fromEffect.d.ts +1 -1
  132. package/dist/cjs/fromEffect.d.ts.map +1 -1
  133. package/dist/cjs/fromEffect.js +33 -2
  134. package/dist/cjs/fromEffect.js.map +1 -1
  135. package/dist/cjs/fromEmitter.d.ts +2 -2
  136. package/dist/cjs/fromEmitter.d.ts.map +1 -1
  137. package/dist/cjs/fromEmitter.js +35 -11
  138. package/dist/cjs/fromEmitter.js.map +1 -1
  139. package/dist/cjs/fromFxEffect.d.ts +1 -1
  140. package/dist/cjs/fromFxEffect.d.ts.map +1 -1
  141. package/dist/cjs/fromFxEffect.js +25 -2
  142. package/dist/cjs/fromFxEffect.js.map +1 -1
  143. package/dist/cjs/fromHub.d.ts +5 -0
  144. package/dist/cjs/fromHub.d.ts.map +1 -0
  145. package/dist/cjs/fromHub.js +34 -0
  146. package/dist/cjs/fromHub.js.map +1 -0
  147. package/dist/cjs/fromIterable.d.ts.map +1 -1
  148. package/dist/cjs/fromIterable.js +27 -4
  149. package/dist/cjs/fromIterable.js.map +1 -1
  150. package/dist/cjs/fromStream.d.ts +4 -0
  151. package/dist/cjs/fromStream.d.ts.map +1 -0
  152. package/dist/cjs/fromStream.js +34 -0
  153. package/dist/cjs/fromStream.js.map +1 -0
  154. package/dist/cjs/gen.d.ts +1 -1
  155. package/dist/cjs/gen.d.ts.map +1 -1
  156. package/dist/cjs/gen.js +25 -2
  157. package/dist/cjs/gen.js.map +1 -1
  158. package/dist/cjs/helpers.d.ts +5 -3
  159. package/dist/cjs/helpers.d.ts.map +1 -1
  160. package/dist/cjs/helpers.js +59 -72
  161. package/dist/cjs/helpers.js.map +1 -1
  162. package/dist/cjs/hold.d.ts +5 -5
  163. package/dist/cjs/hold.d.ts.map +1 -1
  164. package/dist/cjs/hold.js +32 -11
  165. package/dist/cjs/hold.js.map +1 -1
  166. package/dist/cjs/index.d.ts +43 -2
  167. package/dist/cjs/index.d.ts.map +1 -1
  168. package/dist/cjs/index.js +185 -119
  169. package/dist/cjs/index.js.map +1 -1
  170. package/dist/cjs/keyed.d.ts.map +1 -1
  171. package/dist/cjs/keyed.js +32 -41
  172. package/dist/cjs/keyed.js.map +1 -1
  173. package/dist/cjs/map.d.ts.map +1 -1
  174. package/dist/cjs/map.js +25 -2
  175. package/dist/cjs/map.js.map +1 -1
  176. package/dist/cjs/mergeAll.d.ts.map +1 -1
  177. package/dist/cjs/mergeAll.js +28 -3
  178. package/dist/cjs/mergeAll.js.map +1 -1
  179. package/dist/cjs/mergeBufferConcurrently.d.ts +8 -0
  180. package/dist/cjs/mergeBufferConcurrently.d.ts.map +1 -0
  181. package/dist/cjs/mergeBufferConcurrently.js +95 -0
  182. package/dist/cjs/mergeBufferConcurrently.js.map +1 -0
  183. package/dist/cjs/mergeConcurrently.d.ts +3 -0
  184. package/dist/cjs/mergeConcurrently.d.ts.map +1 -0
  185. package/dist/cjs/mergeConcurrently.js +69 -0
  186. package/dist/cjs/mergeConcurrently.js.map +1 -0
  187. package/dist/cjs/multicast.d.ts +10 -8
  188. package/dist/cjs/multicast.d.ts.map +1 -1
  189. package/dist/cjs/multicast.js +43 -19
  190. package/dist/cjs/multicast.js.map +1 -1
  191. package/dist/cjs/never.d.ts.map +1 -1
  192. package/dist/cjs/never.js +25 -2
  193. package/dist/cjs/never.js.map +1 -1
  194. package/dist/cjs/observe.d.ts +4 -1
  195. package/dist/cjs/observe.d.ts.map +1 -1
  196. package/dist/cjs/observe.js +40 -10
  197. package/dist/cjs/observe.js.map +1 -1
  198. package/dist/cjs/onExit.d.ts +5 -0
  199. package/dist/cjs/onExit.d.ts.map +1 -0
  200. package/dist/cjs/onExit.js +33 -0
  201. package/dist/cjs/onExit.js.map +1 -0
  202. package/dist/cjs/onInterrupt.d.ts +1 -1
  203. package/dist/cjs/onInterrupt.d.ts.map +1 -1
  204. package/dist/cjs/onInterrupt.js +25 -2
  205. package/dist/cjs/onInterrupt.js.map +1 -1
  206. package/dist/cjs/orElse.d.ts +4 -0
  207. package/dist/cjs/orElse.d.ts.map +1 -0
  208. package/dist/cjs/orElse.js +34 -0
  209. package/dist/cjs/orElse.js.map +1 -0
  210. package/dist/cjs/promise.d.ts.map +1 -1
  211. package/dist/cjs/promise.js +36 -13
  212. package/dist/cjs/promise.js.map +1 -1
  213. package/dist/cjs/provide.d.ts +3 -2
  214. package/dist/cjs/provide.d.ts.map +1 -1
  215. package/dist/cjs/provide.js +34 -7
  216. package/dist/cjs/provide.js.map +1 -1
  217. package/dist/cjs/reduce.d.ts +2 -1
  218. package/dist/cjs/reduce.d.ts.map +1 -1
  219. package/dist/cjs/reduce.js +26 -3
  220. package/dist/cjs/reduce.js.map +1 -1
  221. package/dist/cjs/scan.d.ts.map +1 -1
  222. package/dist/cjs/scan.js +26 -3
  223. package/dist/cjs/scan.js.map +1 -1
  224. package/dist/cjs/scoped.d.ts +1 -1
  225. package/dist/cjs/scoped.d.ts.map +1 -1
  226. package/dist/cjs/scoped.js +25 -2
  227. package/dist/cjs/scoped.js.map +1 -1
  228. package/dist/cjs/skipRepeats.d.ts +1 -1
  229. package/dist/cjs/skipRepeats.d.ts.map +1 -1
  230. package/dist/cjs/skipRepeats.js +34 -9
  231. package/dist/cjs/skipRepeats.js.map +1 -1
  232. package/dist/cjs/skipWhile.d.ts.map +1 -1
  233. package/dist/cjs/skipWhile.js +27 -4
  234. package/dist/cjs/skipWhile.js.map +1 -1
  235. package/dist/cjs/slice.d.ts.map +1 -1
  236. package/dist/cjs/slice.js +29 -6
  237. package/dist/cjs/slice.js.map +1 -1
  238. package/dist/cjs/snapshotEffect.d.ts +1 -1
  239. package/dist/cjs/snapshotEffect.d.ts.map +1 -1
  240. package/dist/cjs/snapshotEffect.js +36 -10
  241. package/dist/cjs/snapshotEffect.js.map +1 -1
  242. package/dist/cjs/struct.d.ts +5 -0
  243. package/dist/cjs/struct.d.ts.map +1 -0
  244. package/dist/cjs/struct.js +10 -0
  245. package/dist/cjs/struct.js.map +1 -0
  246. package/dist/cjs/switchMap.d.ts +1 -1
  247. package/dist/cjs/switchMap.d.ts.map +1 -1
  248. package/dist/cjs/switchMap.js.map +1 -1
  249. package/dist/cjs/switchMapCause.d.ts +3 -1
  250. package/dist/cjs/switchMapCause.d.ts.map +1 -1
  251. package/dist/cjs/switchMapCause.js +38 -3
  252. package/dist/cjs/switchMapCause.js.map +1 -1
  253. package/dist/cjs/switchMatch.d.ts +2 -1
  254. package/dist/cjs/switchMatch.d.ts.map +1 -1
  255. package/dist/cjs/switchMatch.js +26 -2
  256. package/dist/cjs/switchMatch.js.map +1 -1
  257. package/dist/cjs/takeWhile.d.ts.map +1 -1
  258. package/dist/cjs/takeWhile.js +27 -4
  259. package/dist/cjs/takeWhile.js.map +1 -1
  260. package/dist/cjs/tap.d.ts +1 -1
  261. package/dist/cjs/tap.d.ts.map +1 -1
  262. package/dist/cjs/tap.js +26 -3
  263. package/dist/cjs/tap.js.map +1 -1
  264. package/dist/cjs/tapCause.d.ts +2 -1
  265. package/dist/cjs/tapCause.d.ts.map +1 -1
  266. package/dist/cjs/tapCause.js +32 -5
  267. package/dist/cjs/tapCause.js.map +1 -1
  268. package/dist/cjs/test-utils.d.ts +1 -1
  269. package/dist/cjs/test-utils.d.ts.map +1 -1
  270. package/dist/cjs/test-utils.js +33 -8
  271. package/dist/cjs/test-utils.js.map +1 -1
  272. package/dist/cjs/throttle.d.ts +1 -1
  273. package/dist/cjs/throttle.d.ts.map +1 -1
  274. package/dist/cjs/throttle.js +25 -2
  275. package/dist/cjs/throttle.js.map +1 -1
  276. package/dist/cjs/toArray.d.ts +1 -1
  277. package/dist/cjs/toArray.d.ts.map +1 -1
  278. package/dist/cjs/toArray.js +26 -4
  279. package/dist/cjs/toArray.js.map +1 -1
  280. package/dist/cjs/toChunk.d.ts +2 -1
  281. package/dist/cjs/toChunk.d.ts.map +1 -1
  282. package/dist/cjs/toChunk.js +28 -4
  283. package/dist/cjs/toChunk.js.map +1 -1
  284. package/dist/cjs/toEnqueue.d.ts +6 -0
  285. package/dist/cjs/toEnqueue.d.ts.map +1 -0
  286. package/dist/cjs/toEnqueue.js +9 -0
  287. package/dist/cjs/toEnqueue.js.map +1 -0
  288. package/dist/cjs/toReadonlyArray.d.ts +1 -1
  289. package/dist/cjs/toReadonlyArray.d.ts.map +1 -1
  290. package/dist/cjs/toStream.d.ts +4 -0
  291. package/dist/cjs/toStream.d.ts.map +1 -0
  292. package/dist/cjs/toStream.js +35 -0
  293. package/dist/cjs/toStream.js.map +1 -0
  294. package/dist/combineAll.d.ts.map +1 -1
  295. package/dist/combineAll.js +5 -5
  296. package/dist/combineAll.js.map +1 -1
  297. package/dist/combineAllDiscard.d.ts.map +1 -1
  298. package/dist/combineAllDiscard.js +5 -5
  299. package/dist/combineAllDiscard.js.map +1 -1
  300. package/dist/continueWith.d.ts +1 -1
  301. package/dist/continueWith.d.ts.map +1 -1
  302. package/dist/continueWith.js +1 -1
  303. package/dist/continueWith.js.map +1 -1
  304. package/dist/data-first.d.ts +10 -0
  305. package/dist/data-first.d.ts.map +1 -1
  306. package/dist/data-first.js +10 -0
  307. package/dist/data-first.js.map +1 -1
  308. package/dist/debounce.d.ts +1 -1
  309. package/dist/debounce.d.ts.map +1 -1
  310. package/dist/debounce.js +1 -1
  311. package/dist/debounce.js.map +1 -1
  312. package/dist/delay.d.ts.map +1 -1
  313. package/dist/delay.js +1 -1
  314. package/dist/delay.js.map +1 -1
  315. package/dist/empty.js +1 -1
  316. package/dist/empty.js.map +1 -1
  317. package/dist/exhaustMap.d.ts +1 -1
  318. package/dist/exhaustMap.d.ts.map +1 -1
  319. package/dist/exhaustMap.js.map +1 -1
  320. package/dist/exhaustMapCause.d.ts +2 -1
  321. package/dist/exhaustMapCause.d.ts.map +1 -1
  322. package/dist/exhaustMapCause.js +3 -2
  323. package/dist/exhaustMapCause.js.map +1 -1
  324. package/dist/exhaustMapLatest.d.ts +1 -1
  325. package/dist/exhaustMapLatest.d.ts.map +1 -1
  326. package/dist/exhaustMapLatest.js.map +1 -1
  327. package/dist/exhaustMapLatestCause.d.ts +2 -1
  328. package/dist/exhaustMapLatestCause.d.ts.map +1 -1
  329. package/dist/exhaustMapLatestCause.js +3 -2
  330. package/dist/exhaustMapLatestCause.js.map +1 -1
  331. package/dist/failCause.d.ts +1 -0
  332. package/dist/failCause.d.ts.map +1 -1
  333. package/dist/failCause.js +3 -0
  334. package/dist/failCause.js.map +1 -1
  335. package/dist/filter.d.ts.map +1 -1
  336. package/dist/filter.js +2 -2
  337. package/dist/filter.js.map +1 -1
  338. package/dist/filterMap.d.ts +1 -1
  339. package/dist/filterMap.d.ts.map +1 -1
  340. package/dist/filterMap.js +3 -2
  341. package/dist/filterMap.js.map +1 -1
  342. package/dist/flatMap.d.ts +1 -1
  343. package/dist/flatMap.d.ts.map +1 -1
  344. package/dist/flatMap.js.map +1 -1
  345. package/dist/fromArray.d.ts.map +1 -1
  346. package/dist/fromArray.js +2 -2
  347. package/dist/fromArray.js.map +1 -1
  348. package/dist/fromDequeue.d.ts +5 -0
  349. package/dist/fromDequeue.d.ts.map +1 -0
  350. package/dist/fromDequeue.js +21 -0
  351. package/dist/fromDequeue.js.map +1 -0
  352. package/dist/fromEffect.d.ts +1 -1
  353. package/dist/fromEffect.d.ts.map +1 -1
  354. package/dist/fromEffect.js +11 -3
  355. package/dist/fromEffect.js.map +1 -1
  356. package/dist/fromEmitter.d.ts +2 -2
  357. package/dist/fromEmitter.d.ts.map +1 -1
  358. package/dist/fromEmitter.js +7 -6
  359. package/dist/fromEmitter.js.map +1 -1
  360. package/dist/fromFxEffect.d.ts +1 -1
  361. package/dist/fromFxEffect.d.ts.map +1 -1
  362. package/dist/fromFxEffect.js +2 -2
  363. package/dist/fromFxEffect.js.map +1 -1
  364. package/dist/fromHub.d.ts +5 -0
  365. package/dist/fromHub.d.ts.map +1 -0
  366. package/dist/fromHub.js +7 -0
  367. package/dist/fromHub.js.map +1 -0
  368. package/dist/fromIterable.d.ts.map +1 -1
  369. package/dist/fromIterable.js +2 -2
  370. package/dist/fromIterable.js.map +1 -1
  371. package/dist/fromStream.d.ts +4 -0
  372. package/dist/fromStream.d.ts.map +1 -0
  373. package/dist/fromStream.js +7 -0
  374. package/dist/fromStream.js.map +1 -0
  375. package/dist/gen.d.ts +1 -1
  376. package/dist/gen.d.ts.map +1 -1
  377. package/dist/gen.js +1 -1
  378. package/dist/gen.js.map +1 -1
  379. package/dist/helpers.d.ts +5 -3
  380. package/dist/helpers.d.ts.map +1 -1
  381. package/dist/helpers.js +34 -70
  382. package/dist/helpers.js.map +1 -1
  383. package/dist/hold.d.ts +5 -5
  384. package/dist/hold.d.ts.map +1 -1
  385. package/dist/hold.js +3 -5
  386. package/dist/hold.js.map +1 -1
  387. package/dist/index.d.ts +43 -2
  388. package/dist/index.d.ts.map +1 -1
  389. package/dist/index.js +132 -116
  390. package/dist/index.js.map +1 -1
  391. package/dist/keyed.d.ts.map +1 -1
  392. package/dist/keyed.js +33 -42
  393. package/dist/keyed.js.map +1 -1
  394. package/dist/map.d.ts.map +1 -1
  395. package/dist/map.js +1 -1
  396. package/dist/map.js.map +1 -1
  397. package/dist/mergeAll.d.ts.map +1 -1
  398. package/dist/mergeAll.js +4 -2
  399. package/dist/mergeAll.js.map +1 -1
  400. package/dist/mergeBufferConcurrently.d.ts +8 -0
  401. package/dist/mergeBufferConcurrently.d.ts.map +1 -0
  402. package/dist/mergeBufferConcurrently.js +68 -0
  403. package/dist/mergeBufferConcurrently.js.map +1 -0
  404. package/dist/mergeConcurrently.d.ts +3 -0
  405. package/dist/mergeConcurrently.d.ts.map +1 -0
  406. package/dist/mergeConcurrently.js +42 -0
  407. package/dist/mergeConcurrently.js.map +1 -0
  408. package/dist/multicast.d.ts +10 -8
  409. package/dist/multicast.d.ts.map +1 -1
  410. package/dist/multicast.js +17 -16
  411. package/dist/multicast.js.map +1 -1
  412. package/dist/never.d.ts.map +1 -1
  413. package/dist/never.js +2 -2
  414. package/dist/never.js.map +1 -1
  415. package/dist/observe.d.ts +4 -1
  416. package/dist/observe.d.ts.map +1 -1
  417. package/dist/observe.js +12 -7
  418. package/dist/observe.js.map +1 -1
  419. package/dist/onExit.d.ts +5 -0
  420. package/dist/onExit.d.ts.map +1 -0
  421. package/dist/onExit.js +6 -0
  422. package/dist/onExit.js.map +1 -0
  423. package/dist/onInterrupt.d.ts +1 -1
  424. package/dist/onInterrupt.d.ts.map +1 -1
  425. package/dist/onInterrupt.js +1 -1
  426. package/dist/onInterrupt.js.map +1 -1
  427. package/dist/orElse.d.ts +4 -0
  428. package/dist/orElse.d.ts.map +1 -0
  429. package/dist/orElse.js +7 -0
  430. package/dist/orElse.js.map +1 -0
  431. package/dist/promise.d.ts.map +1 -1
  432. package/dist/promise.js +5 -5
  433. package/dist/promise.js.map +1 -1
  434. package/dist/provide.d.ts +3 -2
  435. package/dist/provide.d.ts.map +1 -1
  436. package/dist/provide.js +8 -4
  437. package/dist/provide.js.map +1 -1
  438. package/dist/reduce.d.ts +2 -1
  439. package/dist/reduce.d.ts.map +1 -1
  440. package/dist/reduce.js +1 -1
  441. package/dist/reduce.js.map +1 -1
  442. package/dist/scan.d.ts.map +1 -1
  443. package/dist/scan.js +1 -1
  444. package/dist/scan.js.map +1 -1
  445. package/dist/scoped.d.ts +1 -1
  446. package/dist/scoped.d.ts.map +1 -1
  447. package/dist/scoped.js +1 -1
  448. package/dist/scoped.js.map +1 -1
  449. package/dist/skipRepeats.d.ts +1 -1
  450. package/dist/skipRepeats.d.ts.map +1 -1
  451. package/dist/skipRepeats.js +6 -7
  452. package/dist/skipRepeats.js.map +1 -1
  453. package/dist/skipWhile.d.ts.map +1 -1
  454. package/dist/skipWhile.js +2 -2
  455. package/dist/skipWhile.js.map +1 -1
  456. package/dist/slice.d.ts.map +1 -1
  457. package/dist/slice.js +4 -4
  458. package/dist/slice.js.map +1 -1
  459. package/dist/snapshotEffect.d.ts +1 -1
  460. package/dist/snapshotEffect.d.ts.map +1 -1
  461. package/dist/snapshotEffect.js +4 -1
  462. package/dist/snapshotEffect.js.map +1 -1
  463. package/dist/struct.d.ts +5 -0
  464. package/dist/struct.d.ts.map +1 -0
  465. package/dist/struct.js +6 -0
  466. package/dist/struct.js.map +1 -0
  467. package/dist/switchMap.d.ts +1 -1
  468. package/dist/switchMap.d.ts.map +1 -1
  469. package/dist/switchMap.js.map +1 -1
  470. package/dist/switchMapCause.d.ts +3 -1
  471. package/dist/switchMapCause.d.ts.map +1 -1
  472. package/dist/switchMapCause.js +13 -2
  473. package/dist/switchMapCause.js.map +1 -1
  474. package/dist/switchMatch.d.ts +2 -1
  475. package/dist/switchMatch.d.ts.map +1 -1
  476. package/dist/switchMatch.js +3 -2
  477. package/dist/switchMatch.js.map +1 -1
  478. package/dist/takeWhile.d.ts.map +1 -1
  479. package/dist/takeWhile.js +2 -2
  480. package/dist/takeWhile.js.map +1 -1
  481. package/dist/tap.d.ts +1 -1
  482. package/dist/tap.d.ts.map +1 -1
  483. package/dist/tap.js +2 -2
  484. package/dist/tap.js.map +1 -1
  485. package/dist/tapCause.d.ts +2 -1
  486. package/dist/tapCause.d.ts.map +1 -1
  487. package/dist/tapCause.js +7 -3
  488. package/dist/tapCause.js.map +1 -1
  489. package/dist/test-utils.d.ts +1 -1
  490. package/dist/test-utils.d.ts.map +1 -1
  491. package/dist/test-utils.js +5 -3
  492. package/dist/test-utils.js.map +1 -1
  493. package/dist/throttle.d.ts +1 -1
  494. package/dist/throttle.d.ts.map +1 -1
  495. package/dist/throttle.js +1 -1
  496. package/dist/throttle.js.map +1 -1
  497. package/dist/toArray.d.ts +1 -1
  498. package/dist/toArray.d.ts.map +1 -1
  499. package/dist/toArray.js +3 -4
  500. package/dist/toArray.js.map +1 -1
  501. package/dist/toChunk.d.ts +2 -1
  502. package/dist/toChunk.d.ts.map +1 -1
  503. package/dist/toChunk.js +2 -1
  504. package/dist/toChunk.js.map +1 -1
  505. package/dist/toEnqueue.d.ts +6 -0
  506. package/dist/toEnqueue.d.ts.map +1 -0
  507. package/dist/toEnqueue.js +5 -0
  508. package/dist/toEnqueue.js.map +1 -0
  509. package/dist/toReadonlyArray.d.ts +1 -1
  510. package/dist/toReadonlyArray.d.ts.map +1 -1
  511. package/dist/toStream.d.ts +4 -0
  512. package/dist/toStream.d.ts.map +1 -0
  513. package/dist/toStream.js +8 -0
  514. package/dist/toStream.js.map +1 -0
  515. package/dist/tsconfig.cjs.build.tsbuildinfo +1 -1
  516. package/package.json +5 -5
  517. package/src/Computed.ts +114 -0
  518. package/src/Filtered.ts +112 -0
  519. package/src/Fx.ts +17 -42
  520. package/src/RefArray.ts +226 -0
  521. package/src/RefSubject.test.ts +72 -7
  522. package/src/RefSubject.ts +606 -583
  523. package/src/RefTransform.ts +134 -0
  524. package/src/Subject.ts +6 -14
  525. package/src/at.ts +3 -2
  526. package/src/catchAllCause.test.ts +1 -1
  527. package/src/catchAllCause.ts +46 -3
  528. package/src/combineAll.ts +18 -14
  529. package/src/combineAllDiscard.ts +18 -14
  530. package/src/continueWith.ts +2 -1
  531. package/src/data-first.ts +10 -0
  532. package/src/debounce.test.ts +1 -1
  533. package/src/debounce.ts +3 -2
  534. package/src/delay.test.ts +1 -1
  535. package/src/delay.ts +1 -1
  536. package/src/empty.ts +1 -1
  537. package/src/exhaustMap.test.ts +1 -1
  538. package/src/exhaustMap.ts +2 -1
  539. package/src/exhaustMapCause.test.ts +1 -1
  540. package/src/exhaustMapCause.ts +4 -2
  541. package/src/exhaustMapLatest.test.ts +1 -1
  542. package/src/exhaustMapLatest.ts +2 -1
  543. package/src/exhaustMapLatestCause.test.ts +1 -1
  544. package/src/exhaustMapLatestCause.ts +4 -2
  545. package/src/failCause.test.ts +2 -1
  546. package/src/failCause.ts +4 -0
  547. package/src/filter.ts +2 -4
  548. package/src/filterMap.ts +11 -2
  549. package/src/flatMap.test.ts +1 -1
  550. package/src/flatMap.ts +2 -1
  551. package/src/fromArray.ts +3 -2
  552. package/src/fromDequeue.ts +39 -0
  553. package/src/fromEffect.test.ts +2 -1
  554. package/src/fromEffect.ts +14 -3
  555. package/src/fromEmitter.test.ts +2 -1
  556. package/src/fromEmitter.ts +8 -12
  557. package/src/fromFxEffect.test.ts +2 -1
  558. package/src/fromFxEffect.ts +5 -2
  559. package/src/fromHub.ts +10 -0
  560. package/src/fromIterable.ts +3 -2
  561. package/src/gen.test.ts +2 -1
  562. package/src/gen.ts +2 -1
  563. package/src/helpers.ts +79 -108
  564. package/src/hold.test.ts +1 -1
  565. package/src/hold.ts +4 -8
  566. package/src/index.ts +580 -609
  567. package/src/keyed.ts +82 -81
  568. package/src/map.ts +2 -1
  569. package/src/mergeAll.ts +12 -6
  570. package/src/mergeBufferConcurrently.test.ts +37 -0
  571. package/src/mergeBufferConcurrently.ts +105 -0
  572. package/src/mergeConcurrently.test.ts +20 -0
  573. package/src/mergeConcurrently.ts +57 -0
  574. package/src/multicast.test.ts +2 -1
  575. package/src/multicast.ts +34 -24
  576. package/src/never.ts +3 -2
  577. package/src/observe.ts +20 -9
  578. package/src/onExit.ts +13 -0
  579. package/src/onInterrupt.ts +1 -1
  580. package/src/orElse.ts +16 -0
  581. package/src/promise.ts +6 -5
  582. package/src/provide.ts +14 -10
  583. package/src/reduce.ts +3 -1
  584. package/src/scan.ts +2 -1
  585. package/src/scoped.ts +3 -1
  586. package/src/skipRepeats.ts +7 -8
  587. package/src/skipWhile.ts +2 -2
  588. package/src/slice.ts +5 -4
  589. package/src/snapshotEffect.ts +5 -1
  590. package/src/struct.ts +18 -0
  591. package/src/switchMap.test.ts +1 -1
  592. package/src/switchMap.ts +2 -1
  593. package/src/switchMapCause.test.ts +1 -1
  594. package/src/switchMapCause.ts +20 -2
  595. package/src/switchMatch.test.ts +1 -1
  596. package/src/switchMatch.ts +4 -2
  597. package/src/takeWhile.ts +3 -3
  598. package/src/tap.ts +7 -2
  599. package/src/tapCause.ts +10 -7
  600. package/src/test-utils.ts +5 -3
  601. package/src/throttle.test.ts +1 -1
  602. package/src/throttle.ts +3 -1
  603. package/src/toArray.ts +6 -5
  604. package/src/toChunk.ts +2 -1
  605. package/src/toEnqueue.ts +13 -0
  606. package/src/toReadonlyArray.ts +1 -1
  607. package/tsconfig.build.json +2 -1
  608. package/tsconfig.build.tsbuildinfo +1 -1
  609. package/vite.config.js +3 -0
  610. package/src/externals.ts +0 -18
package/src/keyed.ts CHANGED
@@ -1,14 +1,16 @@
1
1
  import * as MutableHashMap from '@effect/data/MutableHashMap'
2
2
  import * as Option from '@effect/data/Option'
3
3
  import * as ReadonlyArray from '@effect/data/ReadonlyArray'
4
+ import * as Cause from '@effect/io/Cause'
4
5
  import * as Effect from '@effect/io/Effect'
5
6
  import * as Fiber from '@effect/io/Fiber'
7
+ import * as Scope from '@effect/io/Scope'
6
8
 
7
9
  import { Fx, Sink } from './Fx.js'
8
- import { RefSubject } from './RefSubject.js'
10
+ import { RefSubject, makeRef } from './RefSubject.js'
9
11
  import { Subject, makeHoldSubject } from './Subject.js'
10
- import { Cause } from './externals.js'
11
12
  import { ScopedFork, withScopedFork } from './helpers.js'
13
+ import { skipRepeats } from './skipRepeats.js'
12
14
 
13
15
  export function keyed<R, E, A, R2, E2, B, C>(
14
16
  fx: Fx<R, E, readonly A[]>,
@@ -16,42 +18,38 @@ export function keyed<R, E, A, R2, E2, B, C>(
16
18
  getKey: (a: A) => C,
17
19
  ): Fx<R | R2, E | E2, readonly B[]> {
18
20
  return Fx(<R3>(sink: Sink<R3, E | E2, readonly B[]>) =>
19
- withScopedFork((fork) =>
21
+ withScopedFork((fork, scope) =>
20
22
  Effect.gen(function* ($) {
21
23
  const state = createKeyedState<A, B, C>()
22
24
  const emit = emitWhenReady(state, getKey)
23
25
 
24
- // Let output emit to the sink
25
- yield* $(fork(state.output.run(sink)))
26
-
27
- const params: Omit<UpdateStateParams<A, B, C, R2, E2, R3>, 'updated'> = {
28
- state,
29
- getKey,
30
- f,
31
- fork,
32
- emit,
33
- error: sink.error,
34
- }
26
+ // Let output emit to the sink, it is closes by the surrounding scope
27
+ yield* $(fork(skipRepeats(state.output).run(sink)))
35
28
 
36
29
  // Listen to the input and update the state
37
30
  yield* $(
38
31
  fx.run(
39
32
  Sink(
40
- (updated) =>
33
+ (as) =>
41
34
  updateState({
42
- ...params,
43
- updated,
35
+ state,
36
+ updated: as,
37
+ getKey,
38
+ f,
39
+ fork,
40
+ scope,
41
+ emit,
42
+ error: sink.error,
44
43
  }),
45
44
  sink.error,
46
45
  ),
47
46
  ),
48
47
  )
49
48
 
49
+ yield* $(endAll(state))
50
+
50
51
  // When the source stream ends we wait for the remaining fibers to end
51
52
  yield* $(Fiber.joinAll(Array.from(state.fibers).map((x) => x[1])))
52
-
53
- // Send end signals to all Fx listening to subjects to allow finalization
54
- yield* $(endAll(state))
55
53
  }),
56
54
  ),
57
55
  )
@@ -78,42 +76,56 @@ function createKeyedState<A, B, C>(): KeyedState<A, B, C> {
78
76
  }
79
77
  }
80
78
 
81
- type UpdateStateParams<A, B, C, R2, E2, R3> = {
79
+ function updateState<A, B, C, R2, E2, R3>({
80
+ state,
81
+ updated,
82
+ f,
83
+ fork,
84
+ scope,
85
+ emit,
86
+ error,
87
+ getKey,
88
+ }: {
82
89
  state: KeyedState<A, B, C>
83
90
  updated: readonly A[]
84
91
  f: (fx: RefSubject<never, A>) => Fx<R2, E2, B>
85
- getKey: (a: A) => C
86
92
  fork: ScopedFork
87
- error: (e: Cause.Cause<E2>) => Effect.Effect<R3, never, void>
93
+ scope: Scope.Scope
88
94
  emit: Effect.Effect<never, never, void>
89
- }
90
-
91
- function updateState<A, B, C, R2, E2, R3>(params: UpdateStateParams<A, B, C, R2, E2, R3>) {
92
- const { state, updated, emit, getKey } = params
93
-
94
- return Effect.gen(function* ($) {
95
- const { added, removed, unchanged } = diffValues(state, updated, getKey)
96
-
97
- // Remove values that are no longer in the stream
98
- if (removed.length > 0) {
99
- yield* $(Effect.forEachDiscard(removed, (key) => removeValue(state, key)))
100
- }
101
-
102
- // Add values that are new to the stream
103
- if (added.length > 0) {
104
- yield* $(Effect.forEachDiscard(added, (value) => addValue({ ...params, value })))
105
- }
106
-
107
- // Update values that are still in the stream
108
- if (unchanged.length > 0) {
109
- yield* $(Effect.forEachDiscard(unchanged, (value) => updateValue(state, value, getKey)))
110
- }
111
-
112
- // If nothing was added, emit the current values
113
- if (added.length === 0) {
114
- yield* $(emit)
115
- }
116
- })
95
+ error: (e: Cause.Cause<E2>) => Effect.Effect<R3, never, void>
96
+ getKey: (a: A) => C
97
+ }) {
98
+ return Effect.provideService(
99
+ Effect.gen(function* ($) {
100
+ const { added, removed, unchanged } = diffValues(state, updated, getKey)
101
+
102
+ // Remove values that are no longer in the stream
103
+ yield* $(Effect.forEach(removed, (key) => removeValue(state, key), { discard: true }))
104
+
105
+ // Update values that are still in the stream
106
+ yield* $(
107
+ Effect.forEach(unchanged, (value) => updateValue(state, value, getKey), {
108
+ concurrency: 'unbounded',
109
+ discard: true,
110
+ }),
111
+ )
112
+
113
+ // Add values that are new to the stream
114
+ yield* $(
115
+ Effect.forEach(added, (value) => addValue({ state, value, f, fork, emit, error, getKey }), {
116
+ concurrency: 'unbounded',
117
+ discard: true,
118
+ }),
119
+ )
120
+
121
+ // If nothing was added, emit the current values
122
+ if (added.length === 0) {
123
+ yield* $(emit)
124
+ }
125
+ }),
126
+ Scope.Scope,
127
+ scope,
128
+ )
117
129
  }
118
130
 
119
131
  function diffValues<A, B, C>(
@@ -121,23 +133,11 @@ function diffValues<A, B, C>(
121
133
  updated: ReadonlyArray<A>,
122
134
  getKey: (a: A) => C,
123
135
  ) {
124
- const previousKeys = state.previousKeys
125
- const keys = new Set<C>(updated.map(getKey))
126
-
127
- state.previous = updated
128
- state.previousKeys = keys
129
-
130
- if (previousKeys.size === 0) {
131
- return {
132
- added: updated,
133
- unchanged: [],
134
- removed: [],
135
- }
136
- }
137
-
138
136
  const added: A[] = []
139
137
  const unchanged: A[] = []
140
138
  const removed: C[] = []
139
+ const previousKeys = state.previousKeys
140
+ const keys = new Set<C>(updated.map(getKey))
141
141
 
142
142
  for (let i = 0; i < updated.length; ++i) {
143
143
  const value = updated[i]
@@ -156,6 +156,9 @@ function diffValues<A, B, C>(
156
156
  }
157
157
  })
158
158
 
159
+ state.previous = updated
160
+ state.previousKeys = keys
161
+
159
162
  return {
160
163
  added,
161
164
  unchanged,
@@ -179,16 +182,6 @@ function removeValue<A, B, C>(state: KeyedState<A, B, C>, key: C) {
179
182
  })
180
183
  }
181
184
 
182
- type AddValueParams<A, B, C, R2, E2, R3> = {
183
- state: KeyedState<A, B, C>
184
- value: A
185
- f: (fx: RefSubject<never, A>) => Fx<R2, E2, B>
186
- fork: ScopedFork
187
- emit: Effect.Effect<never, never, void>
188
- error: (e: Cause.Cause<E2>) => Effect.Effect<R3, never, void>
189
- getKey: (a: A) => C
190
- }
191
-
192
185
  function addValue<A, B, C, R2, E2, R3>({
193
186
  state,
194
187
  value,
@@ -197,10 +190,18 @@ function addValue<A, B, C, R2, E2, R3>({
197
190
  emit,
198
191
  error,
199
192
  getKey,
200
- }: AddValueParams<A, B, C, R2, E2, R3>) {
193
+ }: {
194
+ state: KeyedState<A, B, C>
195
+ value: A
196
+ f: (fx: RefSubject<never, A>) => Fx<R2, E2, B>
197
+ fork: ScopedFork
198
+ emit: Effect.Effect<never, never, void>
199
+ error: (e: Cause.Cause<E2>) => Effect.Effect<R3, never, void>
200
+ getKey: (a: A) => C
201
+ }) {
201
202
  return Effect.gen(function* ($) {
202
203
  const key = getKey(value)
203
- const subject = RefSubject.unsafeMake<never, A>(Effect.succeed(value))
204
+ const subject = yield* $(makeRef<never, never, A>(Effect.succeed(value)))
204
205
  const fx = f(subject)
205
206
  const fiber = yield* $(
206
207
  fork(
@@ -237,7 +238,7 @@ function emitWhenReady<A, B, C>(state: KeyedState<A, B, C>, getKey: (a: A) => C)
237
238
  return Effect.suspend(() => {
238
239
  // Fast path: if we don't have enough values, don't emit
239
240
  if (MutableHashMap.size(state.values) !== state.previous.length) {
240
- return Effect.unit()
241
+ return Effect.unit
241
242
  }
242
243
 
243
244
  const values = ReadonlyArray.filterMap(state.previous, (value) =>
@@ -249,12 +250,12 @@ function emitWhenReady<A, B, C>(state: KeyedState<A, B, C>, getKey: (a: A) => C)
249
250
  return state.output.event(values)
250
251
  }
251
252
 
252
- return Effect.unit()
253
+ return Effect.unit
253
254
  })
254
255
  }
255
256
 
256
257
  function endAll<A, B, C>(state: KeyedState<A, B, C>) {
257
- return Effect.gen(function* ($) {
258
- yield* $(Effect.forEachParDiscard(state.subjects, ([, subject]) => subject.end()))
258
+ return Effect.forEach(state.subjects, ([, subject]) => subject.end(), {
259
+ concurrency: 'unbounded',
259
260
  })
260
261
  }
package/src/map.ts CHANGED
@@ -1,5 +1,6 @@
1
+ import * as Effect from '@effect/io/Effect'
2
+
1
3
  import { Fx, Sink } from './Fx.js'
2
- import { Effect } from './externals.js'
3
4
 
4
5
  export function map<R, E, A, B>(fx: Fx<R, E, A>, f: (a: A) => B): Fx<R, E, B> {
5
6
  return Fx((sink) => fx.run(Sink((a) => Effect.suspend(() => sink.event(f(a))), sink.error)))
package/src/mergeAll.ts CHANGED
@@ -1,5 +1,8 @@
1
+ import * as Option from '@effect/data/Option'
2
+ import * as Cause from '@effect/io/Cause'
3
+ import * as Effect from '@effect/io/Effect'
4
+
1
5
  import { Fx, Sink } from './Fx.js'
2
- import { Cause, Effect, Option } from './externals.js'
3
6
  import { compact } from './filterMap.js'
4
7
  import { map } from './map.js'
5
8
 
@@ -7,12 +10,15 @@ export function mergeAll<FXS extends ReadonlyArray<Fx<any, any, any>>>(
7
10
  ...fxs: FXS
8
11
  ): Fx<Fx.ResourcesOf<FXS[number]>, Fx.ErrorsOf<FXS[number]>, Fx.OutputOf<FXS[number]>> {
9
12
  return Fx((sink) =>
10
- Effect.forEachParDiscard(fxs, (fx) =>
11
- fx.run(
12
- Sink(sink.event, (cause) =>
13
- Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
13
+ Effect.forEach(
14
+ fxs,
15
+ (fx) =>
16
+ fx.run(
17
+ Sink(sink.event, (cause) =>
18
+ Cause.isInterruptedOnly(cause) ? Effect.unit : sink.error(cause),
19
+ ),
14
20
  ),
15
- ),
21
+ { concurrency: 'unbounded', discard: true },
16
22
  ),
17
23
  )
18
24
  }
@@ -0,0 +1,37 @@
1
+ import { millis } from '@effect/data/Duration'
2
+ import { describe } from 'vitest'
3
+
4
+ import { at } from './at.js'
5
+ import { fromArray } from './fromArray.js'
6
+ import { mergeAll } from './mergeAll.js'
7
+ import { mergeBufferConcurrently } from './mergeBufferConcurrently.js'
8
+ import { testCollectAll } from './test-utils.js'
9
+
10
+ describe(__filename, () => {
11
+ describe(mergeBufferConcurrently.name, () => {
12
+ testCollectAll(
13
+ 'buffers values until the previous stream completes',
14
+ mergeBufferConcurrently(
15
+ at(1, millis(50)),
16
+ mergeAll(at(2, millis(0)), at(3, millis(20)), at(4, millis(40))),
17
+ ),
18
+ [1, 2, 3, 4],
19
+ )
20
+
21
+ testCollectAll(
22
+ 'emits immediately if previous stream has ended',
23
+ mergeBufferConcurrently(
24
+ at(1, millis(0)),
25
+ mergeAll(at(2, millis(5)), at(3, millis(10)), at(4, millis(20))),
26
+ mergeAll(at(5, millis(0)), at(6, millis(5)), at(7, millis(10))),
27
+ ),
28
+ [1, 2, 3, 4, 5, 6, 7],
29
+ )
30
+
31
+ testCollectAll(
32
+ 'merges multiple synchronous streams',
33
+ mergeBufferConcurrently(fromArray([1, 2, 3]), fromArray([4, 5, 6])),
34
+ [1, 2, 3, 4, 5, 6],
35
+ )
36
+ })
37
+ })
@@ -0,0 +1,105 @@
1
+ import * as Chunk from '@effect/data/Chunk'
2
+ import * as Effect from '@effect/io/Effect'
3
+
4
+ import { Fx, Sink } from './Fx.js'
5
+ import { empty } from './empty.js'
6
+
7
+ /**
8
+ * Merges n Fx concurrently, emitting the values in order of the streams are provided.
9
+ * For example, Fx at index 0 will emit all of its values first, when it completes, Fx at index 1 will emit all of its values, and so on.
10
+ * When there is asynchrony, the indexes which are not yet ready are buffered.
11
+ */
12
+ export function mergeBufferConcurrently<FXS extends Fx.TupleAny>(
13
+ ...fxs: FXS
14
+ ): Fx<Fx.ResourcesOf<FXS[number]>, Fx.ErrorsOf<FXS[number]>, Fx.OutputOf<FXS[number]>> {
15
+ if (fxs.length === 0) return empty()
16
+ if (fxs.length === 1) return fxs[0]
17
+
18
+ return Fx(<R2>(sink: Sink<R2, Fx.ErrorsOf<FXS[number]>, Fx.OutputOf<FXS[number]>>) =>
19
+ Effect.suspend(() => {
20
+ type O = Fx.OutputOf<FXS[number]>
21
+
22
+ const finished = new Map<number, Chunk.Chunk<O>>()
23
+ let currentIndex = 0
24
+
25
+ function onFinished(index: number, buffer: Chunk.Chunk<O>): Effect.Effect<R2, never, void> {
26
+ if (currentIndex < index) {
27
+ // If the current index is behind, buffer the value
28
+ return Effect.sync(() => {
29
+ finished.set(index, buffer)
30
+ })
31
+ }
32
+
33
+ if (Chunk.size(buffer) === 0) {
34
+ return next(index)
35
+ }
36
+
37
+ return Effect.flatMap(Effect.all(Chunk.map(buffer, sink.event)), () => next(index))
38
+ }
39
+
40
+ function next(index: number): Effect.Effect<R2, never, void> {
41
+ finished.delete(index)
42
+
43
+ const nextIndex = ++currentIndex
44
+
45
+ if (finished.has(nextIndex)) {
46
+ return onFinished(nextIndex, finished.get(nextIndex) as Chunk.Chunk<O>)
47
+ }
48
+
49
+ return Effect.unit
50
+ }
51
+
52
+ return Effect.asUnit(
53
+ Effect.all(
54
+ fxs.map((fx, index) =>
55
+ Effect.suspend(() => {
56
+ if (index === currentIndex) return Effect.flatMap(fx.run(sink), () => next(index))
57
+
58
+ let buffer: Chunk.Chunk<O> = Chunk.empty()
59
+ let isEmitting = false
60
+
61
+ return Effect.flatMap(
62
+ fx.run(
63
+ Sink(
64
+ (o) =>
65
+ Effect.suspend(
66
+ Effect.unifiedFn(() => {
67
+ // The current index is emitting now
68
+ if (isEmitting) {
69
+ return sink.event(o)
70
+ }
71
+
72
+ // This index is ready to emit values
73
+ if (index === currentIndex) {
74
+ if (Chunk.size(buffer) === 0) return sink.event(o)
75
+
76
+ // Drain the current buffer first
77
+ const toEmit = Chunk.append(buffer, o)
78
+ // Clear the buffer
79
+ buffer = Chunk.empty()
80
+ // Fast-path for remaining values
81
+ isEmitting = true
82
+
83
+ // Emit the values
84
+ return Effect.all(Chunk.map(toEmit, sink.event))
85
+ }
86
+
87
+ // Otherwise, buffer the value
88
+ buffer = Chunk.append(buffer, o)
89
+
90
+ return Effect.unit
91
+ }),
92
+ ),
93
+ sink.error,
94
+ ),
95
+ ),
96
+ () => (isEmitting ? next(index) : onFinished(index, buffer)),
97
+ )
98
+ }),
99
+ ),
100
+ { concurrency: 'unbounded' },
101
+ ),
102
+ )
103
+ }),
104
+ )
105
+ }
@@ -0,0 +1,20 @@
1
+ import { millis } from '@effect/data/Duration'
2
+ import { describe } from 'vitest'
3
+
4
+ import { at } from './at.js'
5
+ import { mergeAll } from './mergeAll.js'
6
+ import { mergeConcurrently } from './mergeConcurrently.js'
7
+ import { testCollectAll } from './test-utils.js'
8
+
9
+ describe(__filename, () => {
10
+ describe(mergeConcurrently.name, () => {
11
+ testCollectAll(
12
+ 'merges multiple streams together taking 1 value from each in order, but always the latest value from each stream',
13
+ mergeConcurrently(
14
+ at(1, millis(100)),
15
+ mergeAll(at(2, millis(0)), at(3, millis(30)), at(4, millis(60))),
16
+ ),
17
+ [1, 4],
18
+ )
19
+ })
20
+ })
@@ -0,0 +1,57 @@
1
+ import * as Effect from '@effect/io/Effect'
2
+ import * as Fiber from '@effect/io/Fiber'
3
+
4
+ import { Fx, Sink } from './Fx.js'
5
+ import { empty } from './empty.js'
6
+
7
+ export function mergeConcurrently<FXS extends ReadonlyArray<Fx<any, any, any>>>(
8
+ ...fxs: FXS
9
+ ): Fx<Fx.ResourcesOf<FXS[number]>, Fx.ErrorsOf<FXS[number]>, Fx.OutputOf<FXS[number]>> {
10
+ if (fxs.length === 0) return empty()
11
+ if (fxs.length === 1) return fxs[0]
12
+
13
+ return Fx(<R2>(sink: Sink<R2, Fx.ErrorsOf<FXS[number]>, Fx.OutputOf<FXS[number]>>) =>
14
+ Effect.gen(function* ($) {
15
+ let currentIndex = 0
16
+ const values = new Map<number, Fx.OutputOf<FXS[number]>>()
17
+ const fibers: Fiber.Fiber<never, void>[] = []
18
+
19
+ for (let i = 0; i < fxs.length; ++i) {
20
+ fibers[i] = yield* $(
21
+ Effect.fork(fxs[i].run(Sink((value) => onValue(i, value), sink.error))),
22
+ )
23
+ }
24
+
25
+ function emit(index: number): Effect.Effect<R2, never, void> {
26
+ if (index === currentIndex && values.has(index)) {
27
+ return Effect.gen(function* ($) {
28
+ // Send this value to the sink
29
+ yield* $(sink.event(values.get(index) as Fx.OutputOf<FXS[number]>))
30
+
31
+ // Interrupt the underlying Fiber
32
+ yield* $(Fiber.interruptFork(fibers[index]))
33
+
34
+ const next = ++currentIndex
35
+
36
+ // If there's a value for the next index, emit it
37
+ if (values.has(next)) {
38
+ yield* $(emit(next))
39
+ }
40
+ })
41
+ }
42
+
43
+ return Effect.unit
44
+ }
45
+
46
+ function onValue(index: number, value: Fx.OutputOf<FXS[number]>) {
47
+ return Effect.suspend(() => {
48
+ values.set(index, value)
49
+
50
+ return emit(index)
51
+ })
52
+ }
53
+
54
+ yield* $(Fiber.joinAll(fibers))
55
+ }),
56
+ )
57
+ }
@@ -1,10 +1,11 @@
1
+ import * as Chunk from '@effect/data/Chunk'
2
+ import * as Duration from '@effect/data/Duration'
1
3
  import { pipe } from '@effect/data/Function'
2
4
  import * as Effect from '@effect/io/Effect'
3
5
  import * as Fiber from '@effect/io/Fiber'
4
6
  import { describe, it, expect } from 'vitest'
5
7
 
6
8
  import { delay } from './delay.js'
7
- import { Chunk, Duration } from './externals.js'
8
9
  import { flatMap } from './flatMap.js'
9
10
  import { fromArray } from './fromArray.js'
10
11
  import { merge } from './mergeAll.js'
package/src/multicast.ts CHANGED
@@ -1,10 +1,11 @@
1
- import type { Trace } from '@effect/data/Debug'
1
+ import type * as Context from '@effect/data/Context'
2
2
  import { identity } from '@effect/data/Function'
3
+ import type * as Cause from '@effect/io/Cause'
4
+ import * as Effect from '@effect/io/Effect'
5
+ import * as Fiber from '@effect/io/Fiber'
3
6
 
7
+ import { FxTypeId } from './Fx.js'
4
8
  import type { Fx, Sink } from './Fx.js'
5
- import { FxTypeId, Traced } from './Fx.js'
6
- import type { Cause, Context } from './externals.js'
7
- import { Effect, Fiber } from './externals.js'
8
9
 
9
10
  export function multicast<R, E, A>(fx: Fx<R, E, A>): Fx<R, E, A> {
10
11
  return new MulticastFx(fx)
@@ -22,8 +23,10 @@ export class MulticastFx<R, E, A> implements Fx<R, E, A>, Sink<never, E, A> {
22
23
  _A: identity,
23
24
  }
24
25
 
25
- protected observers: Array<MulticastObserver<any, E, A>> = []
26
- protected fiber: Fiber.RuntimeFiber<never, void> | undefined
26
+ /**@internal */
27
+ public observers: Array<MulticastObserver<any, E, A>> = []
28
+ /**@internal */
29
+ public fiber: Fiber.RuntimeFiber<never, void> | undefined
27
30
 
28
31
  constructor(readonly fx: Fx<R, E, A>) {
29
32
  this.run = this.run.bind(this)
@@ -37,40 +40,47 @@ export class MulticastFx<R, E, A> implements Fx<R, E, A>, Sink<never, E, A> {
37
40
  // eslint-disable-next-line @typescript-eslint/no-this-alias
38
41
  const that = this
39
42
 
40
- return Effect.gen(function* ($) {
41
- const context = yield* $(Effect.context<R2>())
42
- const observer: MulticastObserver<R2, E, A> = { sink, context }
43
+ return Effect.flatMap(Effect.context<R2>(), (context) =>
44
+ Effect.suspend(() => {
45
+ const observer: MulticastObserver<R2, E, A> = { sink, context }
43
46
 
44
- if (observers.push(observer) === 1) {
45
- that.fiber = yield* $(Effect.forkDaemon(that.fx.run(that)))
46
- }
47
+ const effects: Array<Effect.Effect<R, never, void>> = []
47
48
 
48
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
49
- yield* $(Effect.ensuring(Fiber.await(that.fiber!), that.removeSink(sink)))
50
- })
51
- }
49
+ if (observers.push(observer) === 1) {
50
+ effects.push(
51
+ Effect.tap(Effect.forkDaemon(that.fx.run(that)), (fiber) =>
52
+ Effect.sync(() => (that.fiber = fiber)),
53
+ ),
54
+ )
55
+ }
52
56
 
53
- readonly addTrace = (trace: Trace): Fx<R, E, A> => {
54
- return Traced<R, E, A>(this.fx, trace)
57
+ effects.push(
58
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
59
+ Effect.suspend(() => Effect.ensuring(Fiber.await(that.fiber!), that.removeSink(sink))),
60
+ )
61
+
62
+ return Effect.all(effects)
63
+ }),
64
+ )
55
65
  }
56
66
 
57
67
  event(a: A) {
58
68
  if (this.observers.length === 0) {
59
- return Effect.unit()
69
+ return Effect.unit
60
70
  }
61
71
 
62
72
  return Effect.suspend(() =>
63
- Effect.forEachDiscard(this.observers.slice(0), (observer) => this.runEvent(observer, a)),
73
+ Effect.forEach(this.observers.slice(0), (observer) => this.runEvent(observer, a)),
64
74
  )
65
75
  }
66
76
 
67
77
  error(cause: Cause.Cause<E>) {
68
78
  if (this.observers.length === 0) {
69
- return Effect.unit()
79
+ return Effect.unit
70
80
  }
71
81
 
72
82
  return Effect.suspend(() =>
73
- Effect.forEachDiscard(this.observers.slice(0), (observer) => this.runError(observer, cause)),
83
+ Effect.forEach(this.observers.slice(0), (observer) => this.runError(observer, cause)),
74
84
  )
75
85
  }
76
86
 
@@ -92,7 +102,7 @@ export class MulticastFx<R, E, A> implements Fx<R, E, A>, Sink<never, E, A> {
92
102
  return Effect.suspend(() => {
93
103
  const { observers } = this
94
104
 
95
- if (observers.length === 0) return Effect.unit()
105
+ if (observers.length === 0) return Effect.unit
96
106
 
97
107
  const index = observers.findIndex((o) => o.sink === sink)
98
108
 
@@ -109,7 +119,7 @@ export class MulticastFx<R, E, A> implements Fx<R, E, A>, Sink<never, E, A> {
109
119
  }
110
120
  }
111
121
 
112
- return Effect.unit()
122
+ return Effect.unit
113
123
  })
114
124
  }
115
125
  }
package/src/never.ts CHANGED
@@ -1,6 +1,7 @@
1
+ import * as Effect from '@effect/io/Effect'
2
+
1
3
  import { Fx } from './Fx.js'
2
- import { Effect } from './externals.js'
3
4
 
4
5
  export function never<E = never, A = never>(): Fx<never, E, A> {
5
- return Fx<never, E, A>(() => Effect.never())
6
+ return Fx<never, E, A>(() => Effect.never)
6
7
  }