@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
@@ -0,0 +1,48 @@
1
+ import * as EffectStream from '@effect/core/Stream/Stream'
2
+ import { pipe } from '@fp-ts/data/Function'
3
+ import * as M from '@most/core'
4
+ import * as Chunk from '@tsplus/stdlib/collections/Chunk'
5
+ import * as rxjs from 'rxjs'
6
+
7
+ import {
8
+ array,
9
+ effectTsStreamTest,
10
+ fxEffectTest,
11
+ iterations,
12
+ mostStreamTest,
13
+ rxjsObservableTest,
14
+ } from '../_internal.js'
15
+
16
+ import * as Stream from '@/index.js'
17
+
18
+ const filterEvens = (x: number) => x % 2 === 0
19
+ const addOne = (x: number) => x + 1
20
+ const add = (x: number, y: number): number => x + y
21
+
22
+ export const name = 'filter -> map -> scan ' + iterations + ' integers'
23
+
24
+ export const cases = [
25
+ fxEffectTest(() =>
26
+ pipe(
27
+ Stream.fromIterable(array),
28
+ Stream.filter(filterEvens),
29
+ Stream.map(addOne),
30
+ Stream.runReduce(0, add),
31
+ ),
32
+ ),
33
+ mostStreamTest(() =>
34
+ pipe(M.periodic(0), M.withItems(array), M.filter(filterEvens), M.map(addOne), M.scan(add, 0)),
35
+ ),
36
+ rxjsObservableTest(() =>
37
+ pipe(rxjs.from(array), rxjs.filter(filterEvens), rxjs.map(addOne), rxjs.scan(add, 0)),
38
+ ),
39
+
40
+ effectTsStreamTest(() =>
41
+ pipe(
42
+ EffectStream.fromChunk(Chunk.from(array)),
43
+ EffectStream.filter(filterEvens),
44
+ EffectStream.map(addOne),
45
+ EffectStream.scan(0, add),
46
+ ),
47
+ ),
48
+ ]
@@ -0,0 +1,49 @@
1
+ import * as EffectStream from '@effect/core/Stream/Stream'
2
+ import { pipe } from '@fp-ts/data/Function'
3
+ import * as M from '@most/core'
4
+ import * as Chunk from '@tsplus/stdlib/collections/Chunk'
5
+ import * as rxjs from 'rxjs'
6
+
7
+ import {
8
+ array,
9
+ effectTsStreamTest,
10
+ fxTest,
11
+ iterations,
12
+ mostStreamTest,
13
+ rxjsObservableTest,
14
+ } from '../_internal.js'
15
+
16
+ import * as Stream from '@/index.js'
17
+
18
+ const nestedArray = array.map((x) => Array.from({ length: x }, (_, i) => x * 1000 + i))
19
+
20
+ const add = (x: number, y: number): number => x + y
21
+
22
+ export const name = 'flatMap ' + iterations + ' x ' + iterations + ' integers'
23
+ export const cases = [
24
+ fxTest(() =>
25
+ pipe(
26
+ Stream.fromIterable(nestedArray),
27
+ Stream.flatMap(Stream.fromIterable),
28
+ Stream.scan(0, add),
29
+ ),
30
+ ),
31
+ mostStreamTest(() =>
32
+ pipe(
33
+ M.periodic(0),
34
+ M.withItems(nestedArray),
35
+ M.chain((ns) => pipe(M.periodic(0), M.withItems(ns))),
36
+ M.scan(add, 0),
37
+ ),
38
+ ),
39
+ rxjsObservableTest(() =>
40
+ pipe(rxjs.from(nestedArray), rxjs.flatMap(rxjs.from), rxjs.scan(add, 0)),
41
+ ),
42
+ effectTsStreamTest(() =>
43
+ pipe(
44
+ EffectStream.fromChunk(Chunk.from(nestedArray)),
45
+ EffectStream.flatMap((ns) => EffectStream.fromChunk(Chunk.from(ns))),
46
+ EffectStream.scan(0, add),
47
+ ),
48
+ ),
49
+ ]
@@ -0,0 +1,36 @@
1
+ import { pipe } from '@fp-ts/data/Function'
2
+ import * as M from '@most/core'
3
+ import * as rxjs from 'rxjs'
4
+
5
+ import { array, fxTest, iterations, mostStreamTest, rxjsObservableTest } from '../_internal.js'
6
+
7
+ import * as Stream from '@/index.js'
8
+
9
+ const nestedArray = array.map((x) => Array.from({ length: x }, (_, i) => x * 1000 + i))
10
+
11
+ const add = (x: number, y: number): number => x + y
12
+
13
+ export const name = 'switchMap ' + iterations + ' x ' + iterations + ' integers'
14
+
15
+ export const cases = [
16
+ fxTest(() =>
17
+ pipe(
18
+ Stream.fromIterable(nestedArray),
19
+ Stream.switchMap(Stream.fromIterable),
20
+ Stream.scan(0, add),
21
+ ),
22
+ ),
23
+ mostStreamTest(() =>
24
+ pipe(
25
+ M.periodic(0),
26
+ M.withItems(nestedArray),
27
+ M.map((ns) => pipe(M.periodic(0), M.withItems(ns))),
28
+ M.switchLatest,
29
+ M.scan(add, 0),
30
+ ),
31
+ ),
32
+ rxjsObservableTest(() =>
33
+ pipe(rxjs.from(nestedArray), rxjs.switchMap(rxjs.from), rxjs.scan(add, 0)),
34
+ ),
35
+ // Effect Stream is pull-based and does not offer switchMap
36
+ ]
@@ -0,0 +1,14 @@
1
+ # Performance Tests
2
+
3
+ Here is the latest output of the perf test suite run on a 2020 13" macbook pro.
4
+ It is worth noting that all the tests utilize entirely synchronous workflows, and thus
5
+ have a great favoring towards Most.js/RxJS in terms of raw performance overhead.
6
+
7
+ If you need strict performance over push-based streams, definitely use Most.js, but if you are
8
+ interested in the superpowers of `Effect`, and are interested in using push-based streams as a means
9
+ of orchestration `Fx` is still a great bet as it won't often be your bottleneck.
10
+
11
+ If you need strict performance no matter what, none of these abstractions should be utilized at all.
12
+
13
+ ## Test Results
14
+
package/perf/readme.md ADDED
@@ -0,0 +1,40 @@
1
+ # Performance Tests
2
+
3
+ Here is the latest output of the perf test suite run on a 2020 13" macbook pro.
4
+ It is worth noting that all the tests utilize entirely synchronous workflows, and thus
5
+ have a great favoring towards Most.js/RxJS in terms of raw performance overhead.
6
+
7
+ If you need strict performance over push-based streams, definitely use Most.js, but if you are
8
+ interested in the superpowers of `Effect`, and are interested in using push-based streams as a means
9
+ of orchestration `Fx` is still a great bet as it won't often be your bottleneck.
10
+
11
+ If you need strict performance no matter what, none of these abstractions should be utilized at all.
12
+
13
+ ## Test Results
14
+
15
+ ### filter -> map -> scan 10000 integers
16
+ | Library | Ops/sec | ± | Samples |
17
+ | --------------|------------|--------|---------|
18
+ | Fx | 3801.43 | 5.81% | 82 |
19
+ | @most/core | 384094.58 | 12.96% | 64 |
20
+ | RxJS @7 | 2255.04 | 12.60% | 87 |
21
+ | Effect/Stream | 91.50 | 29.12% | 41 |
22
+ -------------------------------------------------------
23
+
24
+ ### flatMap 10000 x 10000 integers
25
+ | Library | Ops/sec | ± | Samples |
26
+ | --------------|------------|--------|---------|
27
+ | Fx | 6474.91 | 11.85% | 76 |
28
+ | @most/core | 276654.02 | 19.33% | 46 |
29
+ | RxJS @7 | 10322.11 | 52.99% | 77 |
30
+ | Effect/Stream | 2.29 | 124.34% | 9 |
31
+ -------------------------------------------------------
32
+
33
+ ### switchMap 10000 x 10000 integers
34
+ | Library | Ops/sec | ± | Samples |
35
+ | --------------|------------|--------|---------|
36
+ | Fx | 4759.84 | 13.52% | 63 |
37
+ | @most/core | 300663.64 | 14.57% | 55 |
38
+ | RxJS @7 | 16469.83 | 2.63% | 75 |
39
+ -------------------------------------------------------
40
+
@@ -0,0 +1,37 @@
1
+ import { spawnSync } from 'node:child_process'
2
+ import * as fs from 'node:fs'
3
+ import { basename, dirname, join } from 'node:path'
4
+ import { fileURLToPath } from 'node:url'
5
+
6
+ const currentDir = dirname(fileURLToPath(import.meta.url))
7
+ const casesDir = join(currentDir, '/cases')
8
+
9
+ export const runPerfTestPath = join(currentDir, 'runPerfTest.ts')
10
+ export const readmeBasePath = join(currentDir, 'readme-base.md')
11
+ export const readmePath = join(currentDir, 'readme.md')
12
+ export const fileNames = fs.readdirSync(casesDir).map((x) => basename(x))
13
+
14
+ let readmeContent = fs.readFileSync(readmeBasePath, 'utf-8').toString()
15
+
16
+ for (const fileName of fileNames) {
17
+ console.log('Running', 'cases/' + basename(fileName), '\n')
18
+
19
+ const { stdout } = spawnSync(`node`, [
20
+ `--loader`,
21
+ `@esbuild-kit/esm-loader`,
22
+ `${runPerfTestPath}`,
23
+ `${fileName}`,
24
+ ])
25
+
26
+ const output = stdout.toString()
27
+
28
+ console.log(output)
29
+
30
+ readmeContent += output
31
+ }
32
+
33
+ if (fs.existsSync(readmePath)) {
34
+ fs.unlinkSync(readmePath)
35
+ }
36
+
37
+ fs.writeFileSync(readmePath, readmeContent)
@@ -0,0 +1,18 @@
1
+ import process from 'node:process'
2
+
3
+ import { runPerformanceTest } from './_internal.js'
4
+
5
+ const fileName = process.argv.slice(2).filter((x) => x.trim() !== '--')[0]
6
+
7
+ async function main() {
8
+ const { name, cases } = await import(
9
+ `./cases/${fileName}${fileName.endsWith('.ts') ? '' : '.ts'}`
10
+ )
11
+
12
+ runPerformanceTest({ name, cases }, () => process.exit(0))
13
+ }
14
+
15
+ main().catch((error) => {
16
+ console.error(error)
17
+ process.exit(1)
18
+ })
@@ -2,6 +2,6 @@
2
2
  "$schema": "https://json.schemastore.org/tsconfig",
