@typed/fx 0.0.9 → 0.0.12

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 (539) hide show
  1. package/.eslintcache +1 -1
  2. package/cjs/Fx.d.ts +19 -8
  3. package/cjs/Fx.d.ts.map +1 -1
  4. package/cjs/Fx.js +12 -2
  5. package/cjs/Fx.js.map +1 -1
  6. package/cjs/Subject.d.ts +22 -0
  7. package/cjs/Subject.d.ts.map +1 -0
  8. package/cjs/Subject.js +58 -0
  9. package/cjs/Subject.js.map +1 -0
  10. package/cjs/_internal.d.ts +19 -20
  11. package/cjs/_internal.d.ts.map +1 -1
  12. package/cjs/_internal.js +21 -76
  13. package/cjs/_internal.js.map +1 -1
  14. package/cjs/combine.d.ts +4 -4
  15. package/cjs/combine.d.ts.map +1 -1
  16. package/cjs/combine.js +9 -13
  17. package/cjs/combine.js.map +1 -1
  18. package/cjs/continueWith.d.ts +2 -2
  19. package/cjs/continueWith.d.ts.map +1 -1
  20. package/cjs/continueWith.js +2 -3
  21. package/cjs/continueWith.js.map +1 -1
  22. package/cjs/debounce.d.ts +2 -11
  23. package/cjs/debounce.d.ts.map +1 -1
  24. package/cjs/debounce.js +4 -24
  25. package/cjs/debounce.js.map +1 -1
  26. package/cjs/delay.d.ts +2 -2
  27. package/cjs/delay.d.ts.map +1 -1
  28. package/cjs/delay.js +4 -5
  29. package/cjs/delay.js.map +1 -1
  30. package/cjs/during.d.ts +1 -1
  31. package/cjs/during.d.ts.map +1 -1
  32. package/cjs/during.js +6 -9
  33. package/cjs/during.js.map +1 -1
  34. package/cjs/filterLoop.d.ts +25 -0
  35. package/cjs/filterLoop.d.ts.map +1 -0
  36. package/cjs/filterLoop.js +108 -0
  37. package/cjs/filterLoop.js.map +1 -0
  38. package/cjs/filterMap.d.ts +24 -0
  39. package/cjs/filterMap.d.ts.map +1 -0
  40. package/cjs/{map.js → filterMap.js} +27 -40
  41. package/cjs/filterMap.js.map +1 -0
  42. package/cjs/flatMap.d.ts +2 -10
  43. package/cjs/flatMap.d.ts.map +1 -1
  44. package/cjs/flatMap.js +10 -25
  45. package/cjs/flatMap.js.map +1 -1
  46. package/cjs/flatMapConcurrently.d.ts +2 -2
  47. package/cjs/flatMapConcurrently.d.ts.map +1 -1
  48. package/cjs/flatMapConcurrently.js +3 -3
  49. package/cjs/flatMapConcurrently.js.map +1 -1
  50. package/cjs/fromEffect.d.ts +34 -15
  51. package/cjs/fromEffect.d.ts.map +1 -1
  52. package/cjs/fromEffect.js +28 -15
  53. package/cjs/fromEffect.js.map +1 -1
  54. package/cjs/fromIterable.d.ts +9 -0
  55. package/cjs/fromIterable.d.ts.map +1 -0
  56. package/cjs/{drain.js → fromIterable.js} +14 -13
  57. package/cjs/fromIterable.js.map +1 -0
  58. package/cjs/hold.d.ts +16 -17
  59. package/cjs/hold.d.ts.map +1 -1
  60. package/cjs/hold.js +28 -25
  61. package/cjs/hold.js.map +1 -1
  62. package/cjs/index.d.ts +19 -15
  63. package/cjs/index.d.ts.map +1 -1
  64. package/cjs/index.js +19 -28
  65. package/cjs/index.js.map +1 -1
  66. package/cjs/mapCause.d.ts +5 -0
  67. package/cjs/mapCause.d.ts.map +1 -0
  68. package/cjs/mapCause.js +41 -0
  69. package/cjs/mapCause.js.map +1 -0
  70. package/cjs/mapEffect.d.ts +4 -0
  71. package/cjs/mapEffect.d.ts.map +1 -0
  72. package/cjs/{never.js → mapEffect.js} +6 -4
  73. package/cjs/mapEffect.js.map +1 -0
  74. package/cjs/merge.d.ts +3 -3
  75. package/cjs/merge.d.ts.map +1 -1
  76. package/cjs/merge.js +7 -11
  77. package/cjs/merge.js.map +1 -1
  78. package/cjs/multicast.d.ts +20 -19
  79. package/cjs/multicast.d.ts.map +1 -1
  80. package/cjs/multicast.js +30 -34
  81. package/cjs/multicast.js.map +1 -1
  82. package/cjs/orElse.d.ts +2 -5
  83. package/cjs/orElse.d.ts.map +1 -1
  84. package/cjs/orElse.js +9 -11
  85. package/cjs/orElse.js.map +1 -1
  86. package/cjs/provide.d.ts +8 -8
  87. package/cjs/provide.d.ts.map +1 -1
  88. package/cjs/provide.js +23 -9
  89. package/cjs/provide.js.map +1 -1
  90. package/cjs/runCollect.d.ts +4 -0
  91. package/cjs/runCollect.d.ts.map +1 -0
  92. package/cjs/{from.js → runCollect.js} +6 -15
  93. package/cjs/runCollect.js.map +1 -0
  94. package/cjs/runDrain.d.ts +4 -0
  95. package/cjs/runDrain.d.ts.map +1 -0
  96. package/cjs/runDrain.js +38 -0
  97. package/cjs/runDrain.js.map +1 -0
  98. package/cjs/runObserve.d.ts +4 -0
  99. package/cjs/runObserve.d.ts.map +1 -0
  100. package/cjs/{takeUntil.js → runObserve.js} +6 -17
  101. package/cjs/runObserve.js.map +1 -0
  102. package/cjs/runReduce.d.ts +6 -0
  103. package/cjs/runReduce.d.ts.map +1 -0
  104. package/cjs/runReduce.js +50 -0
  105. package/cjs/runReduce.js.map +1 -0
  106. package/cjs/scheduled.d.ts +4 -4
  107. package/cjs/scheduled.d.ts.map +1 -1
  108. package/cjs/scheduled.js +8 -8
  109. package/cjs/scheduled.js.map +1 -1
  110. package/cjs/since.d.ts +1 -1
  111. package/cjs/since.d.ts.map +1 -1
  112. package/cjs/since.js +5 -9
  113. package/cjs/since.js.map +1 -1
  114. package/cjs/skipRepeats.d.ts +1 -1
  115. package/cjs/skipRepeats.d.ts.map +1 -1
  116. package/cjs/skipRepeats.js +4 -5
  117. package/cjs/skipRepeats.js.map +1 -1
  118. package/cjs/skipWhile.d.ts +3 -3
  119. package/cjs/skipWhile.d.ts.map +1 -1
  120. package/cjs/skipWhile.js +12 -15
  121. package/cjs/skipWhile.js.map +1 -1
  122. package/cjs/slice.d.ts +3 -3
  123. package/cjs/slice.d.ts.map +1 -1
  124. package/cjs/slice.js +15 -23
  125. package/cjs/slice.js.map +1 -1
  126. package/cjs/snapshot.d.ts +2 -2
  127. package/cjs/snapshot.d.ts.map +1 -1
  128. package/cjs/snapshot.js +6 -8
  129. package/cjs/snapshot.js.map +1 -1
  130. package/cjs/suspendSucceed.d.ts +1 -1
  131. package/cjs/suspendSucceed.d.ts.map +1 -1
  132. package/cjs/suspendSucceed.js +1 -25
  133. package/cjs/suspendSucceed.js.map +1 -1
  134. package/cjs/switchMap.d.ts +1 -9
  135. package/cjs/switchMap.d.ts.map +1 -1
  136. package/cjs/switchMap.js +5 -18
  137. package/cjs/switchMap.js.map +1 -1
  138. package/cjs/takeWhile.d.ts +3 -3
  139. package/cjs/takeWhile.d.ts.map +1 -1
  140. package/cjs/takeWhile.js +6 -38
  141. package/cjs/takeWhile.js.map +1 -1
  142. package/cjs/tapEffect.d.ts +5 -0
  143. package/cjs/tapEffect.d.ts.map +1 -0
  144. package/cjs/{observe.js → tapEffect.js} +8 -15
  145. package/cjs/tapEffect.js.map +1 -0
  146. package/cjs/throttle.d.ts +2 -2
  147. package/cjs/throttle.d.ts.map +1 -1
  148. package/cjs/throttle.js +6 -13
  149. package/cjs/throttle.js.map +1 -1
  150. package/cjs/transform.d.ts +13 -8
  151. package/cjs/transform.d.ts.map +1 -1
  152. package/cjs/transform.js +9 -2
  153. package/cjs/transform.js.map +1 -1
  154. package/cjs/until.d.ts +1 -1
  155. package/cjs/until.d.ts.map +1 -1
  156. package/cjs/until.js +5 -7
  157. package/cjs/until.js.map +1 -1
  158. package/{esm/fromCallback.d.ts → cjs/withEmitter.d.ts} +4 -4
  159. package/cjs/withEmitter.d.ts.map +1 -0
  160. package/cjs/{fromCallback.js → withEmitter.js} +22 -16
  161. package/cjs/withEmitter.js.map +1 -0
  162. package/cjs/zip.d.ts +4 -4
  163. package/cjs/zip.d.ts.map +1 -1
  164. package/cjs/zip.js +11 -15
  165. package/cjs/zip.js.map +1 -1
  166. package/cjs/zipIterable.d.ts +4 -0
  167. package/cjs/zipIterable.d.ts.map +1 -0
  168. package/cjs/{zipItems.js → zipIterable.js} +23 -20
  169. package/cjs/zipIterable.js.map +1 -0
  170. package/esm/Fx.d.ts +19 -8
  171. package/esm/Fx.d.ts.map +1 -1
  172. package/esm/Fx.js +10 -1
  173. package/esm/Fx.js.map +1 -1
  174. package/esm/Subject.d.ts +22 -0
  175. package/esm/Subject.d.ts.map +1 -0
  176. package/esm/Subject.js +32 -0
  177. package/esm/Subject.js.map +1 -0
  178. package/esm/_internal.d.ts +19 -20
  179. package/esm/_internal.d.ts.map +1 -1
  180. package/esm/_internal.js +16 -72
  181. package/esm/_internal.js.map +1 -1
  182. package/esm/combine.d.ts +4 -4
  183. package/esm/combine.d.ts.map +1 -1
  184. package/esm/combine.js +12 -16
  185. package/esm/combine.js.map +1 -1
  186. package/esm/continueWith.d.ts +2 -2
  187. package/esm/continueWith.d.ts.map +1 -1
  188. package/esm/continueWith.js +3 -4
  189. package/esm/continueWith.js.map +1 -1
  190. package/esm/debounce.d.ts +2 -11
  191. package/esm/debounce.d.ts.map +1 -1
  192. package/esm/debounce.js +7 -27
  193. package/esm/debounce.js.map +1 -1
  194. package/esm/delay.d.ts +2 -2
  195. package/esm/delay.d.ts.map +1 -1
  196. package/esm/delay.js +6 -7
  197. package/esm/delay.js.map +1 -1
  198. package/esm/during.d.ts +1 -1
  199. package/esm/during.d.ts.map +1 -1
  200. package/esm/during.js +9 -12
  201. package/esm/during.js.map +1 -1
  202. package/esm/filterLoop.d.ts +25 -0
  203. package/esm/filterLoop.d.ts.map +1 -0
  204. package/esm/filterLoop.js +76 -0
  205. package/esm/filterLoop.js.map +1 -0
  206. package/esm/filterMap.d.ts +24 -0
  207. package/esm/filterMap.d.ts.map +1 -0
  208. package/esm/filterMap.js +53 -0
  209. package/esm/filterMap.js.map +1 -0
  210. package/esm/flatMap.d.ts +2 -10
  211. package/esm/flatMap.d.ts.map +1 -1
  212. package/esm/flatMap.js +9 -24
  213. package/esm/flatMap.js.map +1 -1
  214. package/esm/flatMapConcurrently.d.ts +2 -2
  215. package/esm/flatMapConcurrently.d.ts.map +1 -1
  216. package/esm/flatMapConcurrently.js +3 -3
  217. package/esm/flatMapConcurrently.js.map +1 -1
  218. package/esm/fromEffect.d.ts +34 -15
  219. package/esm/fromEffect.d.ts.map +1 -1
  220. package/esm/fromEffect.js +25 -13
  221. package/esm/fromEffect.js.map +1 -1
  222. package/esm/fromIterable.d.ts +9 -0
  223. package/esm/fromIterable.d.ts.map +1 -0
  224. package/esm/fromIterable.js +14 -0
  225. package/esm/fromIterable.js.map +1 -0
  226. package/esm/hold.d.ts +16 -17
  227. package/esm/hold.d.ts.map +1 -1
  228. package/esm/hold.js +28 -25
  229. package/esm/hold.js.map +1 -1
  230. package/esm/index.d.ts +19 -15
  231. package/esm/index.d.ts.map +1 -1
  232. package/esm/index.js +19 -16
  233. package/esm/index.js.map +1 -1
  234. package/esm/mapCause.d.ts +5 -0
  235. package/esm/mapCause.d.ts.map +1 -0
  236. package/esm/mapCause.js +13 -0
  237. package/esm/mapCause.js.map +1 -0
  238. package/esm/mapEffect.d.ts +4 -0
  239. package/esm/mapEffect.d.ts.map +1 -0
  240. package/esm/mapEffect.js +5 -0
  241. package/esm/mapEffect.js.map +1 -0
  242. package/esm/merge.d.ts +3 -3
  243. package/esm/merge.d.ts.map +1 -1
  244. package/esm/merge.js +9 -13
  245. package/esm/merge.js.map +1 -1
  246. package/esm/multicast.d.ts +20 -19
  247. package/esm/multicast.d.ts.map +1 -1
  248. package/esm/multicast.js +33 -37
  249. package/esm/multicast.js.map +1 -1
  250. package/esm/orElse.d.ts +2 -5
  251. package/esm/orElse.d.ts.map +1 -1
  252. package/esm/orElse.js +10 -10
  253. package/esm/orElse.js.map +1 -1
  254. package/esm/provide.d.ts +8 -8
  255. package/esm/provide.d.ts.map +1 -1
  256. package/esm/provide.js +20 -6
  257. package/esm/provide.js.map +1 -1
  258. package/esm/runCollect.d.ts +4 -0
  259. package/esm/runCollect.d.ts.map +1 -0
  260. package/esm/runCollect.js +7 -0
  261. package/esm/runCollect.js.map +1 -0
  262. package/esm/runDrain.d.ts +4 -0
  263. package/esm/runDrain.d.ts.map +1 -0
  264. package/esm/runDrain.js +11 -0
  265. package/esm/runDrain.js.map +1 -0
  266. package/esm/runObserve.d.ts +4 -0
  267. package/esm/runObserve.d.ts.map +1 -0
  268. package/esm/runObserve.js +8 -0
  269. package/esm/runObserve.js.map +1 -0
  270. package/esm/runReduce.d.ts +6 -0
  271. package/esm/runReduce.d.ts.map +1 -0
  272. package/esm/runReduce.js +22 -0
  273. package/esm/runReduce.js.map +1 -0
  274. package/esm/scheduled.d.ts +4 -4
  275. package/esm/scheduled.d.ts.map +1 -1
  276. package/esm/scheduled.js +8 -8
  277. package/esm/scheduled.js.map +1 -1
  278. package/esm/since.d.ts +1 -1
  279. package/esm/since.d.ts.map +1 -1
  280. package/esm/since.js +8 -12
  281. package/esm/since.js.map +1 -1
  282. package/esm/skipRepeats.d.ts +1 -1
  283. package/esm/skipRepeats.d.ts.map +1 -1
  284. package/esm/skipRepeats.js +5 -6
  285. package/esm/skipRepeats.js.map +1 -1
  286. package/esm/skipWhile.d.ts +3 -3
  287. package/esm/skipWhile.d.ts.map +1 -1
  288. package/esm/skipWhile.js +13 -16
  289. package/esm/skipWhile.js.map +1 -1
  290. package/esm/slice.d.ts +3 -3
  291. package/esm/slice.d.ts.map +1 -1
  292. package/esm/slice.js +17 -25
  293. package/esm/slice.js.map +1 -1
  294. package/esm/snapshot.d.ts +2 -2
  295. package/esm/snapshot.d.ts.map +1 -1
  296. package/esm/snapshot.js +8 -10
  297. package/esm/snapshot.js.map +1 -1
  298. package/esm/suspendSucceed.d.ts +1 -1
  299. package/esm/suspendSucceed.d.ts.map +1 -1
  300. package/esm/suspendSucceed.js +1 -2
  301. package/esm/suspendSucceed.js.map +1 -1
  302. package/esm/switchMap.d.ts +1 -9
  303. package/esm/switchMap.d.ts.map +1 -1
  304. package/esm/switchMap.js +6 -18
  305. package/esm/switchMap.js.map +1 -1
  306. package/esm/takeWhile.d.ts +3 -3
  307. package/esm/takeWhile.d.ts.map +1 -1
  308. package/esm/takeWhile.js +8 -17
  309. package/esm/takeWhile.js.map +1 -1
  310. package/esm/tapEffect.d.ts +5 -0
  311. package/esm/tapEffect.d.ts.map +1 -0
  312. package/esm/tapEffect.js +6 -0
  313. package/esm/tapEffect.js.map +1 -0
  314. package/esm/throttle.d.ts +2 -2
  315. package/esm/throttle.d.ts.map +1 -1
  316. package/esm/throttle.js +9 -16
  317. package/esm/throttle.js.map +1 -1
  318. package/esm/transform.d.ts +13 -8
  319. package/esm/transform.d.ts.map +1 -1
  320. package/esm/transform.js +6 -1
  321. package/esm/transform.js.map +1 -1
  322. package/esm/until.d.ts +1 -1
  323. package/esm/until.d.ts.map +1 -1
  324. package/esm/until.js +8 -10
  325. package/esm/until.js.map +1 -1
  326. package/{cjs/fromCallback.d.ts → esm/withEmitter.d.ts} +4 -4
  327. package/esm/withEmitter.d.ts.map +1 -0
  328. package/esm/withEmitter.js +26 -0
  329. package/esm/withEmitter.js.map +1 -0
  330. package/esm/zip.d.ts +4 -4
  331. package/esm/zip.d.ts.map +1 -1
  332. package/esm/zip.js +14 -18
  333. package/esm/zip.js.map +1 -1
  334. package/esm/zipIterable.d.ts +4 -0
  335. package/esm/zipIterable.d.ts.map +1 -0
  336. package/esm/zipIterable.js +26 -0
  337. package/esm/zipIterable.js.map +1 -0
  338. package/package.json +107 -113
  339. package/perf/_internal.ts +39 -35
  340. package/perf/cases/filter-map-reduce.ts +48 -0
  341. package/perf/cases/flatMap.ts +49 -0
  342. package/perf/cases/switchMap.ts +36 -0
  343. package/perf/readme-base.md +14 -0
  344. package/perf/readme.md +40 -0
  345. package/perf/runFullSuite.ts +37 -0
  346. package/perf/runPerfTest.ts +18 -0
  347. package/perf/tsconfig.json +1 -1
  348. package/src/Fx.ts +35 -10
  349. package/src/Subject.ts +46 -0
  350. package/src/_internal.ts +59 -114
  351. package/src/combine.test.ts +15 -16
  352. package/src/combine.ts +44 -48
  353. package/src/continueWith.test.ts +26 -0
  354. package/src/continueWith.ts +9 -11
  355. package/src/debounce.test.ts +4 -6
  356. package/src/debounce.ts +30 -49
  357. package/src/delay.test.ts +5 -6
  358. package/src/delay.ts +9 -8
  359. package/src/during.test.ts +39 -0
  360. package/src/during.ts +43 -47
  361. package/src/filterLoop.test.ts +63 -0
  362. package/src/filterLoop.ts +143 -0
  363. package/src/filterMap.test.ts +33 -0
  364. package/src/filterMap.ts +71 -0
  365. package/src/flatMap.test.ts +39 -12
  366. package/src/flatMap.ts +25 -51
  367. package/src/flatMapConcurrently.test.ts +23 -0
  368. package/src/flatMapConcurrently.ts +6 -12
  369. package/src/fromEffect.ts +74 -26
  370. package/src/fromIterable.ts +15 -0
  371. package/src/hold.test.ts +3 -3
  372. package/src/hold.ts +48 -44
  373. package/src/index.ts +19 -15
  374. package/src/mapCause.test.ts +34 -0
  375. package/src/mapCause.ts +16 -0
  376. package/src/mapEffect.test.ts +21 -0
  377. package/src/mapEffect.ts +17 -0
  378. package/src/merge.test.ts +10 -30
  379. package/src/merge.ts +17 -38
  380. package/src/multicast.test.ts +22 -28
  381. package/src/multicast.ts +71 -57
  382. package/src/orElse.test.ts +22 -0
  383. package/src/orElse.ts +21 -34
  384. package/src/periodic.test.ts +4 -4
  385. package/src/provide.test.ts +56 -0
  386. package/src/provide.ts +47 -36
  387. package/src/runCollect.ts +19 -0
  388. package/src/runDrain.ts +23 -0
  389. package/src/runObserve.ts +31 -0
  390. package/src/runReduce.ts +64 -0
  391. package/src/scheduled.ts +28 -26
  392. package/src/since.test.ts +40 -0
  393. package/src/since.ts +25 -42
  394. package/src/skipRepeats.test.ts +28 -0
  395. package/src/skipRepeats.ts +8 -9
  396. package/src/skipWhile.test.ts +44 -0
  397. package/src/skipWhile.ts +36 -22
  398. package/src/slice.test.ts +12 -10
  399. package/src/slice.ts +36 -42
  400. package/src/snapshot.test.ts +51 -0
  401. package/src/snapshot.ts +48 -37
  402. package/src/suspendSucceed.ts +2 -4
  403. package/src/switchMap.test.ts +23 -13
  404. package/src/switchMap.ts +32 -50
  405. package/src/takeWhile.test.ts +44 -0
  406. package/src/takeWhile.ts +20 -25
  407. package/src/tapEffect.ts +24 -0
  408. package/src/throttle.test.ts +5 -7
  409. package/src/throttle.ts +37 -42
  410. package/src/transform.ts +14 -6
  411. package/src/until.test.ts +8 -14
  412. package/src/until.ts +22 -32
  413. package/src/withEmitter.test.ts +28 -0
  414. package/src/withEmitter.ts +49 -0
  415. package/src/zip.test.ts +12 -13
  416. package/src/zip.ts +45 -52
  417. package/src/zipIterable.test.ts +19 -0
  418. package/src/zipIterable.ts +51 -0
  419. package/cjs/Sink.d.ts +0 -25
  420. package/cjs/Sink.d.ts.map +0 -1
  421. package/cjs/Sink.js +0 -66
  422. package/cjs/Sink.js.map +0 -1
  423. package/cjs/TSemaphore.d.ts +0 -4
  424. package/cjs/TSemaphore.d.ts.map +0 -1
  425. package/cjs/TSemaphore.js +0 -33
  426. package/cjs/TSemaphore.js.map +0 -1
  427. package/cjs/drain.d.ts +0 -7
  428. package/cjs/drain.d.ts.map +0 -1
  429. package/cjs/drain.js.map +0 -1
  430. package/cjs/empty.d.ts +0 -3
  431. package/cjs/empty.d.ts.map +0 -1
  432. package/cjs/empty.js +0 -9
  433. package/cjs/empty.js.map +0 -1
  434. package/cjs/from.d.ts +0 -11
  435. package/cjs/from.d.ts.map +0 -1
  436. package/cjs/from.js.map +0 -1
  437. package/cjs/fromCallback.d.ts.map +0 -1
  438. package/cjs/fromCallback.js.map +0 -1
  439. package/cjs/loop.d.ts +0 -4
  440. package/cjs/loop.d.ts.map +0 -1
  441. package/cjs/loop.js +0 -34
  442. package/cjs/loop.js.map +0 -1
  443. package/cjs/map.d.ts +0 -28
  444. package/cjs/map.d.ts.map +0 -1
  445. package/cjs/map.js.map +0 -1
  446. package/cjs/never.d.ts +0 -2
  447. package/cjs/never.d.ts.map +0 -1
  448. package/cjs/never.js.map +0 -1
  449. package/cjs/observe.d.ts +0 -7
  450. package/cjs/observe.d.ts.map +0 -1
  451. package/cjs/observe.js.map +0 -1
  452. package/cjs/reduce.d.ts +0 -7
  453. package/cjs/reduce.d.ts.map +0 -1
  454. package/cjs/reduce.js +0 -64
  455. package/cjs/reduce.js.map +0 -1
  456. package/cjs/takeUntil.d.ts +0 -4
  457. package/cjs/takeUntil.d.ts.map +0 -1
  458. package/cjs/takeUntil.js.map +0 -1
  459. package/cjs/tap.d.ts +0 -9
  460. package/cjs/tap.d.ts.map +0 -1
  461. package/cjs/tap.js +0 -54
  462. package/cjs/tap.js.map +0 -1
  463. package/cjs/zipItems.d.ts +0 -4
  464. package/cjs/zipItems.d.ts.map +0 -1
  465. package/cjs/zipItems.js.map +0 -1
  466. package/esm/Sink.d.ts +0 -25
  467. package/esm/Sink.d.ts.map +0 -1
  468. package/esm/Sink.js +0 -31
  469. package/esm/Sink.js.map +0 -1
  470. package/esm/TSemaphore.d.ts +0 -4
  471. package/esm/TSemaphore.d.ts.map +0 -1
  472. package/esm/TSemaphore.js +0 -5
  473. package/esm/TSemaphore.js.map +0 -1
  474. package/esm/drain.d.ts +0 -7
  475. package/esm/drain.d.ts.map +0 -1
  476. package/esm/drain.js +0 -12
  477. package/esm/drain.js.map +0 -1
  478. package/esm/empty.d.ts +0 -3
  479. package/esm/empty.d.ts.map +0 -1
  480. package/esm/empty.js +0 -5
  481. package/esm/empty.js.map +0 -1
  482. package/esm/from.d.ts +0 -11
  483. package/esm/from.d.ts.map +0 -1
  484. package/esm/from.js +0 -15
  485. package/esm/from.js.map +0 -1
  486. package/esm/fromCallback.d.ts.map +0 -1
  487. package/esm/fromCallback.js +0 -20
  488. package/esm/fromCallback.js.map +0 -1
  489. package/esm/loop.d.ts +0 -4
  490. package/esm/loop.d.ts.map +0 -1
  491. package/esm/loop.js +0 -29
  492. package/esm/loop.js.map +0 -1
  493. package/esm/map.d.ts +0 -28
  494. package/esm/map.d.ts.map +0 -1
  495. package/esm/map.js +0 -64
  496. package/esm/map.js.map +0 -1
  497. package/esm/never.d.ts +0 -2
  498. package/esm/never.d.ts.map +0 -1
  499. package/esm/never.js +0 -4
  500. package/esm/never.js.map +0 -1
  501. package/esm/observe.d.ts +0 -7
  502. package/esm/observe.d.ts.map +0 -1
  503. package/esm/observe.js +0 -12
  504. package/esm/observe.js.map +0 -1
  505. package/esm/reduce.d.ts +0 -7
  506. package/esm/reduce.d.ts.map +0 -1
  507. package/esm/reduce.js +0 -35
  508. package/esm/reduce.js.map +0 -1
  509. package/esm/takeUntil.d.ts +0 -4
  510. package/esm/takeUntil.d.ts.map +0 -1
  511. package/esm/takeUntil.js +0 -19
  512. package/esm/takeUntil.js.map +0 -1
  513. package/esm/tap.d.ts +0 -9
  514. package/esm/tap.d.ts.map +0 -1
  515. package/esm/tap.js +0 -23
  516. package/esm/tap.js.map +0 -1
  517. package/esm/zipItems.d.ts +0 -4
  518. package/esm/zipItems.d.ts.map +0 -1
  519. package/esm/zipItems.js +0 -23
  520. package/esm/zipItems.js.map +0 -1
  521. package/perf/filter-map-reduce.ts +0 -49
  522. package/perf/flatMap.ts +0 -48
  523. package/perf/switchMap.ts +0 -40
  524. package/src/Sink.ts +0 -84
  525. package/src/TSemaphore.ts +0 -8
  526. package/src/drain.ts +0 -21
  527. package/src/empty.ts +0 -5
  528. package/src/from.test.ts +0 -18
  529. package/src/from.ts +0 -18
  530. package/src/fromCallback.ts +0 -40
  531. package/src/loop.ts +0 -37
  532. package/src/map.ts +0 -83
  533. package/src/never.ts +0 -5
  534. package/src/observe.ts +0 -24
  535. package/src/reduce.ts +0 -81
  536. package/src/takeUntil.ts +0 -29
  537. package/src/tap.ts +0 -48
  538. package/src/zipItems.test.ts +0 -21
  539. package/src/zipItems.ts +0 -41
