@typed/fx 0.0.4 → 0.0.8

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 (461) hide show
  1. package/.eslintcache +1 -1
  2. package/cjs/Cause/Cause.d.ts +10 -0
  3. package/cjs/Cause/Cause.d.ts.map +1 -1
  4. package/cjs/Cause/Cause.js +37 -2
  5. package/cjs/Cause/Cause.js.map +1 -1
  6. package/cjs/Cause/Renderer.js +1 -1
  7. package/cjs/Cause/Renderer.js.map +1 -1
  8. package/cjs/Env/Env.d.ts +9 -1
  9. package/cjs/Env/Env.d.ts.map +1 -1
  10. package/cjs/Env/Env.js +32 -5
  11. package/cjs/Env/Env.js.map +1 -1
  12. package/cjs/Fiber/fromScope.d.ts +5 -0
  13. package/cjs/Fiber/fromScope.d.ts.map +1 -0
  14. package/cjs/Fiber/fromScope.js +17 -0
  15. package/cjs/Fiber/fromScope.js.map +1 -0
  16. package/cjs/FiberRef/builtins.d.ts +4 -1
  17. package/cjs/FiberRef/builtins.d.ts.map +1 -1
  18. package/cjs/FiberRef/builtins.js +40 -13
  19. package/cjs/FiberRef/builtins.js.map +1 -1
  20. package/cjs/FiberRuntime/FiberRuntime.d.ts.map +1 -1
  21. package/cjs/FiberRuntime/FiberRuntime.js +23 -14
  22. package/cjs/FiberRuntime/FiberRuntime.js.map +1 -1
  23. package/cjs/Fx/Fx.d.ts +4 -3
  24. package/cjs/Fx/Fx.d.ts.map +1 -1
  25. package/cjs/Fx/Fx.js +25 -24
  26. package/cjs/Fx/Fx.js.map +1 -1
  27. package/cjs/Fx/join.d.ts +1 -1
  28. package/cjs/Fx/join.d.ts.map +1 -1
  29. package/cjs/Fx/join.js +1 -1
  30. package/cjs/Fx/join.js.map +1 -1
  31. package/cjs/Schedule/ScheduleState.d.ts +3 -0
  32. package/cjs/Schedule/ScheduleState.d.ts.map +1 -1
  33. package/cjs/Schedule/ScheduleState.js +3 -0
  34. package/cjs/Schedule/ScheduleState.js.map +1 -1
  35. package/cjs/Scheduler/RootScheduler.d.ts.map +1 -1
  36. package/cjs/Scheduler/RootScheduler.js +4 -5
  37. package/cjs/Scheduler/RootScheduler.js.map +1 -1
  38. package/cjs/Scheduler/Scheduler.d.ts +2 -2
  39. package/cjs/Scheduler/Scheduler.d.ts.map +1 -1
  40. package/cjs/Scheduler/Scheduler.js.map +1 -1
  41. package/cjs/Scheduler/callbackScheduler.d.ts.map +1 -1
  42. package/cjs/Scheduler/callbackScheduler.js +1 -0
  43. package/cjs/Scheduler/callbackScheduler.js.map +1 -1
  44. package/cjs/Scheduler/runSchedule.d.ts +1 -1
  45. package/cjs/Scheduler/runSchedule.d.ts.map +1 -1
  46. package/cjs/Scheduler/runSchedule.js +3 -2
  47. package/cjs/Scheduler/runSchedule.js.map +1 -1
  48. package/cjs/Scope/LocalScope.d.ts.map +1 -1
  49. package/cjs/Scope/LocalScope.js +8 -8
  50. package/cjs/Scope/LocalScope.js.map +1 -1
  51. package/cjs/Semaphore/Semaphore.d.ts +9 -9
  52. package/cjs/Semaphore/Semaphore.d.ts.map +1 -1
  53. package/cjs/Semaphore/Semaphore.js +34 -15
  54. package/cjs/Semaphore/Semaphore.js.map +1 -1
  55. package/cjs/Sink/Sink.d.ts +1 -0
  56. package/cjs/Sink/Sink.d.ts.map +1 -1
  57. package/cjs/Sink/Sink.js +11 -1
  58. package/cjs/Sink/Sink.js.map +1 -1
  59. package/cjs/Stream/Stream.d.ts +5 -14
  60. package/cjs/Stream/Stream.d.ts.map +1 -1
  61. package/cjs/Stream/Stream.js.map +1 -1
  62. package/cjs/Stream/acquirePermit.d.ts +15 -0
  63. package/cjs/Stream/acquirePermit.d.ts.map +1 -0
  64. package/cjs/Stream/acquirePermit.js +43 -0
  65. package/cjs/Stream/acquirePermit.js.map +1 -0
  66. package/cjs/Stream/bimap.d.ts +33 -4
  67. package/cjs/Stream/bimap.d.ts.map +1 -1
  68. package/cjs/Stream/bimap.js +109 -12
  69. package/cjs/Stream/bimap.js.map +1 -1
  70. package/cjs/Stream/continueWith.d.ts +4 -3
  71. package/cjs/Stream/continueWith.d.ts.map +1 -1
  72. package/cjs/Stream/continueWith.js +9 -6
  73. package/cjs/Stream/continueWith.js.map +1 -1
  74. package/cjs/Stream/delay.d.ts +4 -0
  75. package/cjs/Stream/delay.d.ts.map +1 -0
  76. package/cjs/Stream/delay.js +30 -0
  77. package/cjs/Stream/delay.js.map +1 -0
  78. package/cjs/Stream/drain.d.ts +2 -2
  79. package/cjs/Stream/drain.d.ts.map +1 -1
  80. package/cjs/Stream/drain.js +5 -5
  81. package/cjs/Stream/drain.js.map +1 -1
  82. package/cjs/Stream/empty.d.ts.map +1 -1
  83. package/cjs/Stream/empty.js +1 -2
  84. package/cjs/Stream/empty.js.map +1 -1
  85. package/cjs/Stream/flatMap.d.ts +7 -5
  86. package/cjs/Stream/flatMap.d.ts.map +1 -1
  87. package/cjs/Stream/flatMap.js +33 -19
  88. package/cjs/Stream/flatMap.js.map +1 -1
  89. package/cjs/Stream/flatMapConcurrently.d.ts +6 -0
  90. package/cjs/Stream/flatMapConcurrently.d.ts.map +1 -0
  91. package/cjs/Stream/flatMapConcurrently.js +25 -0
  92. package/cjs/Stream/flatMapConcurrently.js.map +1 -0
  93. package/cjs/Stream/flatMapFx.d.ts +5 -1
  94. package/cjs/Stream/flatMapFx.d.ts.map +1 -1
  95. package/cjs/Stream/flatMapFx.js +18 -3
  96. package/cjs/Stream/flatMapFx.js.map +1 -1
  97. package/cjs/Stream/foldMap.d.ts +11 -0
  98. package/cjs/Stream/foldMap.d.ts.map +1 -0
  99. package/cjs/Stream/foldMap.js +67 -0
  100. package/cjs/Stream/foldMap.js.map +1 -0
  101. package/cjs/Stream/fromArray.d.ts +2 -0
  102. package/cjs/Stream/fromArray.d.ts.map +1 -0
  103. package/cjs/Stream/fromArray.js +12 -0
  104. package/cjs/Stream/fromArray.js.map +1 -0
  105. package/cjs/Stream/fromCallback.d.ts +4 -3
  106. package/cjs/Stream/fromCallback.d.ts.map +1 -1
  107. package/cjs/Stream/fromCallback.js +26 -26
  108. package/cjs/Stream/fromCallback.js.map +1 -1
  109. package/cjs/Stream/fromFx.d.ts +23 -8
  110. package/cjs/Stream/fromFx.d.ts.map +1 -1
  111. package/cjs/Stream/fromFx.js +36 -16
  112. package/cjs/Stream/fromFx.js.map +1 -1
  113. package/cjs/Stream/hkt.d.ts +24 -1
  114. package/cjs/Stream/hkt.d.ts.map +1 -1
  115. package/cjs/Stream/hkt.js +43 -5
  116. package/cjs/Stream/hkt.js.map +1 -1
  117. package/cjs/Stream/hold.d.ts +27 -0
  118. package/cjs/Stream/hold.d.ts.map +1 -0
  119. package/cjs/Stream/hold.js +94 -0
  120. package/cjs/Stream/hold.js.map +1 -0
  121. package/cjs/Stream/index.d.ts +14 -1
  122. package/cjs/Stream/index.d.ts.map +1 -1
  123. package/cjs/Stream/index.js +14 -1
  124. package/cjs/Stream/index.js.map +1 -1
  125. package/cjs/Stream/lazy.d.ts +3 -0
  126. package/cjs/Stream/lazy.d.ts.map +1 -0
  127. package/cjs/Stream/lazy.js +9 -0
  128. package/cjs/Stream/lazy.js.map +1 -0
  129. package/cjs/Stream/merge.d.ts +18 -0
  130. package/cjs/Stream/merge.d.ts.map +1 -0
  131. package/cjs/Stream/merge.js +84 -0
  132. package/cjs/Stream/merge.js.map +1 -0
  133. package/cjs/Stream/multicast.d.ts +27 -0
  134. package/cjs/Stream/multicast.d.ts.map +1 -0
  135. package/cjs/Stream/multicast.js +83 -0
  136. package/cjs/Stream/multicast.js.map +1 -0
  137. package/cjs/Stream/orElse.d.ts +17 -0
  138. package/cjs/Stream/orElse.d.ts.map +1 -0
  139. package/cjs/Stream/orElse.js +105 -0
  140. package/cjs/Stream/orElse.js.map +1 -0
  141. package/cjs/Stream/periodic.d.ts +1 -1
  142. package/cjs/Stream/periodic.d.ts.map +1 -1
  143. package/cjs/Stream/periodic.js +1 -1
  144. package/cjs/Stream/periodic.js.map +1 -1
  145. package/cjs/Stream/provide.d.ts +8 -0
  146. package/cjs/Stream/provide.d.ts.map +1 -0
  147. package/cjs/Stream/provide.js +42 -0
  148. package/cjs/Stream/provide.js.map +1 -0
  149. package/cjs/Stream/run.d.ts +2 -2
  150. package/cjs/Stream/run.d.ts.map +1 -1
  151. package/cjs/Stream/run.js +1 -1
  152. package/cjs/Stream/run.js.map +1 -1
  153. package/cjs/Stream/scan.d.ts +17 -0
  154. package/cjs/Stream/scan.d.ts.map +1 -0
  155. package/cjs/Stream/scan.js +32 -0
  156. package/cjs/Stream/scan.js.map +1 -0
  157. package/cjs/Stream/scheduled.d.ts +12 -3
  158. package/cjs/Stream/scheduled.d.ts.map +1 -1
  159. package/cjs/Stream/scheduled.js +23 -5
  160. package/cjs/Stream/scheduled.js.map +1 -1
  161. package/cjs/Stream/setFiberRefLocally.d.ts +15 -0
  162. package/cjs/Stream/setFiberRefLocally.d.ts.map +1 -0
  163. package/cjs/Stream/setFiberRefLocally.js +53 -0
  164. package/cjs/Stream/setFiberRefLocally.js.map +1 -0
  165. package/cjs/Stream/skipRepeats.d.ts +5 -0
  166. package/cjs/Stream/skipRepeats.d.ts.map +1 -0
  167. package/cjs/Stream/skipRepeats.js +36 -0
  168. package/cjs/Stream/skipRepeats.js.map +1 -0
  169. package/cjs/Stream/switchMap.d.ts +18 -0
  170. package/cjs/Stream/switchMap.d.ts.map +1 -0
  171. package/cjs/Stream/switchMap.js +124 -0
  172. package/cjs/Stream/switchMap.js.map +1 -0
  173. package/cjs/Stream/tap.d.ts +2 -1
  174. package/cjs/Stream/tap.d.ts.map +1 -1
  175. package/cjs/Stream/tap.js +4 -2
  176. package/cjs/Stream/tap.js.map +1 -1
  177. package/cjs/Supervisor/index.d.ts +2 -0
  178. package/cjs/Supervisor/index.d.ts.map +1 -1
  179. package/cjs/Supervisor/index.js +2 -0
  180. package/cjs/Supervisor/index.js.map +1 -1
  181. package/cjs/Supervisor/inheritFiberRefs.d.ts +2 -0
  182. package/cjs/Supervisor/inheritFiberRefs.d.ts.map +1 -0
  183. package/cjs/Supervisor/inheritFiberRefs.js +17 -0
  184. package/cjs/Supervisor/inheritFiberRefs.js.map +1 -0
  185. package/cjs/Timeline/index.js.map +1 -1
  186. package/esm/Cause/Cause.d.ts +10 -0
  187. package/esm/Cause/Cause.d.ts.map +1 -1
  188. package/esm/Cause/Cause.js +27 -0
  189. package/esm/Cause/Cause.js.map +1 -1
  190. package/esm/Cause/Renderer.js +1 -1
  191. package/esm/Cause/Renderer.js.map +1 -1
  192. package/esm/Env/Env.d.ts +9 -1
  193. package/esm/Env/Env.d.ts.map +1 -1
  194. package/esm/Env/Env.js +8 -5
  195. package/esm/Env/Env.js.map +1 -1
  196. package/esm/Fiber/fromScope.d.ts +5 -0
  197. package/esm/Fiber/fromScope.d.ts.map +1 -0
  198. package/esm/Fiber/fromScope.js +13 -0
  199. package/esm/Fiber/fromScope.js.map +1 -0
  200. package/esm/FiberRef/builtins.d.ts +4 -1
  201. package/esm/FiberRef/builtins.d.ts.map +1 -1
  202. package/esm/FiberRef/builtins.js +36 -12
  203. package/esm/FiberRef/builtins.js.map +1 -1
  204. package/esm/FiberRuntime/FiberRuntime.d.ts.map +1 -1
  205. package/esm/FiberRuntime/FiberRuntime.js +23 -14
  206. package/esm/FiberRuntime/FiberRuntime.js.map +1 -1
  207. package/esm/Fx/Fx.d.ts +4 -3
  208. package/esm/Fx/Fx.d.ts.map +1 -1
  209. package/esm/Fx/Fx.js +22 -22
  210. package/esm/Fx/Fx.js.map +1 -1
  211. package/esm/Fx/join.d.ts +1 -1
  212. package/esm/Fx/join.d.ts.map +1 -1
  213. package/esm/Fx/join.js +1 -1
  214. package/esm/Fx/join.js.map +1 -1
  215. package/esm/Schedule/ScheduleState.d.ts +3 -0
  216. package/esm/Schedule/ScheduleState.d.ts.map +1 -1
  217. package/esm/Schedule/ScheduleState.js +3 -0
  218. package/esm/Schedule/ScheduleState.js.map +1 -1
  219. package/esm/Scheduler/RootScheduler.d.ts.map +1 -1
  220. package/esm/Scheduler/RootScheduler.js +4 -5
  221. package/esm/Scheduler/RootScheduler.js.map +1 -1
  222. package/esm/Scheduler/Scheduler.d.ts +2 -2
  223. package/esm/Scheduler/Scheduler.d.ts.map +1 -1
  224. package/esm/Scheduler/Scheduler.js.map +1 -1
  225. package/esm/Scheduler/callbackScheduler.d.ts.map +1 -1
  226. package/esm/Scheduler/callbackScheduler.js +1 -0
  227. package/esm/Scheduler/callbackScheduler.js.map +1 -1
  228. package/esm/Scheduler/runSchedule.d.ts +1 -1
  229. package/esm/Scheduler/runSchedule.d.ts.map +1 -1
  230. package/esm/Scheduler/runSchedule.js +4 -3
  231. package/esm/Scheduler/runSchedule.js.map +1 -1
  232. package/esm/Scope/LocalScope.d.ts.map +1 -1
  233. package/esm/Scope/LocalScope.js +8 -8
  234. package/esm/Scope/LocalScope.js.map +1 -1
  235. package/esm/Semaphore/Semaphore.d.ts +9 -9
  236. package/esm/Semaphore/Semaphore.d.ts.map +1 -1
  237. package/esm/Semaphore/Semaphore.js +11 -15
  238. package/esm/Semaphore/Semaphore.js.map +1 -1
  239. package/esm/Sink/Sink.d.ts +1 -0
  240. package/esm/Sink/Sink.d.ts.map +1 -1
  241. package/esm/Sink/Sink.js +10 -1
  242. package/esm/Sink/Sink.js.map +1 -1
  243. package/esm/Stream/Stream.d.ts +5 -14
  244. package/esm/Stream/Stream.d.ts.map +1 -1
  245. package/esm/Stream/Stream.js.map +1 -1
  246. package/esm/Stream/acquirePermit.d.ts +15 -0
  247. package/esm/Stream/acquirePermit.d.ts.map +1 -0
  248. package/esm/Stream/acquirePermit.js +15 -0
  249. package/esm/Stream/acquirePermit.js.map +1 -0
  250. package/esm/Stream/bimap.d.ts +33 -4
  251. package/esm/Stream/bimap.d.ts.map +1 -1
  252. package/esm/Stream/bimap.js +102 -11
  253. package/esm/Stream/bimap.js.map +1 -1
  254. package/esm/Stream/continueWith.d.ts +4 -3
  255. package/esm/Stream/continueWith.d.ts.map +1 -1
  256. package/esm/Stream/continueWith.js +9 -6
  257. package/esm/Stream/continueWith.js.map +1 -1
  258. package/esm/Stream/delay.d.ts +4 -0
  259. package/esm/Stream/delay.d.ts.map +1 -0
  260. package/esm/Stream/delay.js +26 -0
  261. package/esm/Stream/delay.js.map +1 -0
  262. package/esm/Stream/drain.d.ts +2 -2
  263. package/esm/Stream/drain.d.ts.map +1 -1
  264. package/esm/Stream/drain.js +6 -6
  265. package/esm/Stream/drain.js.map +1 -1
  266. package/esm/Stream/empty.d.ts.map +1 -1
  267. package/esm/Stream/empty.js +1 -2
  268. package/esm/Stream/empty.js.map +1 -1
  269. package/esm/Stream/flatMap.d.ts +7 -5
  270. package/esm/Stream/flatMap.d.ts.map +1 -1
  271. package/esm/Stream/flatMap.js +32 -19
  272. package/esm/Stream/flatMap.js.map +1 -1
  273. package/esm/Stream/flatMapConcurrently.d.ts +6 -0
  274. package/esm/Stream/flatMapConcurrently.d.ts.map +1 -0
  275. package/esm/Stream/flatMapConcurrently.js +19 -0
  276. package/esm/Stream/flatMapConcurrently.js.map +1 -0
  277. package/esm/Stream/flatMapFx.d.ts +5 -1
  278. package/esm/Stream/flatMapFx.d.ts.map +1 -1
  279. package/esm/Stream/flatMapFx.js +16 -4
  280. package/esm/Stream/flatMapFx.js.map +1 -1
  281. package/esm/Stream/foldMap.d.ts +11 -0
  282. package/esm/Stream/foldMap.d.ts.map +1 -0
  283. package/esm/Stream/foldMap.js +38 -0
  284. package/esm/Stream/foldMap.js.map +1 -0
  285. package/esm/Stream/fromArray.d.ts +2 -0
  286. package/esm/Stream/fromArray.d.ts.map +1 -0
  287. package/esm/Stream/fromArray.js +8 -0
  288. package/esm/Stream/fromArray.js.map +1 -0
  289. package/esm/Stream/fromCallback.d.ts +4 -3
  290. package/esm/Stream/fromCallback.d.ts.map +1 -1
  291. package/esm/Stream/fromCallback.js +26 -26
  292. package/esm/Stream/fromCallback.js.map +1 -1
  293. package/esm/Stream/fromFx.d.ts +23 -8
  294. package/esm/Stream/fromFx.d.ts.map +1 -1
  295. package/esm/Stream/fromFx.js +24 -14
  296. package/esm/Stream/fromFx.js.map +1 -1
  297. package/esm/Stream/hkt.d.ts +24 -1
  298. package/esm/Stream/hkt.d.ts.map +1 -1
  299. package/esm/Stream/hkt.js +41 -4
  300. package/esm/Stream/hkt.js.map +1 -1
  301. package/esm/Stream/hold.d.ts +27 -0
  302. package/esm/Stream/hold.d.ts.map +1 -0
  303. package/esm/Stream/hold.js +66 -0
  304. package/esm/Stream/hold.js.map +1 -0
  305. package/esm/Stream/index.d.ts +14 -1
  306. package/esm/Stream/index.d.ts.map +1 -1
  307. package/esm/Stream/index.js +14 -1
  308. package/esm/Stream/index.js.map +1 -1
  309. package/esm/Stream/lazy.d.ts +3 -0
  310. package/esm/Stream/lazy.d.ts.map +1 -0
  311. package/esm/Stream/lazy.js +5 -0
  312. package/esm/Stream/lazy.js.map +1 -0
  313. package/esm/Stream/merge.d.ts +18 -0
  314. package/esm/Stream/merge.d.ts.map +1 -0
  315. package/esm/Stream/merge.js +55 -0
  316. package/esm/Stream/merge.js.map +1 -0
  317. package/esm/Stream/multicast.d.ts +27 -0
  318. package/esm/Stream/multicast.d.ts.map +1 -0
  319. package/esm/Stream/multicast.js +55 -0
  320. package/esm/Stream/multicast.js.map +1 -0
  321. package/esm/Stream/orElse.d.ts +17 -0
  322. package/esm/Stream/orElse.d.ts.map +1 -0
  323. package/esm/Stream/orElse.js +77 -0
  324. package/esm/Stream/orElse.js.map +1 -0
  325. package/esm/Stream/periodic.d.ts +1 -1
  326. package/esm/Stream/periodic.d.ts.map +1 -1
  327. package/esm/Stream/periodic.js +1 -1
  328. package/esm/Stream/periodic.js.map +1 -1
  329. package/esm/Stream/provide.d.ts +8 -0
  330. package/esm/Stream/provide.d.ts.map +1 -0
  331. package/esm/Stream/provide.js +13 -0
  332. package/esm/Stream/provide.js.map +1 -0
  333. package/esm/Stream/run.d.ts +2 -2
  334. package/esm/Stream/run.d.ts.map +1 -1
  335. package/esm/Stream/run.js +2 -2
  336. package/esm/Stream/run.js.map +1 -1
  337. package/esm/Stream/scan.d.ts +17 -0
  338. package/esm/Stream/scan.d.ts.map +1 -0
  339. package/esm/Stream/scan.js +27 -0
  340. package/esm/Stream/scan.js.map +1 -0
  341. package/esm/Stream/scheduled.d.ts +12 -3
  342. package/esm/Stream/scheduled.d.ts.map +1 -1
  343. package/esm/Stream/scheduled.js +16 -4
  344. package/esm/Stream/scheduled.js.map +1 -1
  345. package/esm/Stream/setFiberRefLocally.d.ts +15 -0
  346. package/esm/Stream/setFiberRefLocally.d.ts.map +1 -0
  347. package/esm/Stream/setFiberRefLocally.js +25 -0
  348. package/esm/Stream/setFiberRefLocally.js.map +1 -0
  349. package/esm/Stream/skipRepeats.d.ts +5 -0
  350. package/esm/Stream/skipRepeats.d.ts.map +1 -0
  351. package/esm/Stream/skipRepeats.js +31 -0
  352. package/esm/Stream/skipRepeats.js.map +1 -0
  353. package/esm/Stream/switchMap.d.ts +18 -0
  354. package/esm/Stream/switchMap.d.ts.map +1 -0
  355. package/esm/Stream/switchMap.js +95 -0
  356. package/esm/Stream/switchMap.js.map +1 -0
  357. package/esm/Stream/tap.d.ts +2 -1
  358. package/esm/Stream/tap.d.ts.map +1 -1
  359. package/esm/Stream/tap.js +3 -2
  360. package/esm/Stream/tap.js.map +1 -1
  361. package/esm/Supervisor/index.d.ts +2 -0
  362. package/esm/Supervisor/index.d.ts.map +1 -1
  363. package/esm/Supervisor/index.js +2 -0
  364. package/esm/Supervisor/index.js.map +1 -1
  365. package/esm/Supervisor/inheritFiberRefs.d.ts +2 -0
  366. package/esm/Supervisor/inheritFiberRefs.d.ts.map +1 -0
  367. package/esm/Supervisor/inheritFiberRefs.js +14 -0
  368. package/esm/Supervisor/inheritFiberRefs.js.map +1 -0
  369. package/esm/Timeline/index.js.map +1 -1
  370. package/package.json +173 -37
  371. package/perf/Stream-filter-map-reduce.test.ts +103 -0
  372. package/readme.md +1 -1
  373. package/src/Cause/Cause.ts +63 -0
  374. package/src/Cause/Renderer.ts +1 -1
  375. package/src/Env/Env.ts +15 -5
  376. package/src/Fiber/fromScope.ts +19 -0
  377. package/src/FiberRef/builtins.ts +63 -11
  378. package/src/FiberRuntime/FiberRuntime.ts +35 -28
  379. package/src/Fx/Fx.test.ts +2 -2
  380. package/src/Fx/Fx.ts +11 -10
  381. package/src/Fx/join.ts +4 -4
  382. package/src/Schedule/ScheduleState.ts +3 -0
  383. package/src/Scheduler/RootScheduler.ts +7 -9
  384. package/src/Scheduler/Scheduler.ts +5 -6
  385. package/src/Scheduler/callbackScheduler.ts +1 -0
  386. package/src/Scheduler/runSchedule.ts +5 -2
  387. package/src/Scope/LocalScope.ts +8 -6
  388. package/src/Semaphore/Semaphore.ts +12 -19
  389. package/src/Sink/Sink.ts +11 -1
  390. package/src/Stream/Stream.ts +9 -15
  391. package/src/Stream/acquirePermit.ts +32 -0
  392. package/src/Stream/bimap.ts +164 -12
  393. package/src/Stream/continueWith.ts +11 -7
  394. package/src/Stream/delay.ts +43 -0
  395. package/src/Stream/drain.ts +8 -7
  396. package/src/Stream/empty.ts +1 -2
  397. package/src/Stream/flatMap.test.ts +8 -21
  398. package/src/Stream/flatMap.ts +46 -24
  399. package/src/Stream/flatMapConcurrently.test.ts +77 -0
  400. package/src/Stream/flatMapConcurrently.ts +34 -0
  401. package/src/Stream/flatMapFx.ts +37 -4
  402. package/src/Stream/foldMap.ts +88 -0
  403. package/src/Stream/fromArray.ts +8 -0
  404. package/src/Stream/fromCallback.test.ts +3 -16
  405. package/src/Stream/fromCallback.ts +48 -29
  406. package/src/Stream/fromFx.test.ts +3 -24
  407. package/src/Stream/fromFx.ts +54 -28
  408. package/src/Stream/hkt.ts +59 -10
  409. package/src/Stream/hold.test.ts +52 -0
  410. package/src/Stream/hold.ts +117 -0
  411. package/src/Stream/index.ts +14 -1
  412. package/src/Stream/lazy.ts +5 -0
  413. package/src/Stream/logging.test.ts +8 -3
  414. package/src/Stream/merge.test.ts +31 -0
  415. package/src/Stream/merge.ts +76 -0
  416. package/src/Stream/multicast.test.ts +32 -0
  417. package/src/Stream/multicast.ts +114 -0
  418. package/src/Stream/orElse.ts +107 -0
  419. package/src/Stream/periodic.ts +2 -2
  420. package/src/Stream/provide.test.ts +78 -0
  421. package/src/Stream/provide.ts +34 -0
  422. package/src/Stream/run.ts +6 -3
  423. package/src/Stream/scan.test.ts +28 -0
  424. package/src/Stream/scan.ts +46 -0
  425. package/src/Stream/scheduled.test.ts +9 -1
  426. package/src/Stream/scheduled.ts +46 -12
  427. package/src/Stream/setFiberRefLocally.ts +38 -0
  428. package/src/Stream/skipRepeats.ts +41 -0
  429. package/src/Stream/switchMap.test.ts +43 -0
  430. package/src/Stream/switchMap.ts +145 -0
  431. package/src/Stream/tap.ts +6 -3
  432. package/src/Supervisor/index.ts +2 -0
  433. package/src/Supervisor/inheritFiberRefs.ts +17 -0
  434. package/src/Timeline/index.ts +1 -0
  435. package/cjs/Effect/Effect.d.ts +0 -199
  436. package/cjs/Effect/Effect.d.ts.map +0 -1
  437. package/cjs/Effect/Effect.js +0 -66
  438. package/cjs/Effect/Effect.js.map +0 -1
  439. package/cjs/Stream/map.d.ts +0 -14
  440. package/cjs/Stream/map.d.ts.map +0 -1
  441. package/cjs/Stream/map.js +0 -30
  442. package/cjs/Stream/map.js.map +0 -1
  443. package/cjs/test.d.ts +0 -1
  444. package/cjs/test.d.ts.map +0 -1
  445. package/cjs/test.js +0 -2
  446. package/cjs/test.js.map +0 -1
  447. package/esm/Effect/Effect.d.ts +0 -199
  448. package/esm/Effect/Effect.d.ts.map +0 -1
  449. package/esm/Effect/Effect.js +0 -50
  450. package/esm/Effect/Effect.js.map +0 -1
  451. package/esm/Stream/map.d.ts +0 -14
  452. package/esm/Stream/map.d.ts.map +0 -1
  453. package/esm/Stream/map.js +0 -25
  454. package/esm/Stream/map.js.map +0 -1
  455. package/esm/test.d.ts +0 -1
  456. package/esm/test.d.ts.map +0 -1
  457. package/esm/test.js +0 -2
  458. package/esm/test.js.map +0 -1
  459. package/src/Effect/Effect.ts +0 -109
  460. package/src/Stream/map.ts +0 -35
  461. package/src/test.ts +0 -0