3
3
  "extends": "../tsconfig.base.json",
4
4
  "include": [
5
- "./*.ts"
5
+ "."
6
6
  ]
7
7
  }
package/src/Fx.ts CHANGED
@@ -1,18 +1,43 @@
1
+ import { Cause } from '@effect/core/io/Cause'
1
2
  import * as Effect from '@effect/core/io/Effect'
3
+ import { Scope } from '@effect/core/io/Scope'
2
4
 
3
- import { Sink } from './Sink.js'
4
-
5
- export interface Fx<R, E, A, E1 = never> {
6
- readonly run: <R2, E2, B>(sink: Sink<E, A, R2, E2, B>) => Effect.Effect<R | R2, E1 | E2, B>
5
+ export interface Fx<R, E, A> {
6
+ run<R2>(emitter: Emitter<R2, E, A>): Effect.Effect<R | R2 | Scope, never, unknown>
7
7
  }
8
8
 
9
- export function Fx<R, E, A, E1 = never>(run: Fx<R, E, A, E1>['run']): Fx<R, E, A, E1> {
10
- return { run }
9
+ export function Fx<R, E, A>(run: Fx<R, E, A>['run']): Fx<R, E, A> {
10
+ return {
11
+ run,
12
+ }
11
13
  }
12
14
 
13
15
  export namespace Fx {
14
- export type ResourcesOf<T> = T extends Fx<infer R, any, any, any> ? R : never
15
- export type ErrorsOf<T> = T extends Fx<any, infer E, any, any> ? E : never
16
- export type OutputOf<T> = T extends Fx<any, any, infer A, any> ? A : never
17
- export type ReturnErrorsOf<T> = T extends Fx<any, any, any, infer E1> ? E1 : never
16
+ export type ResourcesOf<T> = T extends Fx<infer R, any, any> ? R : never
17
+ export type ErrorsOf<T> = T extends Fx<any, infer E, any> ? E : never
18
+ export type OutputOf<T> = T extends Fx<any, any, infer A> ? A : never
19
+ }
20
+
21
+ export interface Emitter<R, E, A> {
22
+ readonly emit: (a: A) => Effect.Effect<R, never, unknown>
23
+ readonly failCause: (e: Cause<E>) => Effect.Effect<R, never, unknown>
24
+ readonly end: Effect.Effect<R, never, unknown>
25
+ }
26
+
27
+ export function Emitter<R, E, A>(
28
+ emit: Emitter<R, E, A>['emit'],
29
+ failCause: Emitter<R, E, A>['failCause'],
30
+ end: Emitter<R, E, A>['end'],
31
+ ): Emitter<R, E, A> {
32
+ return {
33
+ emit,
34
+ failCause,
35
+ end,
36
+ }
37
+ }
38
+
39
+ export namespace Emitter {
40
+ export type ResourcesOf<T> = T extends Emitter<infer R, any, any> ? R : never
41
+ export type ErrorsOf<T> = T extends Emitter<any, infer E, any> ? E : never
42
+ export type OutputOf<T> = T extends Emitter<any, any, infer A> ? A : never
18
43
  }
package/src/Subject.ts ADDED
@@ -0,0 +1,46 @@
1
+ import * as Effect from '@effect/core/io/Effect'
2
+ import * as Maybe from '@tsplus/stdlib/data/Maybe'
3
+ import { pipe } from 'node_modules/@fp-ts/data/Function.js'
4
+ import { LazyArg } from 'node_modules/@tsplus/stdlib/data/Function.js'
5
+
6
+ import { Emitter, Fx } from './Fx.js'
7
+ import { never } from './fromEffect.js'
8
+ import { Hold } from './hold.js'
9
+ import { Multicast } from './multicast.js'
10
+
11
+ export interface Subject<E, A> extends Emitter<never, E, A>, Fx<never, E, A> {}
12
+
13
+ export namespace Subject {
14
+ export const unsafeMake = <E, A>(): Subject<E, A> => new Multicast<never, E, A>(never)
15
+ }
16
+
17
+ export interface HoldSubject<E, A> extends Subject<E, A> {
18
+ readonly get: Effect.Effect<never, never, Maybe.Maybe<A>>
19
+ }
20
+
21
+ export namespace HoldSubject {
22
+ export const unsafeMake = <E, A>(): HoldSubject<E, A> => new Hold<never, E, A>(never)
23
+ }
24
+
25
+ export interface BehaviorSubject<E, A> extends Subject<E, A> {
26
+ readonly get: Effect.Effect<never, never, A>
27
+ }
28
+
29
+ export namespace BehaviorSubject {
30
+ export const unsafeMake = <E, A>(initial: LazyArg<A>): BehaviorSubject<E, A> => {
31
+ const hold = new Hold<never, E, A>(never)
32
+
33
+ // We're mutating a protected variable here to ensure an initial value is held.
34
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
35
+ // @ts-expect-error
36
+ hold._value = Maybe.some(initial())
37
+
38
+ return {
39
+ emit: hold.emit.bind(hold),
40
+ failCause: hold.failCause.bind(hold),
41
+ end: hold.end,
42
+ run: hold.run.bind(hold),
43
+ get: pipe(hold.get, Effect.map(Maybe.getOrElse(initial))),
44
+ }
45
+ }
46
+ }
package/src/_internal.ts CHANGED
@@ -1,129 +1,74 @@
1
+ import {
2
+ CountdownLatch,
3
+ CountdownLatchInternal,
4
+ } from '@effect/core/concurrent/CountdownLatch/definition'
5
+ import * as Cause from '@effect/core/io/Cause'
1
6
  import * as Deferred from '@effect/core/io/Deferred'
2
7
  import * as Effect from '@effect/core/io/Effect'
3
- import { Exit } from '@effect/core/io/Exit'
4
- import * as Fiber from '@effect/core/io/Fiber'
5
8
  import * as Ref from '@effect/core/io/Ref'
6
- import * as Schedule from '@effect/core/io/Schedule'
7
9
  import { pipe } from '@fp-ts/data/Function'
8
- import * as Duration from '@tsplus/stdlib/data/Duration'
9
- import { isSome } from '@tsplus/stdlib/data/Maybe'
10
+ import * as Maybe from '@tsplus/stdlib/data/Maybe'
10
11
 
11
- export const asap = Schedule.delayed(() => Duration.millis(0))(Schedule.once)
12
-
13
- export function refCountDeferred<E, A>(initialEnded = false, initialCount = 0) {
14
- return Effect.gen(function* ($) {
15
- const ended = yield* $(Ref.makeRef<boolean>(() => initialEnded))
16
- const ref = yield* $(Ref.makeSynchronized(() => initialCount))
17
- const deferred = yield* $(Deferred.make<E, A>())
18
- const increment = ref.update((a) => a + 1)
19
- const decrement = ref.update((a) => Math.max(0, a - 1))
20
- const refCount = ref.get
12
+ export const EARLY_EXIT_FAILURE = Symbol('EarlyExitFailure')
13
+ export interface EarlyExitFailure {
14
+ readonly sym: typeof EARLY_EXIT_FAILURE
15
+ }
16
+ export const EarlyExitFailure: EarlyExitFailure = { sym: EARLY_EXIT_FAILURE }
21
17
 
22
- return {
23
- await: deferred.await,
24
- endIfComplete: <R>(effect: Effect.Effect<R, E, A>): Effect.Effect<R, never, void> =>
25
- Effect.gen(function* ($) {
26
- if ((yield* $(ended.get)) && (yield* $(refCount)) === 0) {
27
- yield* $(pipe(effect, Effect.intoDeferred(deferred)))
28
- }
29
- }),
30
- error: <R>(effect: Effect.Effect<R, E, A>): Effect.Effect<R, never, void> =>
31
- Effect.gen(function* ($) {
32
- yield* $(ended.set(true))
33
- yield* $(pipe(effect, Effect.intoDeferred(deferred)))
34
- }),
35
- increment,
36
- decrement,
37
- refCount,
38
- ended: ended.get,
39
- end: ended.set(true),
40
- }
41
- })
18
+ export function isEarlyExitFailure(u: unknown): u is EarlyExitFailure {
19
+ return typeof u === 'object' && u !== null && (u as any).sym === EARLY_EXIT_FAILURE
42
20
  }
43
21
 
44
- export function deferredCallback<E, A, R2, E2>(
45
- f: (cb: (exit: Exit<E, A>) => Effect.Effect<never, never, never>) => Effect.Effect<R2, E2, A>,
46
- ): Effect.Effect<R2, E | E2, A> {
47
- return Effect.scoped(
48
- Effect.gen(function* ($) {
49
- const deferred = yield* $(Deferred.make<E, A>())
50
- const fiber = yield* $(
51
- Effect.forkScoped(
52
- f((exit) => {
53
- deferred.unsafeDone(Effect.done(exit))
22
+ export const exitEarly = Effect.die(EarlyExitFailure)
54
23
 
55
- return Effect.never
56
- }),
57
- ),
58
- )
24
+ export const onEarlyExitFailure =
25
+ <R2, E2, B>(handler: Effect.Effect<R2, E2, B>) =>
26
+ <R, E, A>(effect: Effect.Effect<R, E, A>): Effect.Effect<R | R2, E | E2, A | B> =>
27
+ pipe(
28
+ effect,
29
+ Effect.foldCauseEffect<E, A, R | R2, E | E2, A | B, R | R2, E | E2, A | B>(
30
+ (e) =>
31
+ pipe(
32
+ e,
33
+ Cause.dieMaybe,
34
+ Maybe.fold(
35
+ () => Effect.failCause(e),
36
+ (d) => (isEarlyExitFailure(d) ? handler : Effect.failCause(e)),
37
+ ),
38
+ ),
39
+ Effect.succeed,
40
+ ),
41
+ )
59
42
 
60
- yield* $(Effect.addFinalizer(Fiber.interrupt(fiber)))
43
+ /**
44
+ * A small wrapper around CountdownLatch which enables incrementing
45
+ * the latch count dynamically
46
+ */
47
+ export type DynamicCountdownLatch = {
48
+ readonly increment: Effect.Effect<never, never, void>
49
+ readonly latch: CountdownLatch
50
+ }
61
51
 
62
- return yield* $(Effect.race(deferred.await)(Fiber.join(fiber)))
63
- }),
52
+ export function makeDynamicCountdownLatch(
53
+ initialCount: number,
54
+ ): Effect.Effect<never, never, DynamicCountdownLatch> {
55
+ return pipe(
56
+ Ref.makeRef<number>(() => initialCount),
57
+ Effect.zipWith(Deferred.make<never, void>(), (ref, deferred) => ({
58
+ increment: ref.update((x) => x + 1),
59
+ latch: new CountdownLatchInternal(ref, deferred),
60
+ })),
64
61
  )
65
62
  }
66
63
 
67
- type RefOutput<T> = T extends Ref.Ref<infer R> ? R : never
68
-
69
- export function tupleRef<Refs extends ReadonlyArray<Ref.Ref<any>>>(
70
- refs: readonly [...Refs],
71
- ): Ref.Ref<{ readonly [K in keyof Refs]: RefOutput<Refs[K]> }> {
72
- const get = Effect.gen(function* ($) {
73
- const result: any[] = []
74
-
75
- for (const ref of refs) {
76
- result.push(yield* $(ref.get))
77
- }
78
-
79
- return result as unknown as { readonly [K in keyof Refs]: RefOutput<Refs[K]> }
80
- })
81
-
82
- const set = (a: { readonly [K in keyof Refs]: RefOutput<Refs[K]> }) =>
83
- Effect.gen(function* ($) {
84
- let i = 0
85
- for (const ref of refs) {
86
- yield* $(ref.set(a[i++]))
87
- }
88
- })
89
-
90
- const tupledRef = {
91
- [Ref.RefSym]: Ref.RefSym,
92
- get,
93
- set,
94
- update: (f) =>
95
- pipe(
96
- get,
97
- Effect.flatMap((a) => set(f(a))),
98
- ),
99
- updateSome: (f) =>
100
- pipe(
101
- get,
102
- Effect.map(f),
103
- Effect.flatMap((a) => (isSome(a) ? set(a.value) : Effect.unit)),
104
- ),
105
- modify: (f) =>
106
- pipe(
107
- get,
108
- Effect.map(f),
109
- Effect.flatMap(([b, a]) => pipe(a, set, Effect.as(b))),
110
- ),
111
- modifySome: (fallback, f) =>
112
- pipe(
113
- get,
114
- Effect.map(f),
115
- Effect.flatMap((maybe) =>
116
- isSome(maybe)
117
- ? pipe(maybe.value[1], set, Effect.as(maybe.value[0]))
118
- : Effect.succeed(fallback),
119
- ),
120
- ),
121
- getAndSet: (a) => pipe(get, Effect.zipLeft(set(a))),
122
- getAndUpdate: (f) => pipe(get, Effect.zipLeft(tupledRef.update(f))),
123
- getAndUpdateSome: (f) => pipe(get, Effect.zipLeft(tupledRef.updateSome(f))),
124
- updateAndGet: (f) => pipe(tupledRef.update(f), Effect.zipRight(get)),
125
- updateSomeAndGet: (f) => pipe(tupledRef.updateSome(f), Effect.zipRight(get)),
126
- } as Ref.Ref<{ readonly [K in keyof Refs]: RefOutput<Refs[K]> }>
127
-
128
- return tupledRef
64
+ export function withDynamicCountdownLatch<R, E, A, R2, E2, B>(
65
+ initialCount: number,
66
+ f: (latch: DynamicCountdownLatch) => Effect.Effect<R, E, A>,
67
+ onEnd: Effect.Effect<R2, E2, B>,
68
+ ): Effect.Effect<R | R2, E | E2, B> {
69
+ return pipe(
70
+ makeDynamicCountdownLatch(initialCount),
71
+ Effect.tap(f),
72
+ Effect.flatMap(({ latch }) => pipe(latch.await, Effect.zipRight(onEnd))),
73
+ )
129
74
  }
@@ -1,34 +1,33 @@
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 * as Duration from '@tsplus/stdlib/data/Duration'
6
6
 
7
- import { combine } from './combine.js'
8
- import { delay } from './delay.js'
9
- import { flatMap } from './flatMap.js'
10
- import { from } from './from.js'
11
- import { collectAll } from './reduce.js'
7
+ import * as Fx from './index.js'
12
8
 
13
9
  describe(import.meta.url, () => {
14
10
  describe('combine', () => {
15
11
  it('combines 2 fx together', async () => {
16
12
  const values = [1, 2, 3]
17
13
  const test = pipe(
18
- from(values),
19
- flatMap((a) =>
20
- pipe(from([a, a + 1]), combine(pipe(from([a * a, a ** a]), delay(Duration.millis(10))))),
14
+ Fx.fromIterable(values),
15
+ Fx.flatMap((a) =>
16
+ pipe(
17
+ Fx.fromIterable([a, a + 1]),
18
+ Fx.combine(pipe(Fx.fromIterable([a * a, a ** a]), Fx.delay(Duration.millis(10)))),
19
+ ),
21
20
  ),
22
21
  )
23
- const events = await pipe(test, collectAll, unsafeRunPromise)
22
+ const events = await pipe(test, Fx.runCollect, Effect.unsafeRunPromise)
24
23
 
25
24
  deepStrictEqual(events, [
26
- [values[0] + 1, values[0] * values[0]],
27
- [values[1] + 1, values[1] * values[1]],
28
- [values[2] + 1, values[2] * values[2]],
29
- [values[0] + 1, values[0] ** values[0]],
30
- [values[1] + 1, values[1] ** values[1]],
31
- [values[2] + 1, values[2] ** values[2]],
25
+ [1 + 1, 1 * 1],
26
+ [2 + 1, 2 * 2],
27
+ [3 + 1, 3 * 3],
28
+ [1 + 1, 1 ** 1],
29
+ [2 + 1, 2 ** 2],
30
+ [3 + 1, 3 ** 3],
32
31
  ])
33
32
  })
34
33
  })