package/src/multicast.ts CHANGED
@@ -2,97 +2,111 @@ import * as Cause from '@effect/core/io/Cause'
2
2
  import * as Deferred from '@effect/core/io/Deferred'
3
3
  import * as Effect from '@effect/core/io/Effect'
4
4
  import * as Fiber from '@effect/core/io/Fiber'
5
+ import { Scope } from '@effect/core/io/Scope'
5
6
  import { pipe } from '@fp-ts/data/Function'
7
+ import * as Duration from '@tsplus/stdlib/data/Duration'
6
8
  import { Env } from '@tsplus/stdlib/service/Env'
7
9
 
8
- import { Fx } from './Fx.js'
9
- import { Sink } from './Sink.js'
10
- import { asap } from './_internal.js'
10
+ import { Emitter, Fx } from './Fx.js'
11
11
 
12
- export function multicast<R, E, A, E1 = never>(self: Fx<R, E, A, E1>): Fx<R, E, A, E1> {
13
- return new Multicast(self)
12
+ export function multicast<R, E, A>(fx: Fx<R, E, A>): Fx<R, E, A> {
13
+ return new Multicast(fx)
14
14
  }
15
15
 
16
- export type MulticastObserver<E, A> = readonly [
17
- Sink<E, A, any, any, any>,
18
- Env<any>,
19
- Deferred.Deferred<any, any>,
20
- ]
21
-
22
- export class Multicast<R, E, A, E1> implements Fx<R, E, A, E1>, Sink<E, A, any, any, any> {
23
- protected sinks: Array<MulticastObserver<E, A>> = []
24
- protected fiber: Fiber.Fiber<any, any> | undefined
25
-
26
- constructor(readonly fx: Fx<R, E, A, E1>) {
27
- this.run = this.run.bind(this)
28
- this.event = this.event.bind(this)
29
- this.error = this.error.bind(this)
30
- this.runEvent = this.runEvent.bind(this)
31
- this.runError = this.runError.bind(this)
32
- this.runEnd = this.runEnd.bind(this)
33
- }
34
-
35
- run<R2, E2, B>(sink: Sink<E, A, R2, E2, B>): Effect.Effect<R | R2, E1 | E2, B> {
36
- // eslint-disable-next-line @typescript-eslint/no-this-alias
37
- const that = this
38
-
39
- return Effect.gen(function* ($) {
40
- const env = yield* $(Effect.environment<R | R2>())
41
- const deferred = yield* $(Deferred.make<E2, B>())
16
+ export interface MulticastObserver<E, A> {
17
+ readonly emitter: Emitter<any, E, A>
18
+ readonly env: Env<any>
19
+ readonly deferred: Deferred.Deferred<never, void>
20
+ }
42
21
 
43
- that.sinks.push([sink, env, deferred])
22
+ export class Multicast<R, E, A> implements Fx<R, E, A>, Emitter<never, E, A> {
23
+ protected observers: MulticastObserver<E, A>[] = []
24
+ protected fiber: Fiber.Fiber<never, unknown> | undefined
44
25
 
45
- if (!that.fiber) {
46
- that.fiber = yield* $(Effect.fork(Effect.schedule(asap)(that.fx.run(that))))
47
- }
26
+ constructor(readonly fx: Fx<R, E, A>) {
27
+ this.emit = this.emit.bind(this)
28
+ this.failCause = this.failCause.bind(this)
29
+ }
48
30
 
49
- return yield* $(deferred.await)
50
- })
31
+ run<RO>(emitter: Emitter<RO, E, A>): Effect.Effect<R | RO | Scope, never, unknown> {
32
+ return pipe(
33
+ Effect.environment<RO>(),
34
+ Effect.zip(Deferred.make<never, void>()),
35
+ Effect.tap(([env, deferred]) => {
36
+ this.observers.push({ emitter, env, deferred })
37
+
38
+ return this.fiber
39
+ ? Effect.unit
40
+ : pipe(
41
+ this.fx.run(this),
42
+ Effect.delay(Duration.millis(0)),
43
+ Effect.forkScoped,
44
+ Effect.tap((fiber) => Effect.sync(() => (this.fiber = fiber))),
45
+ )
46
+ }),
47
+
48
+ Effect.flatMap(([, deferred]) => deferred.await),
49
+ )
51
50
  }
52
51
 
53
- event(a: A) {
54
- return Effect.forEachDiscard(this.sinks.slice(), (o) => this.runEvent(a, o))
52
+ emit(a: A) {
53
+ return Effect.suspendSucceed(() =>
54
+ Effect.forEachDiscard(this.observers.slice(), (observer) => this.runEvent(a, observer)),
55
+ )
55
56
  }
56
57
 
57
- error(e: Cause.Cause<E>): Effect.Effect<never, any, void> {
58
+ failCause(e: Cause.Cause<E>) {
58
59
  return pipe(
59
- Effect.forEachDiscard(this.sinks.slice(), (o) => this.runError(e, o)),
60
- Effect.tap(() => Effect.sync(() => (this.fiber = undefined))),
60
+ Effect.suspendSucceed(() =>
61
+ Effect.forEachDiscard(this.observers.slice(), (observer) => this.runFailCause(e, observer)),
62
+ ),
63
+ Effect.flatMap(() => this.cleanup()),
61
64
  )
62
65
  }
63
66
 
64
- public get end(): Sink<E, A, any, any, any>['end'] {
67
+ get end() {
65
68
  return pipe(
66
- Effect.forEachDiscard(this.sinks.slice(), (o) => this.runEnd(o)),
67
- Effect.tap(() => Effect.sync(() => (this.fiber = undefined))),
69
+ Effect.suspendSucceed(() =>
70
+ Effect.forEachDiscard(this.observers.slice(), (observer) => this.runEnd(observer)),
71
+ ),
72
+ Effect.flatMap(() => this.cleanup()),
68
73
  )
69
74
  }
70
75
 
71
76
  protected runEvent(a: A, observer: MulticastObserver<E, A>) {
72
77
  return pipe(
73
- observer[0].event(a),
74
- Effect.provideEnvironment(observer[1]),
75
- Effect.onError((c) => (Cause.isEmpty(c) ? Effect.unit : this.runError(c, observer))),
78
+ observer.emitter.emit(a),
79
+ Effect.onError((c) => this.runFailCause(c, observer)),
80
+ Effect.provideEnvironment(observer.env),
76
81
  )
77
82
  }
78
83
 
79
- protected runError(e: Cause.Cause<E>, observer: MulticastObserver<E, A>) {
80
- this.sinks.splice(this.sinks.indexOf(observer), 1)
84
+ protected runFailCause(e: Cause.Cause<E>, observer: MulticastObserver<E, A>) {
85
+ this.observers.splice(this.observers.indexOf(observer), 1)
81
86
 
82
87
  return pipe(
83
- observer[0].error(e),
84
- Effect.intoDeferred(observer[2]),
85
- Effect.provideEnvironment(observer[1]),
88
+ observer.emitter.failCause(e),
89
+ Effect.intoDeferred(observer.deferred),
90
+ Effect.provideEnvironment(observer.env),
86
91
  )
87
92
  }
88
93
 
89
94
  protected runEnd(observer: MulticastObserver<E, A>) {
90
- this.sinks.splice(this.sinks.indexOf(observer), 1)
95
+ this.observers.splice(this.observers.indexOf(observer), 1)
91
96
 
92
97
  return pipe(
93
- observer[0].end,
94
- Effect.intoDeferred(observer[2]),
95
- Effect.provideEnvironment(observer[1]),
98
+ observer.emitter.end,
99
+ Effect.intoDeferred(observer.deferred),
100
+ Effect.provideEnvironment(observer.env),
96
101
  )
97
102
  }
103
+
104
+ protected cleanup() {
105
+ return this.fiber
106
+ ? pipe(
107
+ Fiber.interrupt(this.fiber),
108
+ Effect.tap(() => Effect.sync(() => (this.fiber = undefined))),
109
+ )
110
+ : Effect.unit
111
+ }
98
112
  }
@@ -0,0 +1,22 @@
1
+ import { deepStrictEqual } from 'assert'
2
+
3
+ import * as Effect from '@effect/core/io/Effect'
4
+ import { pipe } from '@fp-ts/data/Function'
5
+
6
+ import * as Fx from './index.js'
7
+
8
+ describe(import.meta.url, () => {
9
+ describe(Fx.orElse.name, () => {
10
+ it('allows recovering from failures', async () => {
11
+ const result = await pipe(
12
+ Fx.fromIterable([1, 2, 3]),
13
+ Fx.flatMap((n) => Fx.fail(n)),
14
+ Fx.orElse((n) => Fx.fromIterable([n, n, n])),
15
+ Fx.runCollect,
16
+ Effect.unsafeRunPromise,
17
+ )
18
+
19
+ deepStrictEqual(result, [1, 1, 1])
20
+ })
21
+ })
22
+ })
package/src/orElse.ts CHANGED
@@ -1,46 +1,33 @@
1
1
  import * as Cause from '@effect/core/io/Cause'
2
- import { Effect } from '@effect/core/io/Effect'
3
- import { pipe } from '@fp-ts/data/Function'
2
+ import * as Effect from '@effect/core/io/Effect'
3
+ import { flow, pipe } from '@fp-ts/data/Function'
4
4
  import * as Either from '@tsplus/stdlib/data/Either'
5
5
 
6
6
  import { Fx } from './Fx.js'
7
- import { Sink } from './Sink.js'
8
- import { fromEffect } from './fromEffect.js'
7
+ import { failCause } from './fromEffect.js'
8
+ import { runObserve } from './runObserve.js'
9
9
 
10
- export function orElseCause<E, R2, E2, B, E3>(f: (e: Cause.Cause<E>) => Fx<R2, E2, B, E3>) {
11
- return <R, A, E1>(fx: Fx<R, E, A, E1>): Fx<R | R2, E | E2, A | B, E1 | E3> =>
12
- Fx((sink) => fx.run(Sink(sink.event, (e) => f(e).run(sink), sink.end)))
10
+ export function orElseCause<E, R2, E2, B>(f: (cause: Cause.Cause<E>) => Fx<R2, E2, B>) {
11
+ return <R, A>(fx: Fx<R, E, A>): Fx<R | R2, E2, A | B> => orElseCause_(fx, f)
13
12
  }
14
13
 
15
- export function orElse<E, R2, E2, B, E3>(f: (e: E) => Fx<R2, E2, B, E3>) {
16
- return <R, A, E1>(fx: Fx<R, E, A, E1>): Fx<R | R2, E | E2, A | B, E1 | E3> =>
17
- Fx((sink) =>
18
- fx.run(
19
- Sink(
20
- sink.event,
21
- (e) =>
22
- pipe(
23
- Cause.failureOrCause(e),
24
- Either.fold((e) => f(e).run(sink), sink.error),
25
- ),
26
- sink.end,
27
- ),
28
- ),
29
- )
14
+ export function orElse<E, R2, E2, B>(f: (error: E) => Fx<R2, E2, B>) {
15
+ return <R, A>(fx: Fx<R, E, A>): Fx<R | R2, E2, A | B> =>
16
+ orElseCause_(fx, flow(Cause.failureOrCause, Either.fold(f, failCause)))
30
17
  }
31
18
 
32
- export function orElseCauseEffect<E, R2, E2, B>(f: (e: Cause.Cause<E>) => Effect<R2, E2, B>) {
33
- return <R, A, E1>(fx: Fx<R, E, A, E1>): Fx<R | R2, E | E2, A | B, E1> =>
34
- pipe(
19
+ function orElseCause_<R, E, A, R2, E2, B>(
20
+ fx: Fx<R, E, A>,
21
+ f: (cause: Cause.Cause<E>) => Fx<R2, E2, B>,
22
+ ): Fx<R | R2, E2, A | B> {
23
+ return Fx((emitter) => {
24
+ return pipe(
35
25
  fx,
36
- orElseCause((e) => fromEffect(f(e))),
37
- )
38
- }
39
-
40
- export function orElseEffect<E, R2, E2, B>(f: (e: E) => Effect<R2, E2, B>) {
41
- return <R, A, E1>(fx: Fx<R, E, A, E1>): Fx<R | R2, E | E2, A | B, E1> =>
42
- pipe(
43
- fx,
44
- orElse((e: E) => fromEffect(f(e))),
26
+ runObserve(emitter.emit),
27
+ Effect.foldCauseEffect(
28
+ (c) => f(c).run(emitter),
29
+ () => emitter.end,
30
+ ),
45
31
  )
32
+ })
46
33
  }
@@ -1,18 +1,18 @@
1
1
  import { deepStrictEqual } from 'assert'
2
2
 
3
- import { unsafeRunPromise } from '@effect/core/io/Effect'
3
+ import * as Effect from '@effect/core/io/Effect'
4
4
  import { pipe } from '@fp-ts/data/Function'
5
5
  import { millis } from '@tsplus/stdlib/data/Duration'
6
6
 
7
7
  import { periodic } from './periodic.js'
8
- import { collectAll } from './reduce.js'
8
+ import { runCollect } from './runCollect.js'
9
9
  import { take } from './slice.js'
10
10
 
11
11
  describe(import.meta.url, () => {
12
12
  describe('periodic', () => {
13
13
  it('emits a value every period', async () => {
14
- const test = pipe(periodic(millis(100)), take(3), collectAll)
15
- const events = await unsafeRunPromise(test)
14
+ const test = pipe(periodic(millis(100)), take(3), runCollect, Effect.scoped)
15
+ const events = await Effect.unsafeRunPromise(test)
16
16
 
17
17
  deepStrictEqual(events, [undefined, undefined, undefined])
18
18
  })
@@ -0,0 +1,56 @@
1
+ import { deepStrictEqual } from 'assert'
2
+
3
+ import * as Effect from '@effect/core/io/Effect'
4
+ import * as Scope from '@effect/core/io/Scope'
5
+ import { pipe } from '@fp-ts/data/Function'
6
+ import { Tag } from '@tsplus/stdlib/service/Tag'
7
+
8
+ import * as Fx from './index.js'
9
+
10
+ describe(import.meta.url, () => {
11
+ describe(Fx.provideService.name, () => {
12
+ it('provides a service to the Fx', async () => {
13
+ const test = Effect.gen(function* ($) {
14
+ const scope = yield* $(Scope.make)
15
+
16
+ const result = yield* $(
17
+ pipe(
18
+ Fx.service(Scope.Scope.Tag),
19
+ Fx.flatMap((s) => Fx.fromIterable([s, s])),
20
+ Fx.provideService(Scope.Scope.Tag, scope),
21
+ Fx.runCollect,
22
+ ),
23
+ )
24
+
25
+ deepStrictEqual(result, [scope, scope])
26
+ })
27
+
28
+ await Effect.unsafeRunPromise(test)
29
+ })
30
+ })
31
+
32
+ describe(Fx.provideLayer.name, () => {
33
+ it('provides a layer to the Fx', async () => {
34
+ const test = Effect.gen(function* ($) {
35
+ const value = `${Math.random()}`
36
+ class Foo {
37
+ static Tag = Tag<Foo>()
38
+ constructor(readonly foo: string) {}
39
+ }
40
+
41
+ const result = yield* $(
42
+ pipe(
43
+ Fx.service(Foo.Tag),
44
+ Fx.flatMap((s) => Fx.succeed(s.foo)),
45
+ Fx.provideLayer(Effect.toLayer(Foo.Tag)(Effect.succeed(new Foo(value)))),
46
+ Fx.runCollect,
47
+ ),
48
+ )
49
+
50
+ deepStrictEqual(result, [value])
51
+ })
52
+
53
+ await Effect.unsafeRunPromise(test)
54
+ })
55
+ })
56
+ })
package/src/provide.ts CHANGED
@@ -1,50 +1,61 @@
1
1
  import * as Effect from '@effect/core/io/Effect'
2
- import { Layer } from '@effect/core/io/Layer'
2
+ import * as Layer from '@effect/core/io/Layer'
3
+ import * as Scope from '@effect/core/io/Scope'
3
4
  import { pipe } from '@fp-ts/data/Function'
4
- import * as Env from '@tsplus/stdlib/service/Env'
5
+ import { Env } from '@tsplus/stdlib/service/Env'
5
6
  import { Tag } from '@tsplus/stdlib/service/Tag'
6
7
 
7
- import { Fx } from './Fx.js'
8
- import { Sink } from './Sink.js'
8
+ import { Emitter, Fx } from './Fx.js'
9
9
 
10
- export const provideEnvironment =
11
- <R>(env: Env.Env<R>) =>
12
- <E, A, E1>(fx: Fx<R, E, A, E1>): Fx<never, E, A, E1> =>
13
- Fx(
14
- <R2, E2, B>(sink: Sink<E, A, R2, E2, B>): Effect.Effect<R2, E1 | E2, B> =>
15
- pipe(
16
- fx.run(sink),
17
- Effect.provideSomeEnvironment((e: Env.Env<R2>): Env.Env<R | R2> => e.merge<R2, R>(env)),
10
+ export function provideSomeEnvironment<R2>(env: Env<R2>) {
11
+ return <R, E, A>(fx: Fx<R | R2, E, A>): Fx<Exclude<R, R2>, E, A> =>
12
+ Fx((emitter) =>
13
+ pipe(
14
+ fx.run(emitter),
15
+ Effect.provideSomeEnvironment(
16
+ (e: Env<Exclude<R, R2> | Emitter.ResourcesOf<typeof emitter> | Scope.Scope>) =>
17
+ (e as Env<R | Emitter.ResourcesOf<typeof emitter> | Scope.Scope>).merge(env),
18
18
  ),
19
+ ),
19
20
  )
21
+ }
22
+
23
+ export function provideEnvironment<R>(env: Env<R>) {
24
+ return provideSomeEnvironment(env) as <E, A>(fx: Fx<R, E, A>) => Fx<never, E, A>
25
+ }
20
26
 
21
- export const provideSomeEnvironment =
22
- <R3>(env: Env.Env<R3>) =>
23
- <R, E, A, E1>(fx: Fx<R | R3, E, A, E1>): Fx<R, E, A, E1> =>
24
- Fx(
25
- <R2, E2, B>(sink: Sink<E, A, R2, E2, B>): Effect.Effect<R | R2, E1 | E2, B> =>
27
+ export function provideSomeLayer<RI, E2, RO>(layer: Layer.Layer<RI, E2, RO>) {
28
+ return <R, E, A>(fx: Fx<R | RO, E, A>): Fx<RI | Exclude<R, RO>, E | E2, A> =>
29
+ Fx(<R2>(emitter: Emitter<R2, E | E2, A>) =>
30
+ Effect.scopeWith((scope) =>
26
31
  pipe(
27
- fx.run(sink),
28
- Effect.provideSomeEnvironment((e) => e.merge(env)),
32
+ layer,
33
+ Layer.buildWithScope(scope),
34
+ Effect.flatMap((ro) => pipe(fx, provideSomeEnvironment(ro)).run(emitter)),
35
+ Effect.foldCauseEffect((c) => emitter.failCause(c), Effect.succeed),
29
36
  ),
37
+ ),
30
38
  )
39
+ }
31
40
 
32
- export const provideLayer =
33
- <RI, E3, RO>(layer: Layer<RI, E3, RO>) =>
34
- <E, A, E1>(fx: Fx<RO, E, A, E1>): Fx<RI, E, A, E1 | E3> =>
35
- Fx((sink) => pipe(fx.run(sink), Effect.provideSomeLayer(layer)))
41
+ export function provideLayer<RI, E2, RO>(layer: Layer.Layer<RI, E2, RO>) {
42
+ return provideSomeLayer(layer) as <E, A>(fx: Fx<RO, E, A>) => Fx<RI, E | E2, A>
43
+ }
36
44
 
37
- export const provideSomeLayer =
38
- <RI, E3, RO>(layer: Layer<RI, E3, RO>) =>
39
- <R, E, A, E1>(fx: Fx<R | RO, E, A, E1>): Fx<R | RI, E, A, E1 | E3> =>
40
- Fx((sink) => pipe(fx.run(sink), Effect.provideSomeLayer(layer)))
45
+ export function provideService<S>(
46
+ tag: Tag<S>,
47
+ service: S,
48
+ ): <R, E, A>(fx: Fx<S | R, E, A>) => Fx<Exclude<R, S>, E, A> {
49
+ return provideSomeEnvironment(Env(tag, service))
50
+ }
41
51
 
42
- export const provideService =
43
- <T>(tag: Tag<T>, resource: T) =>
44
- <R, E, A, E1>(fx: Fx<R | T, E, A, E1>): Fx<R, E, A, E1> =>
45
- Fx((sink) => pipe(fx.run(sink), Effect.provideService(tag, resource)))
46
-
47
- export const provideServiceEffect =
48
- <T, R3, E3>(tag: Tag<T>, effect: Effect.Effect<R3, E3, T>) =>
49
- <R, E, A, E1>(fx: Fx<R | T, E, A, E1>): Fx<R | R3, E, A, E1 | E3> =>
50
- Fx((sink) => pipe(fx.run(sink), Effect.provideServiceEffect(tag, effect)))
52
+ export function provideServiceEffect<S, R2, E2>(tag: Tag<S>, service: Effect.Effect<R2, E2, S>) {
53
+ return <R, E, A>(fx: Fx<R, E, A>): Fx<R | R2, E | E2, A> =>
54
+ Fx((emitter) =>
55
+ pipe(
56
+ fx.run(emitter),
57
+ Effect.provideServiceEffect(tag, service),
58
+ Effect.foldCauseEffect(emitter.failCause, Effect.succeed),
59
+ ),
60
+ )
61
+ }
@@ -0,0 +1,19 @@
1
+ import * as Effect from '@effect/core/io/Effect'
2
+ import { pipe } from '@fp-ts/data/Function'
3
+
4
+ import { Fx } from './Fx.js'
5
+ import { runObserve } from './runObserve.js'
6
+
7
+ export function runCollect<R, E, A>(fx: Fx<R, E, A>): Effect.Effect<R, E, ReadonlyArray<A>> {
8
+ return pipe(
9
+ Effect.sync<A[]>(() => []),
10
+ Effect.flatMap((values) =>
11
+ pipe(
12
+ fx,
13
+ runObserve((a) => Effect.sync(() => values.push(a))),
14
+ Effect.map(() => values),
15
+ ),
16
+ ),
17
+ Effect.scoped,
18
+ )
19
+ }
@@ -0,0 +1,23 @@
1
+ import * as Deferred from '@effect/core/io/Deferred'
2
+ import * as Effect from '@effect/core/io/Effect'
3
+ import { pipe } from '@fp-ts/data/Function'
4
+
5
+ import { Fx } from './Fx.js'
6
+
7
+ export function runDrain<R, E, A>(fx: Fx<R, E, A>): Effect.Effect<R, E, void> {
8
+ return pipe(
9
+ Deferred.make<E, void>(),
10
+ Effect.flatMap((deferred) =>
11
+ pipe(
12
+ fx.run({
13
+ emit: () => Effect.unit,
14
+ failCause: (c) => deferred.failCauseSync(c),
15
+ end: deferred.succeed(undefined),
16
+ }),
17
+ Effect.forkScoped,
18
+ Effect.zipRight(deferred.await),
19
+ ),
20
+ ),
21
+ Effect.scoped,
22
+ )
23
+ }
@@ -0,0 +1,31 @@
1
+ import * as Deferred from '@effect/core/io/Deferred'
2
+ import * as Effect from '@effect/core/io/Effect'
3
+ import { flow, pipe } from '@fp-ts/data/Function'
4
+
5
+ import { Emitter, Fx } from './Fx.js'
6
+
7
+ export function runObserve<A, R2, E2, B>(f: (a: A) => Effect.Effect<R2, E2, B>) {
8
+ return <R, E>(fx: Fx<R, E, A>): Effect.Effect<R | R2, E | E2, void> =>
9
+ pipe(
10
+ Deferred.make<E | E2, void>(),
11
+ Effect.tap((deferred) =>
12
+ Effect.forkScoped(
13
+ fx.run(
14
+ Emitter(
15
+ flow(
16
+ f,
17
+ Effect.foldCauseEffect(
18
+ (c) => deferred.failCauseSync(c),
19
+ () => Effect.unit,
20
+ ),
21
+ ),
22
+ (c) => deferred.failCauseSync(c),
23
+ deferred.succeed(undefined),
24
+ ),
25
+ ),
26
+ ),
27
+ ),
28
+ Effect.flatMap((deferred) => deferred.await),
29
+ Effect.scoped,
30
+ )
31
+ }
@@ -0,0 +1,64 @@
1
+ import * as Effect from '@effect/core/io/Effect'
2
+ import * as Ref from '@effect/core/io/Ref'
3
+ import { pipe } from '@fp-ts/data/Function'
4
+ import * as Maybe from '@tsplus/stdlib/data/Maybe'
5
+
6
+ import { Fx } from './Fx.js'
7
+ import { runObserve } from './runObserve.js'
8
+
9
+ export function runReduce<A, B>(seed: A, f: (a: A, b: B) => A) {
10
+ return <R, E>(fx: Fx<R, E, B>): Effect.Effect<R, E, A> => {
11
+ return runReduce_(fx, seed, f)
12
+ }
13
+ }
14
+
15
+ export function runFilterReduce<A, B>(seed: A, f: (a: A, b: B) => Maybe.Maybe<A>) {
16
+ return <R, E>(fx: Fx<R, E, B>): Effect.Effect<R, E, A> => {
17
+ return runFilterReduce_(fx, seed, f)
18
+ }
19
+ }
20
+
21
+ function runReduce_<R, E, A, B>(
22
+ fx: Fx<R, E, B>,
23
+ seed: A,
24
+ f: (a: A, b: B) => A,
25
+ ): Effect.Effect<R, E, A> {
26
+ return pipe(
27
+ Ref.makeRef<A>(() => seed),
28
+ Effect.flatMap((ref) =>
29
+ pipe(
30
+ fx,
31
+ runObserve((b) => Effect.sync(() => ref.update((a) => f(a, b)))),
32
+ Effect.flatMap(() => ref.get),
33
+ ),
34
+ ),
35
+ Effect.scoped,
36
+ )
37
+ }
38
+
39
+ function runFilterReduce_<R, E, A, B>(
40
+ fx: Fx<R, E, B>,
41
+ seed: A,
42
+ f: (a: A, b: B) => Maybe.Maybe<A>,
43
+ ): Effect.Effect<R, E, A> {
44
+ return pipe(
45
+ Ref.makeRef<A>(() => seed),
46
+ Effect.flatMap((ref) =>
47
+ pipe(
48
+ fx,
49
+ runObserve((b) =>
50
+ Effect.sync(() =>
51
+ ref.update((a) =>
52
+ pipe(
53
+ f(a, b),
54
+ Maybe.getOrElse(() => a),
55
+ ),
56
+ ),
57
+ ),
58
+ ),
59
+ Effect.flatMap(() => ref.get),
60
+ ),
61
+ ),
62
+ Effect.scoped,
63
+ )
64
+ }