@@ -85,6 +85,16 @@ export const traced =
85
85
  <E>(cause: Cause<E>): Cause<E> =>
86
86
  new Traced(cause, trace)
87
87
 
88
+ export const isEmpty = <E>(cause: Cause<E>): cause is Empty => cause.tag === Empty.tag
89
+ export const isInterrupted = <E>(cause: Cause<E>): cause is Interrupted =>
90
+ cause.tag === 'Interrupted'
91
+ export const isUnexpected = <E>(cause: Cause<E>): cause is Unexpected => cause.tag === 'Unexpected'
92
+ export const isExpected = <E>(cause: Cause<E>): cause is Expected<E> => cause.tag === 'Expected'
93
+ export const isSequential = <E>(cause: Cause<E>): cause is Sequential<E, E> =>
94
+ cause.tag === 'Sequential'
95
+ export const isParallel = <E>(cause: Cause<E>): cause is Parallel<E, E> => cause.tag === 'Parallel'
96
+ export const isTraced = <E>(cause: Cause<E>): cause is Traced<E> => cause.tag === 'Traced'
97
+
88
98
  export const makeParallelAssociative = <E>(): Associative.Associative<Cause<E>> => ({
89
99
  concat: (left, right) =>
90
100
  left.tag === Empty.tag ? right : right.tag === Empty.tag ? left : new Parallel(left, right),
@@ -423,3 +433,56 @@ export const makeDebug = <E>(renderer: Renderer<E> = defaultRenderer): D.Debug<C
423
433
  D.Debug((cause) => prettyPrint(cause, renderer))
424
434
 
425
435
  export const Debug = makeDebug()
436
+
437
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
438
+ export const findExpected = find(<E>(_e: E): _e is E => true)
439
+
440
+ export function findType<T extends Cause<any>['tag']>(tag: T) {
441
+ return <E>(cause: Cause<E>): Maybe.Maybe<Cause<E>> => {
442
+ if (cause.tag === tag) {
443
+ return Maybe.Just(cause)
444
+ }
445
+
446
+ if (cause.tag === 'Sequential') {
447
+ return pipe(
448
+ findType(tag)(cause.left),
449
+ Maybe.match(
450
+ () => findType(tag)(cause.right),
451
+ (a) =>
452
+ pipe(
453
+ findType(tag)(cause.right),
454
+ Maybe.match(
455
+ () => Maybe.Just(a),
456
+ (b) => Maybe.Just(sequential(a, b)),
457
+ ),
458
+ ),
459
+ ),
460
+ )
461
+ }
462
+
463
+ if (cause.tag === 'Parallel') {
464
+ return pipe(
465
+ findType(tag)(cause.left),
466
+ Maybe.match(
467
+ () => findType(tag)(cause.right),
468
+ (a) =>
469
+ pipe(
470
+ findType(tag)(cause.right),
471
+ Maybe.match(
472
+ () => Maybe.Just(a),
473
+ (b) => Maybe.Just(parallel(a, b)),
474
+ ),
475
+ ),
476
+ ),
477
+ )
478
+ }
479
+
480
+ if (cause.tag === 'Traced') {
481
+ return findType(tag)(cause.cause)
482
+ }
483
+
484
+ return Maybe.Nothing
485
+ }
486
+ }
487
+
488
+ export const findInterrupted = findType('Interrupted')
@@ -67,7 +67,7 @@ export function renderInterrupted<E>(
67
67
  ): Sequential {
68
68
  return Sequential([
69
69
  Failure([
70
- `Interrupted by Fiber ${FiberIdDebug.debug(cause.fiberId)}.`,
70
+ `Interrupted by ${FiberIdDebug.debug(cause.fiberId)}.`,
71
71
  '',
72
72
  ...renderTrace(trace, renderer),
73
73
  ]),
package/src/Env/Env.ts CHANGED
@@ -1,14 +1,24 @@
1
- import { getServiceFromFiberRefs } from '@/FiberRef/builtins.js'
1
+ import { makeEnvFromFiberRefs } from '@/FiberRef/builtins.js'
2
2
  import * as FiberRefs from '@/FiberRefs/FiberRefs.js'
3
3
  import { Of } from '@/Fx/Fx.js'
4
4
  import { Service } from '@/Service/Service.js'
5
5
 
6
+ /**
7
+ * Env is an abstraction over FiberRefs which keeps track of services and joining them back together.
8
+ */
6
9
  export interface Env<R> {
10
+ readonly fiberRefs: FiberRefs.FiberRefs
7
11
  readonly get: <S extends R>(service: Service<S>) => Of<S>
12
+ readonly addService: <S, I extends S>(service: Service<S>, impl: I) => Env<R | S>
13
+ readonly join: <S>(other: Env<S>) => Env<R | S>
8
14
  }
9
15
 
10
- export function Env<R>(fiberRefs: FiberRefs.FiberRefs): Env<R> {
11
- return {
12
- get: getServiceFromFiberRefs(fiberRefs),
13
- }
16
+ export const Empty = makeEnvFromFiberRefs<never>(FiberRefs.FiberRefs())
17
+
18
+ export function Env<S, I extends S>(service: Service<S>, impl: I): Env<S> {
19
+ return Empty.addService(service, impl)
20
+ }
21
+
22
+ export function fromFiberRefs<R>(fiberRefs: FiberRefs.FiberRefs): Env<R> {
23
+ return makeEnvFromFiberRefs(fiberRefs)
14
24
  }
@@ -0,0 +1,19 @@
1
+ import { pipe } from 'hkt-ts'
2
+
3
+ import { Synthetic } from './Fiber.js'
4
+
5
+ import { FiberId } from '@/FiberId/FiberId.js'
6
+ import { Closeable, closeOrWait, wait } from '@/Scope/Closeable.js'
7
+ import { Exit, FiberRefs, Fx } from '@/index.js'
8
+
9
+ export function fromScope(id: FiberId, fiberRefs: FiberRefs.FiberRefs, scope: Closeable) {
10
+ return Synthetic({
11
+ id,
12
+ exit: wait(scope),
13
+ inheritFiberRefs: pipe(
14
+ Fx.getFiberRefs,
15
+ Fx.flatMap((refs) => Fx.fromLazy(() => FiberRefs.join(refs, fiberRefs))),
16
+ ),
17
+ interruptAs: (id) => closeOrWait(scope)(Exit.interrupt(id)),
18
+ })
19
+ }
@@ -19,8 +19,7 @@ import { Trace } from '@/Trace/Trace.js'
19
19
  export const CurrentEnv = make(
20
20
  pipe(
21
21
  Fx.getFiberContext,
22
- // Always use a snapshot of the FiberRefs to avoid mutability problems.
23
- Fx.map((c): Env<any> => ({ get: getServiceFromFiberRefs(c.fiberRefs) })),
22
+ Fx.map((c) => makeEnvFromFiberRefs(c.fiberRefs)),
24
23
  ),
25
24
  {
26
25
  fork: constant(Nothing), // Always create a new Env for each Fiber.
@@ -28,6 +27,18 @@ export const CurrentEnv = make(
28
27
  },
29
28
  )
30
29
 
30
+ export function makeEnvFromFiberRefs<R>(fiberRefs: FiberRefs.FiberRefs): Env<R> {
31
+ // Always use a snapshot of the FiberRefs to avoid mutability problems.
32
+ const forked = FiberRefs.fork(fiberRefs)
33
+
34
+ return {
35
+ fiberRefs: forked,
36
+ get: getServiceFromFiberRefs(forked),
37
+ addService: addServiceFromFiberRefs(forked),
38
+ join: joinEnvFromFiberRefs(forked),
39
+ }
40
+ }
41
+
31
42
  export const CurrentConcurrencyLevel = make(
32
43
  Fx.fromLazy(() => new Semaphore(NonNegativeInteger(Infinity))),
33
44
  {
@@ -55,17 +66,26 @@ export const Layers = FiberRef.make(
55
66
  },
56
67
  )
57
68
 
58
- export const Services = FiberRef.make(Fx.now(ImmutableMap<Service<any>, any>()), {
59
- join: identity, // Always keep the parent Fiber's services
60
- })
69
+ export const Services = FiberRef.make(
70
+ Fx.fromLazy(() => ImmutableMap<Service<any>, any>()),
71
+ {
72
+ join: identity, // Always keep the parent Fiber's services
73
+ },
74
+ )
61
75
 
62
- export const CurrentLogSpans = FiberRef.make(Fx.now(ImmutableMap<string, LogSpan>()), {
63
- join: identity,
64
- })
76
+ export const CurrentLogSpans = FiberRef.make(
77
+ Fx.fromLazy(() => ImmutableMap<string, LogSpan>()),
78
+ {
79
+ join: identity,
80
+ },
81
+ )
65
82
 
66
- export const CurrentLogAnnotations = FiberRef.make(Fx.now(ImmutableMap<string, LogAnnotation>()), {
67
- join: identity,
68
- })
83
+ export const CurrentLogAnnotations = FiberRef.make(
84
+ Fx.fromLazy(() => ImmutableMap<string, LogAnnotation>()),
85
+ {
86
+ join: identity,
87
+ },
88
+ )
69
89
 
70
90
  export function getServiceFromFiberRefs(fiberRefs: FiberRefs.FiberRefs) {
71
91
  return <S>(id: Service<S>): Fx.Of<S> => {
@@ -112,3 +132,35 @@ const getLayerFromFiberRefs = <S>(id: Service<S>, fiberRefs: FiberRefs.FiberRefs
112
132
 
113
133
  return join(fiber)
114
134
  })
135
+
136
+ export function addServiceFromFiberRefs<R>(fiberRefs: FiberRefs.FiberRefs): Env<R>['addService'] {
137
+ return (id, impl) => {
138
+ const forked = fiberRefs.fork()
139
+
140
+ // AddService
141
+ FiberRefs.setFiberRef(
142
+ Services,
143
+ pipe(
144
+ forked,
145
+ FiberRefs.maybeGetFiberRefValue(Services),
146
+ Maybe.match(
147
+ () => ImmutableMap<Service<any>, any>().set(id, impl),
148
+ (s) => s.set(id, impl),
149
+ ),
150
+ ),
151
+ )(forked)
152
+
153
+ return makeEnvFromFiberRefs(forked)
154
+ }
155
+ }
156
+
157
+ export function joinEnvFromFiberRefs<R>(fiberRefs: FiberRefs.FiberRefs): Env<R>['join'] {
158
+ return (other) => {
159
+ const forked = other.fiberRefs.fork()
160
+
161
+ // Reverse the order to ensure incoming values take precedence for Services + Layers
162
+ FiberRefs.join(forked, fiberRefs)
163
+
164
+ return makeEnvFromFiberRefs(forked)
165
+ }
166
+ }
@@ -119,6 +119,11 @@ export class FiberRuntime<F extends Fx.AnyFx>
119
119
  readonly addObserver = (
120
120
  observer: (exit: Exit.Exit<Fx.ErrorsOf<F>, Fx.OutputOf<F>>) => void,
121
121
  ): Disposable => {
122
+ if (this._status.tag === 'Done') {
123
+ const exit = this._status.exit
124
+ return this.setTimer(() => observer(exit))
125
+ }
126
+
122
127
  this._observers.push(observer)
123
128
 
124
129
  return Disposable(() => {
@@ -137,10 +142,7 @@ export class FiberRuntime<F extends Fx.AnyFx>
137
142
  this._disposable.dispose()
138
143
  this._disposable = settable()
139
144
  this._current = Maybe.Just(Fx.interrupted(id).instr)
140
-
141
- if (this._status.tag === 'Suspended') {
142
- this.setTimer(() => this.loop())
143
- }
145
+ this.loop()
144
146
  } else {
145
147
  // Record the interrupting FiberId for if/when the interrupt status becomes true again.
146
148
  this._interruptedBy.add(id)
@@ -207,6 +209,7 @@ export class FiberRuntime<F extends Fx.AnyFx>
207
209
 
208
210
  protected addCustomTrace(trace?: string) {
209
211
  if (trace) {
212
+ this.pushPopFiberRef(Builtin.CurrentTrace, this.getRuntimeTrace())
210
213
  this.pushPopFiberRef(Builtin.CurrentTrace, Trace.Trace.custom(trace))
211
214
  }
212
215
  }
@@ -225,14 +228,8 @@ export class FiberRuntime<F extends Fx.AnyFx>
225
228
  this.withFiberRef(Builtin.CurrentConcurrencyLevel, (semaphore) => {
226
229
  const withConcurrency = acquireFiber(semaphore.value)
227
230
 
228
- const f = new FiberRuntime(
229
- withConcurrency(instr.first),
230
- this.context.fork({ fiberRefs: this.context.fiberRefs }),
231
- )
232
- const s = new FiberRuntime(
233
- withConcurrency(instr.second),
234
- this.context.fork({ fiberRefs: this.context.fiberRefs }),
235
- )
231
+ const f = new FiberRuntime(withConcurrency(instr.first), this.context.fork())
232
+ const s = new FiberRuntime(withConcurrency(instr.second), this.context.fork())
236
233
 
237
234
  const [future, onExit] = bothFuture(f, s)
238
235
 
@@ -247,7 +244,14 @@ export class FiberRuntime<F extends Fx.AnyFx>
247
244
 
248
245
  return pipe(
249
246
  wait(future),
250
- Fx.ensuring(() => Fx.fromLazy(() => inner.dispose())),
247
+ Fx.ensuring(() =>
248
+ Fx.fromLazy(() => {
249
+ FiberRefs.join(this.context.fiberRefs, f.context.fiberRefs)
250
+ FiberRefs.join(this.context.fiberRefs, s.context.fiberRefs)
251
+
252
+ inner.dispose()
253
+ }),
254
+ ),
251
255
  )
252
256
  })
253
257
  }
@@ -267,14 +271,8 @@ export class FiberRuntime<F extends Fx.AnyFx>
267
271
  protected processEither(instr: Extract<AnyInstruction, { readonly tag: 'Either' }>) {
268
272
  this.withFiberRef(Builtin.CurrentConcurrencyLevel, (semaphore) => {
269
273
  const withConcurrency = acquireFiber(semaphore.value)
270
- const f = new FiberRuntime(
271
- withConcurrency(instr.first),
272
- this.context.fork({ fiberRefs: this.context.fiberRefs }),
273
- )
274
- const s = new FiberRuntime(
275
- withConcurrency(instr.second),
276
- this.context.fork({ fiberRefs: this.context.fiberRefs }),
277
- )
274
+ const f = new FiberRuntime(withConcurrency(instr.first), this.context.fork())
275
+ const s = new FiberRuntime(withConcurrency(instr.second), this.context.fork())
278
276
 
279
277
  const inner = settable()
280
278
  const future = Pending<never, any, any>()
@@ -283,10 +281,19 @@ export class FiberRuntime<F extends Fx.AnyFx>
283
281
  pipe(
284
282
  Fx.fromExit(exit),
285
283
  Fx.ensuring(() =>
286
- index === 0 ? s.interruptAs(f.context.id) : f.interruptAs(s.context.id),
284
+ index === 0
285
+ ? pipe(
286
+ s.interruptAs(f.context.id),
287
+ Fx.tapLazy(() => FiberRefs.join(this.context.fiberRefs, f.context.fiberRefs)),
288
+ )
289
+ : pipe(
290
+ f.interruptAs(s.context.id),
291
+ Fx.tapLazy(() => FiberRefs.join(this.context.fiberRefs, s.context.fiberRefs)),
292
+ ),
287
293
  ),
288
294
  ),
289
295
  )
296
+
290
297
  inner.dispose()
291
298
  }
292
299
 
@@ -335,9 +342,9 @@ export class FiberRuntime<F extends Fx.AnyFx>
335
342
  }
336
343
 
337
344
  protected processFromCause(instr: Extract<AnyInstruction, { readonly tag: 'FromCause' }>) {
338
- if (instr.cause.tag === 'Interrupted' && this._children.length > 0) {
339
- const fiberId = instr.cause.fiberId
340
- const interrupts = this._children.map((c) => c.interruptAs(fiberId))
345
+ const interruptedCause = Cause.findInterrupted(instr.cause)
346
+ if (Maybe.isJust(interruptedCause) && this._children.length > 0) {
347
+ const interrupts = this._children.map((c) => c.interruptAs(this.id))
341
348
  this._children = []
342
349
 
343
350
  // Cancel all Child Fibers and then continue with the Cause
@@ -449,12 +456,12 @@ export class FiberRuntime<F extends Fx.AnyFx>
449
456
  protected processProvideService(
450
457
  instr: Extract<AnyInstruction, { readonly tag: 'ProvideService' }>,
451
458
  ) {
452
- this.withFiberRef(Builtin.Services, (services) =>
459
+ this.withFiberRef(Builtin.CurrentEnv, (env) =>
453
460
  pipe(
454
461
  instr.fx,
455
462
  Fx.fiberRefLocally(
456
- Builtin.Services,
457
- services.value.set(instr.service, instr.implementation),
463
+ Builtin.CurrentEnv,
464
+ env.value.addService(instr.service, instr.implementation),
458
465
  ),
459
466
  ),
460
467
  )
package/src/Fx/Fx.test.ts CHANGED
@@ -107,14 +107,14 @@ describe(new URL(import.meta.url).pathname, () => {
107
107
  console.time('Fx: Fib25 Construction')
108
108
  const program = fib(25)
109
109
  console.timeEnd('Fx: Fib25 Construction')
110
- for (let i = 0; i < 10; i++) {
110
+ for (let i = 0; i < 5; i++) {
111
111
  console.time('Fib25')
112
112
  await runMain(program)
113
113
  console.timeEnd('Fib25')
114
114
  }
115
115
  })
116
116
 
117
- it('runs Fib w/ generators', async () => {
117
+ it.skip('runs Fib w/ generators', async () => {
118
118
  const fib = (n: number): Fx.Of<number> =>
119
119
  Fx.Fx(function* () {
120
120
  if (n < 2) {
package/src/Fx/Fx.ts CHANGED
@@ -206,6 +206,9 @@ export const tap =
206
206
  __trace,
207
207
  )
208
208
 
209
+ export const tapLazy = <A, B>(f: (a: A) => B, __trace?: string) =>
210
+ tap((a: A) => fromLazy(() => f(a)), __trace)
211
+
209
212
  export const mapTo =
210
213
  <B>(b: B, __trace?: string) =>
211
214
  <R, E, A>(fx: Fx<R, E, A>): Fx<R, E, B> =>
@@ -227,13 +230,7 @@ export const match =
227
230
  __trace?: string,
228
231
  ) =>
229
232
  <R>(fx: Fx<R, E, A>): Fx<R | R2 | R3, E2 | E3, B | C> =>
230
- Match.make(
231
- fx,
232
- (cause) =>
233
- cause.tag === 'Expected' ? onLeft(cause.error) : (fromCause(cause) as Fx<R2, E2, B>),
234
- onRight,
235
- __trace,
236
- )
233
+ Match.make(fx, flow(findExpectedCause, Either.match(onLeft, fromCause)), onRight, __trace)
237
234
 
238
235
  export const orElseCause =
239
236
  <E, R2, E2, B>(onLeft: (cause: Cause.Cause<E>) => Fx<R2, E2, B>, __trace?: string) =>
@@ -530,7 +527,7 @@ export const Top: T.Top3REC<FxHKT, never, never> = {
530
527
  top: now<unknown>([]),
531
528
  }
532
529
 
533
- export const top = T.top
530
+ export const top = Top.top
534
531
 
535
532
  export const never = async<never, never, never>(() => Either.Left(unit))
536
533
 
@@ -601,8 +598,12 @@ export const CommutativeBoth: CB.CommutativeBoth3<FxHKT> = {
601
598
  both,
602
599
  }
603
600
 
604
- export const zipLeft = AB.zipLeft<FxHKT>({ ...CommutativeBoth, ...Covariant })
605
- export const zipRight = AB.zipRight<FxHKT>({ ...CommutativeBoth, ...Covariant })
601
+ export const zipLeft = AB.zipLeft<FxHKT>({ ...CommutativeBoth, ...Covariant }) as <R2, E2, B>(
602
+ second: Fx<R2, E2, B>,
603
+ ) => <R, E, A>(first: Fx<R, E, A>) => Fx<R | R2, E | E2, A>
604
+ export const zipRight = AB.zipRight<FxHKT>({ ...CommutativeBoth, ...Covariant }) as <R2, E2, B>(
605
+ second: Fx<R2, E2, B>,
606
+ ) => <R, E, A>(first: Fx<R, E, A>) => Fx<R | R2, E | E2, B>
606
607
 
607
608
  export const IdentityBothPar: IB.IdentityBoth3<FxHKT> = {
608
609
  ...CommutativeBoth,
package/src/Fx/join.ts CHANGED
@@ -18,10 +18,10 @@ export const join = <E, A>(fiber: Fiber.Fiber<E, A>) =>
18
18
  ),
19
19
  )
20
20
 
21
- export const forkJoinInContext = <R, E, A>(
22
- fx: Fx.Fx<R, E, A>,
23
- context: FiberContext<FiberId.Live>,
24
- ): Fx.Fx<R, E, A> => pipe(fx, Fx.forkInContext(context), Fx.flatMap(join))
21
+ export const forkJoinInContext =
22
+ (context: FiberContext<FiberId.Live>) =>
23
+ <R, E, A>(fx: Fx.Fx<R, E, A>): Fx.Fx<R, E, A> =>
24
+ pipe(fx, Fx.forkInContext(context), Fx.flatMap(join))
25
25
 
26
26
  export const forkJoinIn = <R, E, A>(fx: Fx.Fx<R, E, A>, scope: Scope): Fx.Fx<R, E, A> =>
27
27
  pipe(fx, Fx.forkIn(scope), Fx.flatMap(join))
@@ -20,6 +20,9 @@ const maxTimeAssociative = Time.makeAssociative({
20
20
  })
21
21
  const maybeMaxTimeAssociative = makeAssociative(maxTimeAssociative)
22
22
 
23
+ /**
24
+ * TODO: ScheduleState should track Exit values to allow exiting early w/ custom logic
25
+ */
23
26
  export class ScheduleState {
24
27
  constructor(
25
28
  /**
@@ -1,5 +1,3 @@
1
- import { identity } from 'hkt-ts'
2
-
3
1
  import { Scheduler } from './Scheduler.js'
4
2
  import { callbackScheduler } from './callbackScheduler.js'
5
3
  import { runSchedule } from './runSchedule.js'
@@ -18,6 +16,7 @@ import { complete } from '@/Future/complete.js'
18
16
  import { wait } from '@/Future/wait.js'
19
17
  import { Fx } from '@/Fx/Fx.js'
20
18
  import { Schedule } from '@/Schedule/Schedule.js'
19
+ import { ScheduleState } from '@/Schedule/ScheduleState.js'
21
20
  import { Delay } from '@/Time/index.js'
22
21
  import { SetTimeoutTimer } from '@/Timer/SetTimeoutTimer.js'
23
22
  import { Timer } from '@/Timer/Timer.js'
@@ -45,15 +44,14 @@ class RootSchedulerImpl implements Scheduler {
45
44
  }
46
45
  }
47
46
 
48
- readonly asap: Scheduler['asap'] = <R, E, A, E2 = E, B = A>(
47
+ readonly asap: Scheduler['asap'] = <R, E, A>(
49
48
  fx: Fx<R, E, A>,
50
49
  env: Env<R>,
51
50
  context: FiberContext<FiberId.Live>,
52
- transform: (fx: Fx<R, E, A>) => Fx<R, E2, B> = identity as any,
53
- ): Live<E2, B> => {
51
+ ): Live<E, A> => {
54
52
  setFiberRef(CurrentEnv, env)(context.fiberRefs)
55
53
 
56
- const runtime = new FiberRuntime(this.runAt(transform(fx), Delay(0)), context)
54
+ const runtime = new FiberRuntime(this.runAt(fx, Delay(0)), context)
57
55
 
58
56
  // Safe to call sync since it will be run by the Timeline.
59
57
  runtime.startSync()
@@ -61,17 +59,17 @@ class RootSchedulerImpl implements Scheduler {
61
59
  return runtime
62
60
  }
63
61
 
64
- readonly schedule: Scheduler['schedule'] = <R, E, A, E2 = E, B = A>(
62
+ readonly schedule: Scheduler['schedule'] = <R, E, A, B>(
65
63
  fx: Fx<R, E, A>,
66
64
  env: Env<R>,
67
65
  schedule: Schedule,
68
66
  context: FiberContext<FiberId.Live>,
69
- transform: (fx: Fx<R, E, A>) => Fx<R, E2, B> = identity as any,
67
+ onEnd?: (state: ScheduleState) => Fx<R, E, B>,
70
68
  ) => {
71
69
  setFiberRef(CurrentEnv, env)(context.fiberRefs)
72
70
 
73
71
  const runtime = new FiberRuntime(
74
- runSchedule(transform(fx), schedule, this.timer, this.runAt),
72
+ runSchedule(fx, schedule, this.timer, this.runAt, onEnd),
75
73
  context,
76
74
  )
77
75
 
@@ -9,20 +9,19 @@ import { ScheduleState } from '@/Schedule/ScheduleState.js'
9
9
  import { Service } from '@/Service/Service.js'
10
10
 
11
11
  export interface Scheduler extends Disposable {
12
- readonly asap: <R, E, A, E2 = E, B = A>(
12
+ readonly asap: <R, E, A>(
13
13
  fx: Fx<R, E, A>,
14
14
  env: Env<R>,
15
15
  context: FiberContext<FiberId.Live>,
16
- transform?: (fx: Fx<R, E, A>) => Fx<R, E2, B>,
17
- ) => Live<E2, B>
16
+ ) => Live<E, A>
18
17
 
19
- readonly schedule: <R, E, A, E2 = E, B = A>(
18
+ readonly schedule: <R, E, A, B>(
20
19
  fx: Fx<R, E, A>,
21
20
  env: Env<R>,
22
21
  schedule: Schedule,
23
22
  context: FiberContext<FiberId.Live>,
24
- transform?: (fx: Fx<R, E, A>) => Fx<R, E2, B>,
25
- ) => Live<E2, ScheduleState>
23
+ onEnd?: (state: ScheduleState) => Fx<R, E, B>,
24
+ ) => Live<E, ScheduleState>
26
25
  }
27
26
 
28
27
  export const Scheduler = Service<Scheduler>('Scheduler')
@@ -34,6 +34,7 @@ export function callbackScheduler(
34
34
  }
35
35
 
36
36
  function runReadyTasks() {
37
+ nextArrival = null
37
38
  timeline.getReadyTasks(Clock.timeToUnixTime(timer.getCurrentTime())(timer)).forEach((f) => f())
38
39
 
39
40
  scheduleNextRun()
@@ -1,5 +1,5 @@
1
1
  import * as Clock from '@/Clock/Clock.js'
2
- import { Fx } from '@/Fx/Fx.js'
2
+ import { Fx, unit } from '@/Fx/Fx.js'
3
3
  import { Schedule } from '@/Schedule/Schedule.js'
4
4
  import { ScheduleState } from '@/Schedule/ScheduleState.js'
5
5
  import { Delay } from '@/Time/index.js'
@@ -7,11 +7,12 @@ import { Delay } from '@/Time/index.js'
7
7
  /**
8
8
  * Runs an Fx on a given Schedule
9
9
  */
10
- export function runSchedule<R, E, A>(
10
+ export function runSchedule<R, E, A, B>(
11
11
  fx: Fx<R, E, A>,
12
12
  schedule: Schedule,
13
13
  clock: Clock.Clock,
14
14
  runAt: (fx: Fx<R, E, A>, delay: Delay) => Fx<R, E, A>,
15
+ onEnd?: (state: ScheduleState) => Fx<R, E, B>,
15
16
  ): Fx<R, E, ScheduleState> {
16
17
  return Fx(function* () {
17
18
  let [state, decision] = schedule.step(clock.getCurrentTime(), new ScheduleState())
@@ -26,6 +27,8 @@ export function runSchedule<R, E, A>(
26
27
  decision = nextDecision
27
28
  }
28
29
 
30
+ yield* onEnd?.(state) ?? unit
31
+
29
32
  // Return the final state
30
33
  return state
31
34
  })
@@ -2,7 +2,6 @@ import { mapTo } from 'hkt-ts/Either'
2
2
  import * as Maybe from 'hkt-ts/Maybe'
3
3
  import { First } from 'hkt-ts/Typeclass/Associative'
4
4
  import { pipe } from 'hkt-ts/function'
5
- import { NonNegativeInteger } from 'hkt-ts/number'
6
5
 
7
6
  import { Closeable } from './Closeable.js'
8
7
  import { ReleaseMap } from './ReleaseMap.js'
@@ -18,7 +17,7 @@ const { concat: concatExits } = makeSequentialAssociative<any, any>(First)
18
17
  export class LocalScope implements Closeable {
19
18
  protected _state: ScopeState = Open
20
19
  protected _releaseMap = new ReleaseMap(this.strategy)
21
- protected _refCount = AtomicCounter(NonNegativeInteger(1))
20
+ protected _refCount = AtomicCounter()
22
21
  protected _exit: Maybe.Maybe<Exit<any, any>> = Maybe.Nothing
23
22
 
24
23
  constructor(readonly strategy: FinalizationStrategy) {}
@@ -44,9 +43,12 @@ export class LocalScope implements Closeable {
44
43
 
45
44
  const extended = new LocalScope(strategy)
46
45
 
47
- // Mutually track resources
48
- extended.ensuring(() => this.release)
49
- extended.ensuring(this.ensuring(() => extended.release))
46
+ extended.ensuring(() => {
47
+ decrement(this._refCount)
48
+
49
+ return this.release
50
+ })
51
+
50
52
  increment(this._refCount)
51
53
 
52
54
  return extended
@@ -64,7 +66,7 @@ export class LocalScope implements Closeable {
64
66
  // Internals
65
67
 
66
68
  protected release = lazy(() => {
67
- if (decrement(this._refCount) > 0 || Maybe.isNothing(this._exit) || this.isClosed) {
69
+ if (this._refCount.get() > 0 || Maybe.isNothing(this._exit) || this.isClosed) {
68
70
  return success(false)
69
71
  }
70
72