@fncts/io 0.0.47 → 0.0.49

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 (685) hide show
  1. package/Cached/api.d.ts +1 -1
  2. package/Channel/api.d.ts +80 -80
  3. package/Channel/core-api.d.ts +26 -26
  4. package/Console/definition.d.ts +1 -0
  5. package/CountdownLatch.d.ts +1 -0
  6. package/Fiber/FiberMessage.d.ts +6 -28
  7. package/Fiber/FiberRuntime.d.ts +108 -77
  8. package/Fiber/api/interruptAs.d.ts +2 -2
  9. package/Fiber/definition.d.ts +2 -0
  10. package/FiberScope/definition.d.ts +3 -0
  11. package/FiberSet.d.ts +2 -1
  12. package/Future/State.d.ts +59 -0
  13. package/Future/api.d.ts +8 -3
  14. package/Future/constructors.d.ts +1 -1
  15. package/Future/definition.d.ts +1 -17
  16. package/Future.d.ts +1 -0
  17. package/Hub/api.d.ts +15 -15
  18. package/IO/api/array.d.ts +22 -0
  19. package/IO/api/awaitAllChildren.d.ts +6 -0
  20. package/IO/api/cachedInvalidate.d.ts +15 -0
  21. package/IO/api/forkDaemon.d.ts +1 -1
  22. package/IO/api/onTermination.d.ts +1 -2
  23. package/IO/api/transplant.d.ts +11 -1
  24. package/IO/api.d.ts +247 -225
  25. package/IO/definition.d.ts +12 -25
  26. package/IO.d.ts +3 -1
  27. package/Random/definition.d.ts +1 -0
  28. package/Ref/Synchronized/api.d.ts +1 -1
  29. package/Semaphore/Reservation.d.ts +15 -0
  30. package/Semaphore/constructors.d.ts +13 -0
  31. package/Semaphore/definition.d.ts +29 -0
  32. package/Semaphore.d.ts +3 -40
  33. package/Stream/api.d.ts +164 -164
  34. package/_cjs/Cached/api.cjs +1 -2
  35. package/_cjs/Cached/api.cjs.map +1 -1
  36. package/_cjs/Cached/internal.cjs +1 -2
  37. package/_cjs/Cached/internal.cjs.map +1 -1
  38. package/_cjs/Channel/api/interruptWhen.cjs +1 -2
  39. package/_cjs/Channel/api/interruptWhen.cjs.map +1 -1
  40. package/_cjs/Channel/api/mapOutConcurrentIO.cjs +2 -3
  41. package/_cjs/Channel/api/mapOutConcurrentIO.cjs.map +1 -1
  42. package/_cjs/Channel/api/mergeAll.cjs +1 -2
  43. package/_cjs/Channel/api/mergeAll.cjs.map +1 -1
  44. package/_cjs/Channel/api/mergeAllUnboundedWith.cjs +1 -2
  45. package/_cjs/Channel/api/mergeAllUnboundedWith.cjs.map +1 -1
  46. package/_cjs/Channel/api/mergeAllWith.cjs +2 -3
  47. package/_cjs/Channel/api/mergeAllWith.cjs.map +1 -1
  48. package/_cjs/Channel/api/mergeMap.cjs +1 -2
  49. package/_cjs/Channel/api/mergeMap.cjs.map +1 -1
  50. package/_cjs/Channel/api/mergeWith.cjs +1 -2
  51. package/_cjs/Channel/api/mergeWith.cjs.map +1 -1
  52. package/_cjs/Channel/api/run.cjs +1 -2
  53. package/_cjs/Channel/api/run.cjs.map +1 -1
  54. package/_cjs/Channel/api/runCollect.cjs +1 -2
  55. package/_cjs/Channel/api/runCollect.cjs.map +1 -1
  56. package/_cjs/Channel/api/runDrain.cjs +1 -2
  57. package/_cjs/Channel/api/runDrain.cjs.map +1 -1
  58. package/_cjs/Channel/api/runScoped.cjs +3 -4
  59. package/_cjs/Channel/api/runScoped.cjs.map +1 -1
  60. package/_cjs/Channel/api/toPull.cjs +2 -3
  61. package/_cjs/Channel/api/toPull.cjs.map +1 -1
  62. package/_cjs/Channel/api/zipConcurrent.cjs +1 -2
  63. package/_cjs/Channel/api/zipConcurrent.cjs.map +1 -1
  64. package/_cjs/Channel/api.cjs +206 -207
  65. package/_cjs/Channel/api.cjs.map +1 -1
  66. package/_cjs/Channel/core-api.cjs +43 -42
  67. package/_cjs/Channel/core-api.cjs.map +1 -1
  68. package/_cjs/Channel/internal/AsyncInputConsumer.cjs +0 -4
  69. package/_cjs/Channel/internal/AsyncInputProducer.cjs +0 -4
  70. package/_cjs/Channel/internal/ChannelExecutor.cjs +4 -5
  71. package/_cjs/Channel/internal/ChannelExecutor.cjs.map +1 -1
  72. package/_cjs/Channel/internal/ChannelState.cjs +1 -2
  73. package/_cjs/Channel/internal/ChannelState.cjs.map +1 -1
  74. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs +1 -2
  75. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs.map +1 -1
  76. package/_cjs/Clock/api.cjs +1 -2
  77. package/_cjs/Clock/api.cjs.map +1 -1
  78. package/_cjs/Clock/definition.cjs +1 -2
  79. package/_cjs/Clock/definition.cjs.map +1 -1
  80. package/_cjs/Clock/live.cjs +1 -2
  81. package/_cjs/Clock/live.cjs.map +1 -1
  82. package/_cjs/Console/api.cjs +1 -2
  83. package/_cjs/Console/api.cjs.map +1 -1
  84. package/_cjs/Console/definition.cjs +2 -2
  85. package/_cjs/Console/definition.cjs.map +1 -1
  86. package/_cjs/Console/live.cjs +1 -2
  87. package/_cjs/Console/live.cjs.map +1 -1
  88. package/_cjs/CountdownLatch.cjs +3 -3
  89. package/_cjs/CountdownLatch.cjs.map +1 -1
  90. package/_cjs/Differ/api.cjs +1 -2
  91. package/_cjs/Differ/api.cjs.map +1 -1
  92. package/_cjs/Fiber/FiberMessage.cjs +3 -24
  93. package/_cjs/Fiber/FiberMessage.cjs.map +1 -1
  94. package/_cjs/Fiber/FiberRuntime.cjs +879 -636
  95. package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
  96. package/_cjs/Fiber/api/awaitAll.cjs +1 -2
  97. package/_cjs/Fiber/api/awaitAll.cjs.map +1 -1
  98. package/_cjs/Fiber/api/collectAll.cjs +2 -3
  99. package/_cjs/Fiber/api/collectAll.cjs.map +1 -1
  100. package/_cjs/Fiber/api/fromIO.cjs +1 -2
  101. package/_cjs/Fiber/api/fromIO.cjs.map +1 -1
  102. package/_cjs/Fiber/api/interrupt.cjs +2 -3
  103. package/_cjs/Fiber/api/interrupt.cjs.map +1 -1
  104. package/_cjs/Fiber/api/interruptAll.cjs +2 -3
  105. package/_cjs/Fiber/api/interruptAll.cjs.map +1 -1
  106. package/_cjs/Fiber/api/interruptAs.cjs +5 -10
  107. package/_cjs/Fiber/api/interruptAs.cjs.map +1 -1
  108. package/_cjs/Fiber/api/interruptFork.cjs +2 -3
  109. package/_cjs/Fiber/api/interruptFork.cjs.map +1 -1
  110. package/_cjs/Fiber/api/join.cjs +1 -2
  111. package/_cjs/Fiber/api/join.cjs.map +1 -1
  112. package/_cjs/Fiber/api/joinAll.cjs +1 -2
  113. package/_cjs/Fiber/api/joinAll.cjs.map +1 -1
  114. package/_cjs/Fiber/api/mapFiber.cjs +1 -2
  115. package/_cjs/Fiber/api/mapFiber.cjs.map +1 -1
  116. package/_cjs/Fiber/api/mapIO.cjs +2 -3
  117. package/_cjs/Fiber/api/mapIO.cjs.map +1 -1
  118. package/_cjs/Fiber/api/zipWith.cjs +2 -3
  119. package/_cjs/Fiber/api/zipWith.cjs.map +1 -1
  120. package/_cjs/Fiber/constructors.cjs +2 -3
  121. package/_cjs/Fiber/constructors.cjs.map +1 -1
  122. package/_cjs/Fiber/definition.cjs +6 -4
  123. package/_cjs/Fiber/definition.cjs.map +1 -1
  124. package/_cjs/FiberRef/api/locallyScoped.cjs +1 -2
  125. package/_cjs/FiberRef/api/locallyScoped.cjs.map +1 -1
  126. package/_cjs/FiberRef/api/locallyScopedWith.cjs +1 -2
  127. package/_cjs/FiberRef/api/locallyScopedWith.cjs.map +1 -1
  128. package/_cjs/FiberRef/constructors.cjs +1 -2
  129. package/_cjs/FiberRef/constructors.cjs.map +1 -1
  130. package/_cjs/FiberRef/definition.cjs +1 -2
  131. package/_cjs/FiberRef/definition.cjs.map +1 -1
  132. package/_cjs/FiberRef/operations.cjs +1 -2
  133. package/_cjs/FiberRef/operations.cjs.map +1 -1
  134. package/_cjs/FiberRef/unsafe.cjs +1 -2
  135. package/_cjs/FiberRef/unsafe.cjs.map +1 -1
  136. package/_cjs/FiberRefs/Patch.cjs +1 -2
  137. package/_cjs/FiberRefs/Patch.cjs.map +1 -1
  138. package/_cjs/FiberRefs/api.cjs +1 -2
  139. package/_cjs/FiberRefs/api.cjs.map +1 -1
  140. package/_cjs/FiberRefs/definition.cjs +1 -2
  141. package/_cjs/FiberRefs/definition.cjs.map +1 -1
  142. package/_cjs/FiberScope/definition.cjs +29 -6
  143. package/_cjs/FiberScope/definition.cjs.map +1 -1
  144. package/_cjs/FiberSet.cjs +16 -15
  145. package/_cjs/FiberSet.cjs.map +1 -1
  146. package/_cjs/FiberStatus/definition.cjs +1 -2
  147. package/_cjs/FiberStatus/definition.cjs.map +1 -1
  148. package/_cjs/Future/State.cjs +108 -0
  149. package/_cjs/Future/State.cjs.map +1 -0
  150. package/_cjs/Future/api.cjs +71 -64
  151. package/_cjs/Future/api.cjs.map +1 -1
  152. package/_cjs/Future/constructors.cjs +3 -4
  153. package/_cjs/Future/constructors.cjs.map +1 -1
  154. package/_cjs/Future/definition.cjs +1 -15
  155. package/_cjs/Future/definition.cjs.map +1 -1
  156. package/_cjs/Future.cjs +11 -0
  157. package/_cjs/Future.cjs.map +1 -1
  158. package/_cjs/Hub/api.cjs +56 -57
  159. package/_cjs/Hub/api.cjs.map +1 -1
  160. package/_cjs/Hub/internal.cjs +1 -2
  161. package/_cjs/Hub/internal.cjs.map +1 -1
  162. package/_cjs/IO/api/acquireRelease.cjs +1 -2
  163. package/_cjs/IO/api/acquireRelease.cjs.map +1 -1
  164. package/_cjs/IO/api/acquireReleaseExit.cjs +1 -2
  165. package/_cjs/IO/api/acquireReleaseExit.cjs.map +1 -1
  166. package/_cjs/IO/api/acquireReleaseInterruptible.cjs +1 -2
  167. package/_cjs/IO/api/acquireReleaseInterruptible.cjs.map +1 -1
  168. package/_cjs/IO/api/acquireReleaseInterruptibleExit.cjs +1 -2
  169. package/_cjs/IO/api/acquireReleaseInterruptibleExit.cjs.map +1 -1
  170. package/_cjs/IO/api/addFinalizer.cjs +1 -2
  171. package/_cjs/IO/api/addFinalizer.cjs.map +1 -1
  172. package/_cjs/IO/api/addFinalizerExit.cjs +1 -2
  173. package/_cjs/IO/api/addFinalizerExit.cjs.map +1 -1
  174. package/_cjs/IO/api/all.cjs +1 -2
  175. package/_cjs/IO/api/all.cjs.map +1 -1
  176. package/_cjs/IO/api/array.cjs +51 -0
  177. package/_cjs/IO/api/array.cjs.map +1 -0
  178. package/_cjs/IO/api/asyncIO.cjs +1 -2
  179. package/_cjs/IO/api/asyncIO.cjs.map +1 -1
  180. package/_cjs/IO/api/asyncInterrupt.cjs +1 -2
  181. package/_cjs/IO/api/asyncInterrupt.cjs.map +1 -1
  182. package/_cjs/IO/api/awaitAllChildren.cjs +17 -0
  183. package/_cjs/IO/api/awaitAllChildren.cjs.map +1 -0
  184. package/_cjs/IO/api/blocking.cjs +1 -2
  185. package/_cjs/IO/api/blocking.cjs.map +1 -1
  186. package/_cjs/IO/api/bracket.cjs +1 -2
  187. package/_cjs/IO/api/bracket.cjs.map +1 -1
  188. package/_cjs/IO/api/bracketExit.cjs +1 -2
  189. package/_cjs/IO/api/bracketExit.cjs.map +1 -1
  190. package/_cjs/IO/api/cachedInvalidate.cjs +47 -0
  191. package/_cjs/IO/api/cachedInvalidate.cjs.map +1 -0
  192. package/_cjs/IO/api/clockWith.cjs +1 -2
  193. package/_cjs/IO/api/clockWith.cjs.map +1 -1
  194. package/_cjs/IO/api/concurrency.cjs +1 -2
  195. package/_cjs/IO/api/concurrency.cjs.map +1 -1
  196. package/_cjs/IO/api/concurrentFinalizers.cjs +1 -2
  197. package/_cjs/IO/api/concurrentFinalizers.cjs.map +1 -1
  198. package/_cjs/IO/api/consoleWith.cjs +1 -2
  199. package/_cjs/IO/api/consoleWith.cjs.map +1 -1
  200. package/_cjs/IO/api/daemonChildren.cjs +1 -2
  201. package/_cjs/IO/api/daemonChildren.cjs.map +1 -1
  202. package/_cjs/IO/api/delay.cjs +1 -2
  203. package/_cjs/IO/api/delay.cjs.map +1 -1
  204. package/_cjs/IO/api/descriptor.cjs +1 -2
  205. package/_cjs/IO/api/descriptor.cjs.map +1 -1
  206. package/_cjs/IO/api/diffFiberRefs.cjs +1 -2
  207. package/_cjs/IO/api/diffFiberRefs.cjs.map +1 -1
  208. package/_cjs/IO/api/disconnect.cjs +2 -3
  209. package/_cjs/IO/api/disconnect.cjs.map +1 -1
  210. package/_cjs/IO/api/ensuringChildren.cjs +1 -2
  211. package/_cjs/IO/api/ensuringChildren.cjs.map +1 -1
  212. package/_cjs/IO/api/environment.cjs +1 -2
  213. package/_cjs/IO/api/environment.cjs.map +1 -1
  214. package/_cjs/IO/api/foreachConcurrent.cjs +36 -30
  215. package/_cjs/IO/api/foreachConcurrent.cjs.map +1 -1
  216. package/_cjs/IO/api/foreachExec.cjs +1 -2
  217. package/_cjs/IO/api/foreachExec.cjs.map +1 -1
  218. package/_cjs/IO/api/fork.cjs +2 -3
  219. package/_cjs/IO/api/fork.cjs.map +1 -1
  220. package/_cjs/IO/api/forkAll.cjs +1 -2
  221. package/_cjs/IO/api/forkAll.cjs.map +1 -1
  222. package/_cjs/IO/api/forkDaemon.cjs +5 -6
  223. package/_cjs/IO/api/forkDaemon.cjs.map +1 -1
  224. package/_cjs/IO/api/forkIn.cjs +1 -2
  225. package/_cjs/IO/api/forkIn.cjs.map +1 -1
  226. package/_cjs/IO/api/forkScoped.cjs +1 -2
  227. package/_cjs/IO/api/forkScoped.cjs.map +1 -1
  228. package/_cjs/IO/api/fulfill.cjs +1 -2
  229. package/_cjs/IO/api/fulfill.cjs.map +1 -1
  230. package/_cjs/IO/api/interrupt.cjs +4 -5
  231. package/_cjs/IO/api/interrupt.cjs.map +1 -1
  232. package/_cjs/IO/api/memoize.cjs +1 -2
  233. package/_cjs/IO/api/memoize.cjs.map +1 -1
  234. package/_cjs/IO/api/onTermination.cjs +2 -3
  235. package/_cjs/IO/api/onTermination.cjs.map +1 -1
  236. package/_cjs/IO/api/once.cjs +1 -2
  237. package/_cjs/IO/api/once.cjs.map +1 -1
  238. package/_cjs/IO/api/patchFiberRefs.cjs +1 -2
  239. package/_cjs/IO/api/patchFiberRefs.cjs.map +1 -1
  240. package/_cjs/IO/api/provideLayer.cjs +1 -2
  241. package/_cjs/IO/api/provideLayer.cjs.map +1 -1
  242. package/_cjs/IO/api/provideScope.cjs +1 -2
  243. package/_cjs/IO/api/provideScope.cjs.map +1 -1
  244. package/_cjs/IO/api/provideSomeLayer.cjs +1 -2
  245. package/_cjs/IO/api/provideSomeLayer.cjs.map +1 -1
  246. package/_cjs/IO/api/provideSomeRuntime.cjs +1 -2
  247. package/_cjs/IO/api/provideSomeRuntime.cjs.map +1 -1
  248. package/_cjs/IO/api/race.cjs +2 -3
  249. package/_cjs/IO/api/race.cjs.map +1 -1
  250. package/_cjs/IO/api/raceFirst.cjs +1 -2
  251. package/_cjs/IO/api/raceFirst.cjs.map +1 -1
  252. package/_cjs/IO/api/raceWith.cjs +1 -2
  253. package/_cjs/IO/api/raceWith.cjs.map +1 -1
  254. package/_cjs/IO/api/randomWith.cjs +1 -2
  255. package/_cjs/IO/api/randomWith.cjs.map +1 -1
  256. package/_cjs/IO/api/repeat.cjs +1 -2
  257. package/_cjs/IO/api/repeat.cjs.map +1 -1
  258. package/_cjs/IO/api/retry.cjs +1 -2
  259. package/_cjs/IO/api/retry.cjs.map +1 -1
  260. package/_cjs/IO/api/schedule.cjs +1 -2
  261. package/_cjs/IO/api/schedule.cjs.map +1 -1
  262. package/_cjs/IO/api/scope.cjs +1 -2
  263. package/_cjs/IO/api/scope.cjs.map +1 -1
  264. package/_cjs/IO/api/scopeWith.cjs +1 -2
  265. package/_cjs/IO/api/scopeWith.cjs.map +1 -1
  266. package/_cjs/IO/api/scoped.cjs +1 -2
  267. package/_cjs/IO/api/scoped.cjs.map +1 -1
  268. package/_cjs/IO/api/sleep.cjs +1 -2
  269. package/_cjs/IO/api/sleep.cjs.map +1 -1
  270. package/_cjs/IO/api/stateful.cjs +1 -2
  271. package/_cjs/IO/api/stateful.cjs.map +1 -1
  272. package/_cjs/IO/api/supervised.cjs +1 -2
  273. package/_cjs/IO/api/supervised.cjs.map +1 -1
  274. package/_cjs/IO/api/timeout.cjs +9 -11
  275. package/_cjs/IO/api/timeout.cjs.map +1 -1
  276. package/_cjs/IO/api/transplant.cjs +22 -7
  277. package/_cjs/IO/api/transplant.cjs.map +1 -1
  278. package/_cjs/IO/api/whenFiberRef.cjs +1 -2
  279. package/_cjs/IO/api/whenFiberRef.cjs.map +1 -1
  280. package/_cjs/IO/api/whenRef.cjs +1 -2
  281. package/_cjs/IO/api/whenRef.cjs.map +1 -1
  282. package/_cjs/IO/api/withChildren.cjs +1 -2
  283. package/_cjs/IO/api/withChildren.cjs.map +1 -1
  284. package/_cjs/IO/api/withEarlyRelease.cjs +1 -2
  285. package/_cjs/IO/api/withEarlyRelease.cjs.map +1 -1
  286. package/_cjs/IO/api/withFinalizer.cjs +1 -2
  287. package/_cjs/IO/api/withFinalizer.cjs.map +1 -1
  288. package/_cjs/IO/api/withFinalizerExit.cjs +1 -2
  289. package/_cjs/IO/api/withFinalizerExit.cjs.map +1 -1
  290. package/_cjs/IO/api/zipConcurrent.cjs +5 -6
  291. package/_cjs/IO/api/zipConcurrent.cjs.map +1 -1
  292. package/_cjs/IO/api.cjs +522 -473
  293. package/_cjs/IO/api.cjs.map +1 -1
  294. package/_cjs/IO/definition.cjs +2 -3
  295. package/_cjs/IO/definition.cjs.map +1 -1
  296. package/_cjs/IO/runtime.cjs +9 -10
  297. package/_cjs/IO/runtime.cjs.map +1 -1
  298. package/_cjs/IO.cjs +33 -11
  299. package/_cjs/IO.cjs.map +1 -1
  300. package/_cjs/IOEnv/definition.cjs +1 -2
  301. package/_cjs/IOEnv/definition.cjs.map +1 -1
  302. package/_cjs/IOEnv/live.cjs +1 -2
  303. package/_cjs/IOEnv/live.cjs.map +1 -1
  304. package/_cjs/IOEnv/services.cjs +1 -2
  305. package/_cjs/IOEnv/services.cjs.map +1 -1
  306. package/_cjs/Layer/MemoMap.cjs +1 -2
  307. package/_cjs/Layer/MemoMap.cjs.map +1 -1
  308. package/_cjs/Layer/api.cjs +1 -2
  309. package/_cjs/Layer/api.cjs.map +1 -1
  310. package/_cjs/Logger/api.cjs +1 -2
  311. package/_cjs/Logger/api.cjs.map +1 -1
  312. package/_cjs/Logger/constructors.cjs +1 -2
  313. package/_cjs/Logger/constructors.cjs.map +1 -1
  314. package/_cjs/MVar/api.cjs +1 -2
  315. package/_cjs/MVar/api.cjs.map +1 -1
  316. package/_cjs/Push/api.cjs +2 -3
  317. package/_cjs/Push/api.cjs.map +1 -1
  318. package/_cjs/Push/internal.cjs +1 -2
  319. package/_cjs/Push/internal.cjs.map +1 -1
  320. package/_cjs/Queue/api/dimapIO.cjs +1 -2
  321. package/_cjs/Queue/api/dimapIO.cjs.map +1 -1
  322. package/_cjs/Queue/api/filterInputIO.cjs +1 -2
  323. package/_cjs/Queue/api/filterInputIO.cjs.map +1 -1
  324. package/_cjs/Queue/api/filterOutputIO.cjs +1 -2
  325. package/_cjs/Queue/api/filterOutputIO.cjs.map +1 -1
  326. package/_cjs/Queue/api/poll.cjs +1 -2
  327. package/_cjs/Queue/api/poll.cjs.map +1 -1
  328. package/_cjs/Queue/api/takeBetween.cjs +1 -2
  329. package/_cjs/Queue/api/takeBetween.cjs.map +1 -1
  330. package/_cjs/Queue/api/takeN.cjs +1 -2
  331. package/_cjs/Queue/api/takeN.cjs.map +1 -1
  332. package/_cjs/Queue/api/zipWithIO.cjs +1 -2
  333. package/_cjs/Queue/api/zipWithIO.cjs.map +1 -1
  334. package/_cjs/Queue/constructors.cjs +1 -2
  335. package/_cjs/Queue/constructors.cjs.map +1 -1
  336. package/_cjs/Queue/internal.cjs +1 -2
  337. package/_cjs/Queue/internal.cjs.map +1 -1
  338. package/_cjs/Queue/strategy.cjs +1 -2
  339. package/_cjs/Queue/strategy.cjs.map +1 -1
  340. package/_cjs/Random/api.cjs +1 -2
  341. package/_cjs/Random/api.cjs.map +1 -1
  342. package/_cjs/Random/definition.cjs +2 -2
  343. package/_cjs/Random/definition.cjs.map +1 -1
  344. package/_cjs/Random/live.cjs +1 -2
  345. package/_cjs/Random/live.cjs.map +1 -1
  346. package/_cjs/Ref/Atomic.cjs +1 -2
  347. package/_cjs/Ref/Atomic.cjs.map +1 -1
  348. package/_cjs/Ref/Derived.cjs +1 -2
  349. package/_cjs/Ref/Derived.cjs.map +1 -1
  350. package/_cjs/Ref/DerivedAll.cjs +1 -2
  351. package/_cjs/Ref/DerivedAll.cjs.map +1 -1
  352. package/_cjs/Ref/Synchronized/api.cjs +2 -3
  353. package/_cjs/Ref/Synchronized/api.cjs.map +1 -1
  354. package/_cjs/Ref/Synchronized/constructors.cjs +2 -3
  355. package/_cjs/Ref/Synchronized/constructors.cjs.map +1 -1
  356. package/_cjs/Ref/Synchronized/definition.cjs +2 -3
  357. package/_cjs/Ref/Synchronized/definition.cjs.map +1 -1
  358. package/_cjs/Ref/api/collect.cjs +1 -2
  359. package/_cjs/Ref/api/collect.cjs.map +1 -1
  360. package/_cjs/Ref/api/dimap.cjs +1 -2
  361. package/_cjs/Ref/api/dimap.cjs.map +1 -1
  362. package/_cjs/Ref/api/filter.cjs +1 -2
  363. package/_cjs/Ref/api/filter.cjs.map +1 -1
  364. package/_cjs/Ref/api/modify.cjs +1 -2
  365. package/_cjs/Ref/api/modify.cjs.map +1 -1
  366. package/_cjs/Ref/api.cjs +1 -2
  367. package/_cjs/Ref/api.cjs.map +1 -1
  368. package/_cjs/Ref/constructors.cjs +1 -2
  369. package/_cjs/Ref/constructors.cjs.map +1 -1
  370. package/_cjs/RefSubject/Atomic.cjs +1 -2
  371. package/_cjs/RefSubject/Atomic.cjs.map +1 -1
  372. package/_cjs/RefSubject/Synchronized/api.cjs +1 -2
  373. package/_cjs/RefSubject/Synchronized/api.cjs.map +1 -1
  374. package/_cjs/RefSubject/Synchronized/definition.cjs +1 -2
  375. package/_cjs/RefSubject/Synchronized/definition.cjs.map +1 -1
  376. package/_cjs/RefSubject/api.cjs +1 -2
  377. package/_cjs/RefSubject/api.cjs.map +1 -1
  378. package/_cjs/Reloadable/api.cjs +1 -2
  379. package/_cjs/Reloadable/api.cjs.map +1 -1
  380. package/_cjs/Reloadable/constructors.cjs +1 -2
  381. package/_cjs/Reloadable/constructors.cjs.map +1 -1
  382. package/_cjs/Reloadable/definition.cjs +1 -2
  383. package/_cjs/Reloadable/definition.cjs.map +1 -1
  384. package/_cjs/RuntimeFlag.cjs +0 -4
  385. package/_cjs/RuntimeFlags/Patch.cjs +1 -2
  386. package/_cjs/RuntimeFlags/Patch.cjs.map +1 -1
  387. package/_cjs/RuntimeFlags/RuntimeFlags.cjs +1 -2
  388. package/_cjs/RuntimeFlags/RuntimeFlags.cjs.map +1 -1
  389. package/_cjs/STM/api/atomically.cjs +1 -2
  390. package/_cjs/STM/api/atomically.cjs.map +1 -1
  391. package/_cjs/STM/api/core-api.cjs +1 -2
  392. package/_cjs/STM/api/core-api.cjs.map +1 -1
  393. package/_cjs/STM/api.cjs +1 -2
  394. package/_cjs/STM/api.cjs.map +1 -1
  395. package/_cjs/STM/definition.cjs +2 -3
  396. package/_cjs/STM/definition.cjs.map +1 -1
  397. package/_cjs/STM/driver.cjs +1 -2
  398. package/_cjs/STM/driver.cjs.map +1 -1
  399. package/_cjs/STM/internal/CommitState.cjs +1 -2
  400. package/_cjs/STM/internal/CommitState.cjs.map +1 -1
  401. package/_cjs/STM/internal/Journal.cjs +1 -2
  402. package/_cjs/STM/internal/Journal.cjs.map +1 -1
  403. package/_cjs/Schedule/Decision.cjs +1 -2
  404. package/_cjs/Schedule/Decision.cjs.map +1 -1
  405. package/_cjs/Schedule/api/driver.cjs +1 -2
  406. package/_cjs/Schedule/api/driver.cjs.map +1 -1
  407. package/_cjs/Schedule/api.cjs +1 -2
  408. package/_cjs/Schedule/api.cjs.map +1 -1
  409. package/_cjs/Scope/Finalizer/definition.cjs +1 -2
  410. package/_cjs/Scope/Finalizer/definition.cjs.map +1 -1
  411. package/_cjs/Scope/ReleaseMap/api/releaseAll.cjs +1 -2
  412. package/_cjs/Scope/ReleaseMap/api/releaseAll.cjs.map +1 -1
  413. package/_cjs/Scope/ReleaseMap/api.cjs +1 -2
  414. package/_cjs/Scope/ReleaseMap/api.cjs.map +1 -1
  415. package/_cjs/Scope/ReleaseMap/constructors.cjs +1 -2
  416. package/_cjs/Scope/ReleaseMap/constructors.cjs.map +1 -1
  417. package/_cjs/Scope/ReleaseMap/definition.cjs +1 -2
  418. package/_cjs/Scope/ReleaseMap/definition.cjs.map +1 -1
  419. package/_cjs/Scope/api.cjs +1 -2
  420. package/_cjs/Scope/api.cjs.map +1 -1
  421. package/_cjs/Scope/definition.cjs +1 -2
  422. package/_cjs/Scope/definition.cjs.map +1 -1
  423. package/_cjs/ScopedRef/api.cjs +2 -3
  424. package/_cjs/ScopedRef/api.cjs.map +1 -1
  425. package/_cjs/Semaphore/Reservation.cjs +24 -0
  426. package/_cjs/Semaphore/Reservation.cjs.map +1 -0
  427. package/_cjs/Semaphore/constructors.cjs +25 -0
  428. package/_cjs/Semaphore/constructors.cjs.map +1 -0
  429. package/_cjs/Semaphore/definition.cjs +149 -0
  430. package/_cjs/Semaphore/definition.cjs.map +1 -0
  431. package/_cjs/Semaphore.cjs +31 -138
  432. package/_cjs/Semaphore.cjs.map +1 -1
  433. package/_cjs/Sink/api.cjs +1 -2
  434. package/_cjs/Sink/api.cjs.map +1 -1
  435. package/_cjs/State/api.cjs +1 -2
  436. package/_cjs/State/api.cjs.map +1 -1
  437. package/_cjs/Stream/api/zipAllWith.cjs +1 -2
  438. package/_cjs/Stream/api/zipAllWith.cjs.map +1 -1
  439. package/_cjs/Stream/api/zipWith.cjs +1 -2
  440. package/_cjs/Stream/api/zipWith.cjs.map +1 -1
  441. package/_cjs/Stream/api/zipWithChunks.cjs +1 -2
  442. package/_cjs/Stream/api/zipWithChunks.cjs.map +1 -1
  443. package/_cjs/Stream/api.cjs +702 -703
  444. package/_cjs/Stream/api.cjs.map +1 -1
  445. package/_cjs/Stream/internal/Handoff.cjs +1 -2
  446. package/_cjs/Stream/internal/Handoff.cjs.map +1 -1
  447. package/_cjs/Stream/internal/Pull.cjs +1 -2
  448. package/_cjs/Stream/internal/Pull.cjs.map +1 -1
  449. package/_cjs/Stream/internal/Take.cjs +1 -2
  450. package/_cjs/Stream/internal/Take.cjs.map +1 -1
  451. package/_cjs/Stream/internal/util.cjs +1 -2
  452. package/_cjs/Stream/internal/util.cjs.map +1 -1
  453. package/_cjs/Subject/Atomic.cjs +1 -2
  454. package/_cjs/Subject/Atomic.cjs.map +1 -1
  455. package/_cjs/Subject/api.cjs +1 -2
  456. package/_cjs/Subject/api.cjs.map +1 -1
  457. package/_cjs/SubscriptionRef.cjs +2 -3
  458. package/_cjs/SubscriptionRef.cjs.map +1 -1
  459. package/_cjs/Supervisor/api.cjs +1 -2
  460. package/_cjs/Supervisor/api.cjs.map +1 -1
  461. package/_cjs/Supervisor/constructors.cjs +1 -2
  462. package/_cjs/Supervisor/constructors.cjs.map +1 -1
  463. package/_cjs/Supervisor/definition.cjs +1 -2
  464. package/_cjs/Supervisor/definition.cjs.map +1 -1
  465. package/_cjs/SupervisorPatch.cjs +1 -2
  466. package/_cjs/SupervisorPatch.cjs.map +1 -1
  467. package/_cjs/TExit/definition.cjs +1 -2
  468. package/_cjs/TExit/definition.cjs.map +1 -1
  469. package/_cjs/TFuture/api.cjs +1 -2
  470. package/_cjs/TFuture/api.cjs.map +1 -1
  471. package/_cjs/TFuture/constructors.cjs +1 -2
  472. package/_cjs/TFuture/constructors.cjs.map +1 -1
  473. package/_cjs/TFuture/definition.cjs +1 -2
  474. package/_cjs/TFuture/definition.cjs.map +1 -1
  475. package/_cjs/TReentrantLock/api.cjs +1 -2
  476. package/_cjs/TReentrantLock/api.cjs.map +1 -1
  477. package/_cjs/TReentrantLock/definition.cjs +1 -2
  478. package/_cjs/TReentrantLock/definition.cjs.map +1 -1
  479. package/_cjs/TRef/api.cjs +1 -2
  480. package/_cjs/TRef/api.cjs.map +1 -1
  481. package/_cjs/TRef/constructors.cjs +1 -2
  482. package/_cjs/TRef/constructors.cjs.map +1 -1
  483. package/_cjs/TRef/definition.cjs +1 -2
  484. package/_cjs/TRef/definition.cjs.map +1 -1
  485. package/_cjs/TSemaphore/api.cjs +1 -2
  486. package/_cjs/TSemaphore/api.cjs.map +1 -1
  487. package/_cjs/TSemaphore/constructors.cjs +1 -2
  488. package/_cjs/TSemaphore/constructors.cjs.map +1 -1
  489. package/_cjs/TSemaphore/definition.cjs +1 -2
  490. package/_cjs/TSemaphore/definition.cjs.map +1 -1
  491. package/_cjs/collection/immutable/Conc/dropUntilIO.cjs +1 -2
  492. package/_cjs/collection/immutable/Conc/dropUntilIO.cjs.map +1 -1
  493. package/_cjs/collection/immutable/Conc/dropWhileIO.cjs +1 -2
  494. package/_cjs/collection/immutable/Conc/dropWhileIO.cjs.map +1 -1
  495. package/_cjs/collection/immutable/Conc/filterIO.cjs +1 -2
  496. package/_cjs/collection/immutable/Conc/filterIO.cjs.map +1 -1
  497. package/_cjs/collection/immutable/Conc/findIO.cjs +1 -2
  498. package/_cjs/collection/immutable/Conc/findIO.cjs.map +1 -1
  499. package/_cjs/collection/immutable/Conc/mapIO.cjs +1 -2
  500. package/_cjs/collection/immutable/Conc/mapIO.cjs.map +1 -1
  501. package/_cjs/collection/immutable/Conc/takeWhileIO.cjs +1 -2
  502. package/_cjs/collection/immutable/Conc/takeWhileIO.cjs.map +1 -1
  503. package/_cjs/data/Exit/foreachIO.cjs +1 -2
  504. package/_cjs/data/Exit/foreachIO.cjs.map +1 -1
  505. package/_cjs/global.cjs +0 -4
  506. package/_cjs/index.cjs +0 -4
  507. package/_cjs/internal/HashedPair.cjs +1 -2
  508. package/_cjs/internal/HashedPair.cjs.map +1 -1
  509. package/_cjs/internal/Hub.cjs +1 -2
  510. package/_cjs/internal/Hub.cjs.map +1 -1
  511. package/_cjs/internal/MutableQueue.cjs +1 -2
  512. package/_cjs/internal/MutableQueue.cjs.map +1 -1
  513. package/_cjs/internal/Scheduler.cjs +1 -2
  514. package/_cjs/internal/Scheduler.cjs.map +1 -1
  515. package/_cjs/internal/StackTraceBuilder.cjs +1 -2
  516. package/_cjs/internal/StackTraceBuilder.cjs.map +1 -1
  517. package/_mjs/Cached/api.mjs.map +1 -1
  518. package/_mjs/Channel/api/mapOutConcurrentIO.mjs +1 -1
  519. package/_mjs/Channel/api/mergeAllWith.mjs +1 -1
  520. package/_mjs/Channel/api/runScoped.mjs +2 -2
  521. package/_mjs/Channel/api/runScoped.mjs.map +1 -1
  522. package/_mjs/Channel/api/toPull.mjs +1 -1
  523. package/_mjs/Channel/api/toPull.mjs.map +1 -1
  524. package/_mjs/Channel/api.mjs +205 -205
  525. package/_mjs/Channel/api.mjs.map +1 -1
  526. package/_mjs/Channel/core-api.mjs +43 -42
  527. package/_mjs/Channel/core-api.mjs.map +1 -1
  528. package/_mjs/Channel/internal/AsyncInputConsumer.mjs +1 -1
  529. package/_mjs/Channel/internal/AsyncInputProducer.mjs +1 -1
  530. package/_mjs/Channel/internal/ChannelExecutor.mjs +3 -3
  531. package/_mjs/Channel/internal/ChannelExecutor.mjs.map +1 -1
  532. package/_mjs/Console/definition.mjs +1 -0
  533. package/_mjs/Console/definition.mjs.map +1 -1
  534. package/_mjs/CountdownLatch.mjs +2 -1
  535. package/_mjs/CountdownLatch.mjs.map +1 -1
  536. package/_mjs/Fiber/FiberMessage.mjs +2 -20
  537. package/_mjs/Fiber/FiberMessage.mjs.map +1 -1
  538. package/_mjs/Fiber/FiberRuntime.mjs +877 -633
  539. package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
  540. package/_mjs/Fiber/api/collectAll.mjs +1 -1
  541. package/_mjs/Fiber/api/collectAll.mjs.map +1 -1
  542. package/_mjs/Fiber/api/interrupt.mjs +1 -1
  543. package/_mjs/Fiber/api/interrupt.mjs.map +1 -1
  544. package/_mjs/Fiber/api/interruptAll.mjs +1 -1
  545. package/_mjs/Fiber/api/interruptAll.mjs.map +1 -1
  546. package/_mjs/Fiber/api/interruptAs.mjs +4 -7
  547. package/_mjs/Fiber/api/interruptAs.mjs.map +1 -1
  548. package/_mjs/Fiber/api/interruptFork.mjs +1 -1
  549. package/_mjs/Fiber/api/interruptFork.mjs.map +1 -1
  550. package/_mjs/Fiber/api/mapIO.mjs +1 -1
  551. package/_mjs/Fiber/api/mapIO.mjs.map +1 -1
  552. package/_mjs/Fiber/api/zipWith.mjs +1 -1
  553. package/_mjs/Fiber/api/zipWith.mjs.map +1 -1
  554. package/_mjs/Fiber/constructors.mjs +1 -1
  555. package/_mjs/Fiber/constructors.mjs.map +1 -1
  556. package/_mjs/Fiber/definition.mjs +5 -2
  557. package/_mjs/Fiber/definition.mjs.map +1 -1
  558. package/_mjs/FiberScope/definition.mjs +28 -4
  559. package/_mjs/FiberScope/definition.mjs.map +1 -1
  560. package/_mjs/FiberSet.mjs +14 -12
  561. package/_mjs/FiberSet.mjs.map +1 -1
  562. package/_mjs/Future/State.mjs +96 -0
  563. package/_mjs/Future/State.mjs.map +1 -0
  564. package/_mjs/Future/api.mjs +67 -61
  565. package/_mjs/Future/api.mjs.map +1 -1
  566. package/_mjs/Future/constructors.mjs +3 -3
  567. package/_mjs/Future/constructors.mjs.map +1 -1
  568. package/_mjs/Future/definition.mjs +0 -12
  569. package/_mjs/Future/definition.mjs.map +1 -1
  570. package/_mjs/Future.mjs +1 -0
  571. package/_mjs/Future.mjs.map +1 -1
  572. package/_mjs/Hub/api.mjs +55 -55
  573. package/_mjs/Hub/api.mjs.map +1 -1
  574. package/_mjs/IO/api/array.mjs +42 -0
  575. package/_mjs/IO/api/array.mjs.map +1 -0
  576. package/_mjs/IO/api/asyncInterrupt.mjs.map +1 -1
  577. package/_mjs/IO/api/awaitAllChildren.mjs +10 -0
  578. package/_mjs/IO/api/awaitAllChildren.mjs.map +1 -0
  579. package/_mjs/IO/api/cachedInvalidate.mjs +39 -0
  580. package/_mjs/IO/api/cachedInvalidate.mjs.map +1 -0
  581. package/_mjs/IO/api/disconnect.mjs +1 -1
  582. package/_mjs/IO/api/disconnect.mjs.map +1 -1
  583. package/_mjs/IO/api/foreachConcurrent.mjs +35 -28
  584. package/_mjs/IO/api/foreachConcurrent.mjs.map +1 -1
  585. package/_mjs/IO/api/fork.mjs +1 -1
  586. package/_mjs/IO/api/fork.mjs.map +1 -1
  587. package/_mjs/IO/api/forkDaemon.mjs +4 -4
  588. package/_mjs/IO/api/forkDaemon.mjs.map +1 -1
  589. package/_mjs/IO/api/interrupt.mjs +3 -3
  590. package/_mjs/IO/api/onTermination.mjs +1 -1
  591. package/_mjs/IO/api/onTermination.mjs.map +1 -1
  592. package/_mjs/IO/api/race.mjs +1 -1
  593. package/_mjs/IO/api/race.mjs.map +1 -1
  594. package/_mjs/IO/api/timeout.mjs +8 -9
  595. package/_mjs/IO/api/timeout.mjs.map +1 -1
  596. package/_mjs/IO/api/transplant.mjs +19 -5
  597. package/_mjs/IO/api/transplant.mjs.map +1 -1
  598. package/_mjs/IO/api/zipConcurrent.mjs +4 -4
  599. package/_mjs/IO/api/zipConcurrent.mjs.map +1 -1
  600. package/_mjs/IO/api.mjs +515 -468
  601. package/_mjs/IO/api.mjs.map +1 -1
  602. package/_mjs/IO/definition.mjs +1 -1
  603. package/_mjs/IO/definition.mjs.map +1 -1
  604. package/_mjs/IO/runtime.mjs +8 -8
  605. package/_mjs/IO/runtime.mjs.map +1 -1
  606. package/_mjs/IO.mjs +3 -1
  607. package/_mjs/IO.mjs.map +1 -1
  608. package/_mjs/IOEnv/definition.mjs.map +1 -1
  609. package/_mjs/Push/api.mjs +1 -1
  610. package/_mjs/Random/definition.mjs +1 -0
  611. package/_mjs/Random/definition.mjs.map +1 -1
  612. package/_mjs/Ref/Synchronized/api.mjs +1 -1
  613. package/_mjs/Ref/Synchronized/api.mjs.map +1 -1
  614. package/_mjs/Ref/Synchronized/constructors.mjs +1 -1
  615. package/_mjs/Ref/Synchronized/definition.mjs +1 -1
  616. package/_mjs/Ref/Synchronized/definition.mjs.map +1 -1
  617. package/_mjs/RuntimeFlag.mjs +1 -1
  618. package/_mjs/STM/definition.mjs +1 -1
  619. package/_mjs/ScopedRef/api.mjs +1 -1
  620. package/_mjs/ScopedRef/api.mjs.map +1 -1
  621. package/_mjs/Semaphore/Reservation.mjs +16 -0
  622. package/_mjs/Semaphore/Reservation.mjs.map +1 -0
  623. package/_mjs/Semaphore/constructors.mjs +17 -0
  624. package/_mjs/Semaphore/constructors.mjs.map +1 -0
  625. package/_mjs/Semaphore/definition.mjs +141 -0
  626. package/_mjs/Semaphore/definition.mjs.map +1 -0
  627. package/_mjs/Semaphore.mjs +4 -133
  628. package/_mjs/Semaphore.mjs.map +1 -1
  629. package/_mjs/Stream/api.mjs +701 -701
  630. package/_mjs/Stream/api.mjs.map +1 -1
  631. package/_mjs/SubscriptionRef.mjs +1 -1
  632. package/_mjs/global.mjs +1 -1
  633. package/_mjs/index.mjs +1 -1
  634. package/_src/Cached/api.ts +3 -3
  635. package/_src/Channel/api/toPull.ts +1 -1
  636. package/_src/Channel/api.ts +273 -272
  637. package/_src/Channel/core-api.ts +57 -55
  638. package/_src/Channel/internal/ChannelExecutor.ts +3 -3
  639. package/_src/Console/definition.ts +1 -0
  640. package/_src/CountdownLatch.ts +2 -0
  641. package/_src/Fiber/FiberMessage.ts +3 -28
  642. package/_src/Fiber/FiberRuntime.ts +988 -616
  643. package/_src/Fiber/api/interruptAs.ts +4 -3
  644. package/_src/Fiber/constructors.ts +1 -1
  645. package/_src/Fiber/definition.ts +4 -0
  646. package/_src/FiberScope/definition.ts +40 -2
  647. package/_src/FiberSet.ts +6 -2
  648. package/_src/Future/State.ts +128 -0
  649. package/_src/Future/api.ts +62 -51
  650. package/_src/Future/constructors.ts +4 -2
  651. package/_src/Future/definition.ts +2 -17
  652. package/_src/Future.ts +4 -3
  653. package/_src/Hub/api.ts +61 -61
  654. package/_src/IO/api/addFinalizerExit.ts +4 -4
  655. package/_src/IO/api/array.ts +49 -0
  656. package/_src/IO/api/asyncInterrupt.ts +1 -1
  657. package/_src/IO/api/awaitAllChildren.ts +6 -0
  658. package/_src/IO/api/cachedInvalidate.ts +42 -0
  659. package/_src/IO/api/foreachConcurrent.ts +39 -23
  660. package/_src/IO/api/fork.ts +1 -1
  661. package/_src/IO/api/forkDaemon.ts +2 -2
  662. package/_src/IO/api/memoize.ts +3 -3
  663. package/_src/IO/api/onTermination.ts +2 -2
  664. package/_src/IO/api/transplant.ts +26 -3
  665. package/_src/IO/api/zipConcurrent.ts +2 -2
  666. package/_src/IO/api.ts +547 -525
  667. package/_src/IO/definition.ts +4 -28
  668. package/_src/IO/runtime.ts +0 -1
  669. package/_src/IO.ts +65 -63
  670. package/_src/IOEnv/definition.ts +1 -4
  671. package/_src/Random/definition.ts +1 -0
  672. package/_src/Ref/Synchronized/api.ts +2 -2
  673. package/_src/Ref/Synchronized/definition.ts +1 -1
  674. package/_src/Semaphore/Reservation.ts +15 -0
  675. package/_src/Semaphore/constructors.ts +14 -0
  676. package/_src/Semaphore/definition.ts +180 -0
  677. package/_src/Semaphore.ts +5 -159
  678. package/_src/Stream/api.ts +679 -679
  679. package/package.json +4 -4
  680. package/IO/api/sequenceT.d.ts +0 -26
  681. package/_cjs/IO/api/sequenceT.cjs +0 -18
  682. package/_cjs/IO/api/sequenceT.cjs.map +0 -1
  683. package/_mjs/IO/api/sequenceT.mjs +0 -10
  684. package/_mjs/IO/api/sequenceT.mjs.map +0 -1
  685. package/_src/IO/api/sequenceT.ts +0 -16
@@ -1,105 +1,63 @@
1
- import type { FiberStatus } from "../FiberStatus.js";
2
- import type { OnFailure, OnSuccess, OnSuccessAndFailure, UIO } from "../IO/definition.js";
1
+ /* eslint perfectionist/sort-classes: "error" */
2
+
3
+ import type { Running } from "../FiberStatus.js";
4
+ import type { OnSuccess, OnSuccessAndFailure, UIO, UpdateRuntimeFlags } from "../IO/definition.js";
3
5
  import type { WhileLoop } from "../IO/definition.js";
4
6
  import type { RuntimeFlags } from "../RuntimeFlags.js";
5
7
 
8
+ import { IterableWeakSet } from "@fncts/base/collection/weak/IterableWeakSet";
6
9
  import { EitherTag } from "@fncts/base/data/Either";
7
10
  import { isIOError } from "@fncts/base/data/exceptions";
8
11
  import { ExitTag } from "@fncts/base/data/Exit";
9
12
  import { MaybeTag } from "@fncts/base/data/Maybe";
10
13
  import { Trace } from "@fncts/base/data/Trace";
14
+ import { assert } from "@fncts/base/util/assert";
11
15
  import { FiberTypeId, FiberVariance } from "@fncts/io/Fiber/definition";
12
16
  import { StackTraceBuilder } from "@fncts/io/internal/StackTraceBuilder";
13
17
 
14
- import { Done, Suspended } from "../FiberStatus.js";
15
- import { Running } from "../FiberStatus.js";
16
- import { FiberStatusTag } from "../FiberStatus.js";
18
+ import { FiberStatus } from "../FiberStatus.js";
17
19
  import { LinkedQueue } from "../internal/MutableQueue.js";
18
- import { IOPrimitive, isIO } from "../IO/definition.js";
20
+ import { IOPrimitive } from "../IO/definition.js";
19
21
  import { IOTag } from "../IO/definition.js";
20
22
  import { RuntimeFlag } from "../RuntimeFlag.js";
21
23
  import { FiberMessage, FiberMessageTag } from "./FiberMessage.js";
22
24
 
23
- export class RevertFlags {
24
- readonly _ioOpCode = IOTag.RevertFlags;
25
- constructor(
26
- readonly patch: RuntimeFlags.Patch,
27
- readonly trace?: string,
28
- ) {}
29
- }
30
-
31
- export class UpdateTrace {
32
- readonly _ioOpCode = IOTag.UpdateTrace;
33
- constructor(readonly trace?: string) {}
34
- }
25
+ const MAX_FORKS_BEFORE_YIELD = 128;
26
+ const MAX_DEPTH_BEFORE_TRAMPOLINE = 300;
27
+ const INITIAL_STACK_SIZE = 16;
28
+ const STACK_IDX_GC_THRESHOLD = 128;
35
29
 
36
- export type Continuation = OnSuccess | OnSuccessAndFailure | OnFailure | WhileLoop | UpdateTrace | RevertFlags;
30
+ export type Continuation = OnSuccess | OnSuccessAndFailure | WhileLoop | UpdateRuntimeFlags;
37
31
 
38
32
  /**
39
33
  * @tsplus type fncts.io.Fiber
40
34
  */
41
35
  export class FiberRuntime<E, A> implements Fiber.Runtime<E, A> {
36
+ readonly _tag = "RuntimeFiber";
37
+
42
38
  readonly [FiberTypeId]: FiberTypeId = FiberTypeId;
39
+
43
40
  declare [FiberVariance]: {
44
41
  readonly _E: (_: never) => E;
45
42
  readonly _A: (_: never) => A;
46
43
  };
47
- readonly _tag = "RuntimeFiber";
48
-
49
- constructor(
50
- readonly fiberId: FiberId.Runtime,
51
- fiberRefs0: FiberRefs,
52
- readonly runtimeFlags0: RuntimeFlags,
53
- ) {
54
- this._fiberRefs = fiberRefs0;
55
- this._runtimeFlags = runtimeFlags0;
56
- }
57
-
58
- private _fiberRefs: FiberRefs;
59
- private _runtimeFlags: RuntimeFlags;
60
- private queue = new LinkedQueue<FiberMessage>();
61
- private _children = null! as Set<FiberRuntime<any, any>>;
62
- private observers = List<(_: Exit<E, A>) => void>();
63
- private running = false;
64
- private stack = new Stack<Continuation>();
65
- private asyncInterruptor = null! as (_: IO<any, any, any>) => any;
66
- private asyncTrace = null! as string;
67
- private asyncBlockinOn = null! as FiberId;
68
- private _exitValue = null! as Exit<E, A>;
69
-
70
- get id(): FiberId.Runtime {
71
- return this.fiberId;
72
- }
73
-
74
- ask<A>(f: (fiberRuntime: FiberRuntime<any, any>, status: FiberStatus) => A): UIO<A> {
75
- return IO.defer(() => {
76
- const future = Future.unsafeMake<never, A>(this.fiberId);
77
-
78
- this.tell(FiberMessage.Stateful((fiber, status) => future.unsafeDone(IO.succeed(f(fiber, status)))));
79
44
 
80
- return future.await;
81
- });
82
- }
45
+ location = this.fiberId.location;
83
46
 
84
47
  get await(): UIO<Exit<E, A>> {
85
- return IO.async<never, never, Exit<E, A>>(
86
- (cb) =>
87
- this.tell(
88
- FiberMessage.Stateful((fiber, _) => {
89
- if (fiber._exitValue !== null) cb(IO.succeedNow(fiber.exitValue()));
90
- else fiber.addObserver((exit) => cb(IO.succeedNow(exit)));
91
- }),
92
- ),
93
- this.id,
94
- );
48
+ return IO.defer(this.awaitUnsafe());
95
49
  }
96
50
 
97
51
  get children(): UIO<Conc<FiberRuntime<any, any>>> {
98
- return this.ask((fiber) => Conc.from(fiber.getChildren()));
52
+ return IO(this.childrenChunk(this._children));
99
53
  }
100
54
 
101
55
  get fiberRefs(): UIO<FiberRefs> {
102
- return this.ask((fiber) => fiber.getFiberRefs());
56
+ return IO(this._fiberRefs);
57
+ }
58
+
59
+ get id(): FiberId.Runtime {
60
+ return this.fiberId;
103
61
  }
104
62
 
105
63
  get inheritAll(): UIO<void> {
@@ -124,749 +82,1141 @@ export class FiberRuntime<E, A> implements Fiber.Runtime<E, A> {
124
82
  });
125
83
  }
126
84
 
127
- get runtimeFlags(): UIO<RuntimeFlags> {
128
- return this.ask((state, status) => {
129
- if (status._tag === FiberStatusTag.Done) return state._runtimeFlags;
130
- else return status.runtimeFlags;
131
- });
85
+ get poll(): UIO<Maybe<Exit<E, A>>> {
86
+ return IO.succeed(Maybe.fromNullable(this.exitValue()));
132
87
  }
133
88
 
134
- interruptAsFork(fiberId: FiberId): UIO<void> {
135
- return IO.succeed(() => {
136
- const cause = Cause.interrupt(fiberId);
137
- this.tell(FiberMessage.InterruptSignal(cause));
138
- });
89
+ get runtimeFlags(): UIO<RuntimeFlags> {
90
+ return IO(this._runtimeFlags);
139
91
  }
140
92
 
141
- getSupervisor(): Supervisor<any> {
142
- return this.getFiberRef(FiberRef.currentSupervisor);
93
+ get scope() {
94
+ return FiberScope.unsafeMake(this);
143
95
  }
144
96
 
145
- get poll(): UIO<Maybe<Exit<E, A>>> {
146
- return IO.succeed(Maybe.fromNullable(this.exitValue()));
97
+ get status(): UIO<FiberStatus> {
98
+ return IO(this.getStatus());
147
99
  }
148
100
 
149
- private run(): void {
150
- this.drainQueueOnCurrentThread();
101
+ get trace(): UIO<Trace> {
102
+ return IO(this.generateStackTrace());
151
103
  }
152
104
 
153
- private drainQueueOnCurrentThread(): void {
154
- // assert(this.running, "Invalid state in FiberRuntime: Fiber is not running");
105
+ private _asyncContWith: ((_: IO<any, any, any>) => any) | null = null;
106
+ private _blockingOn: FiberId | null = null;
107
+ private _children = null! as IterableWeakSet<FiberRuntime<any, any>>;
108
+ private _exitValue: Exit<E, A> | null = null;
109
+ private _fiberRefs: FiberRefs;
110
+ private _forksSinceYield = 0;
111
+ private _lastTrace: string | undefined;
112
+ private _runtimeFlags: RuntimeFlags;
113
+ private _stack = null! as Array<Continuation>;
114
+ private _stackSize = 0;
115
+ private inbox = new LinkedQueue<FiberMessage>();
116
+ private observers = List<(_: Exit<E, A>) => void>();
117
+ private running = false;
155
118
 
156
- let recurse = true;
119
+ constructor(
120
+ readonly fiberId: FiberId.Runtime,
121
+ fiberRefs0: FiberRefs,
122
+ readonly runtimeFlags0: RuntimeFlags,
123
+ ) {
124
+ this._fiberRefs = fiberRefs0;
125
+ this._runtimeFlags = runtimeFlags0;
126
+ }
157
127
 
158
- while (recurse) {
159
- let evaluationSignal = EvaluationSignal.Continue;
160
- if (this._runtimeFlags.currentFiber) {
161
- // TODO
162
- }
163
- try {
164
- while (evaluationSignal === EvaluationSignal.Continue) {
165
- evaluationSignal = this.queue.isEmpty
166
- ? EvaluationSignal.Done
167
- : this.evaluateMessageWhileSuspended(this.queue.dequeue(null!));
128
+ addChild(child: FiberRuntime<any, any>): void {
129
+ this.getChildren().add(child);
130
+ }
131
+
132
+ addChildren(children: Iterable<FiberRuntime<any, any>>): void {
133
+ if (this.isAlive()) {
134
+ const childs = this.getChildren();
135
+ if (this.shouldInterrupt()) {
136
+ const cause = this.getInterruptedCause();
137
+ for (const child of children) {
138
+ if (child.isAlive()) {
139
+ childs.add(child);
140
+ child.tellInterrupt(cause);
141
+ }
168
142
  }
169
- } finally {
170
- this.running = false;
171
- if (this._runtimeFlags.currentFiber) {
172
- // TODO
143
+ } else {
144
+ for (const child of children) {
145
+ if (child.isAlive()) {
146
+ childs.add(child);
147
+ }
173
148
  }
174
149
  }
175
-
176
- if (!this.queue.isEmpty && !this.running) {
177
- this.running = true;
178
- if (evaluationSignal === EvaluationSignal.YieldNow) {
179
- this.drainQueueLaterOnExecutor();
180
- recurse = false;
181
- } else {
182
- recurse = true;
150
+ } else {
151
+ const cause = this.getInterruptedCause();
152
+ for (const child of children) {
153
+ if (child.isAlive()) {
154
+ child.tellInterrupt(cause);
183
155
  }
184
- } else {
185
- recurse = false;
186
156
  }
187
157
  }
188
158
  }
189
159
 
190
- private drainQueueLaterOnExecutor(): void {
191
- // assert(this.running, "Invalid state in FiberRuntime: Fiber is not running");
160
+ addObserver(observer: (exit: Exit<E, A>) => void): void {
161
+ if (this._exitValue !== null) observer(this._exitValue);
162
+ else this.observers = Cons(observer, this.observers);
163
+ }
192
164
 
193
- this.getFiberRef(FiberRef.currentScheduler).scheduleTask(() => this.run());
165
+ deleteFiberRef(ref: FiberRef<any>): void {
166
+ this._fiberRefs = this._fiberRefs.delete(ref);
194
167
  }
195
168
 
196
- private drainQueueWhileRunning(
197
- runtimeFlags: RuntimeFlags,
198
- lastTrace: string,
199
- cur0: IO<any, any, any>,
200
- ): IO<any, any, any> {
201
- let cur = cur0;
169
+ exitValue(): Exit<E, A> | null {
170
+ return this._exitValue;
171
+ }
202
172
 
203
- while (!this.queue.isEmpty) {
204
- const message = this.queue.dequeue(null!);
173
+ generateStackTrace() {
174
+ const builder = new StackTraceBuilder();
205
175
 
206
- switch (message._tag) {
207
- case FiberMessageTag.InterruptSignal: {
208
- this.processNewInterruptSignal(message.cause);
209
- cur = runtimeFlags.interruptible ? IO.failCause(message.cause) : cur;
210
- break;
211
- }
212
- case FiberMessageTag.GenStackTrace: {
213
- const oldCur = cur;
214
- cur = IO.stackTrace(undefined).flatMap((stackTrace) => {
215
- message.onTrace(stackTrace);
216
- return oldCur;
217
- }, undefined);
218
- break;
219
- }
220
- case FiberMessageTag.Stateful: {
221
- message.onFiber(this, new Running(runtimeFlags, lastTrace));
222
- break;
223
- }
224
- case FiberMessageTag.Resume: {
225
- throw new IllegalStateError("It is illegal to have multiple concurrent run loops in a single fiber");
226
- }
227
- case FiberMessageTag.YieldNow: {
228
- const oldCur = cur;
229
- cur = IO.yieldNow.flatMap(() => oldCur, undefined);
230
- break;
176
+ const stack = this._stack;
177
+ const size = this._stackSize;
178
+
179
+ if (stack !== null) {
180
+ for (let i = stack.length < size ? stack.length : size; i >= 0; i--) {
181
+ const k = stack[i];
182
+ if (k != null) {
183
+ builder.append(TraceElement.parse(k.trace));
231
184
  }
232
185
  }
186
+
187
+ builder.append(TraceElement.parse(this.id.location));
233
188
  }
189
+ return new Trace(this.fiberId, builder.result());
190
+ }
234
191
 
235
- return cur;
192
+ getChildren(): Set<FiberRuntime<any, any>> {
193
+ let children = this._children;
194
+ if (children === null) {
195
+ children = new IterableWeakSet();
196
+ this._children = children;
197
+ }
198
+ return children;
236
199
  }
237
200
 
238
- private evaluateEffect(effect0: IO<any, any, any>) {
239
- // assert(this.running, "Invalid state in FiberRuntime: Fiber is not running");
201
+ getFiberRef<A>(fiberRef: FiberRef<A>): A {
202
+ if (this._fiberRefs.unFiberRefs.has(fiberRef)) {
203
+ return this._fiberRefs.unFiberRefs.unsafeGet(fiberRef)!.head[1] as A;
204
+ }
205
+ return fiberRef.initial;
206
+ }
207
+
208
+ getFiberRefs(): FiberRefs {
209
+ return this._fiberRefs;
210
+ }
240
211
 
241
- this.getSupervisor().unsafeOnResume(this);
212
+ getInterruptedCause(): Cause<never> {
213
+ return this.getFiberRef(FiberRef.interruptedCause);
214
+ }
242
215
 
243
- try {
244
- let effect: IO<any, any, any>;
216
+ getSupervisor(): Supervisor<any> {
217
+ return this.getFiberRef(FiberRef.currentSupervisor);
218
+ }
245
219
 
246
- if (this._runtimeFlags.interruptible && this.isInterrupted()) {
247
- effect = IO.failCause(this.getInterruptedCause());
220
+ interruptAs(fiberId: FiberId, __tsplusTrace?: string): UIO<Exit<E, A>> {
221
+ return IO.defer(() => {
222
+ const exit = this._exitValue;
223
+ if (exit !== null) {
224
+ return Exit.succeed(exit);
248
225
  } else {
249
- effect = effect0;
226
+ const cause = Cause.interrupt(fiberId, Trace(this.fiberId, Conc.single(TraceElement.parse(__tsplusTrace))));
227
+ this.tell(FiberMessage.InterruptSignal(cause));
228
+ return this.awaitUnsafe(__tsplusTrace);
250
229
  }
230
+ });
231
+ }
251
232
 
252
- let finalExit = null! as Exit<E, A>;
233
+ interruptAsFork(fiberId: FiberId, __tsplusTrace?: string): UIO<void> {
234
+ return IO.succeed(() => {
235
+ const cause = Cause.interrupt(fiberId);
236
+ this.tell(FiberMessage.InterruptSignal(cause));
237
+ });
238
+ }
253
239
 
254
- while (effect !== null) {
255
- try {
256
- const exit = this.runLoop(effect);
257
- this._runtimeFlags = this._runtimeFlags.enable(RuntimeFlag.WindDown);
258
- const interruption = this.interruptAllChildren();
259
-
260
- if (interruption === null) {
261
- if (this.queue.isEmpty) {
262
- finalExit = exit;
263
- this.setExitValue(exit);
264
- } else {
265
- this.tell(FiberMessage.Resume(IO.fromExitNow(exit)));
266
- }
240
+ isAlive(): boolean {
241
+ return this.exitValue === null;
242
+ }
267
243
 
268
- effect = null!;
269
- } else {
270
- effect = interruption.flatMap(() => IO.fromExitNow(exit), this.id.location);
271
- }
272
- } catch (e) {
273
- if (isIO(e)) {
274
- if (IO.concrete(e)._ioOpCode === IOTag.YieldNow) {
275
- if (this._runtimeFlags.cooperativeYielding) {
276
- this.tell(FiberMessage.YieldNow);
277
- this.tell(FiberMessage.Resume(IO.unit));
278
- effect = null!;
279
- } else {
280
- effect = IO.unit;
281
- }
282
- } else if (IO.concrete(e)._ioOpCode === IOTag.Async) {
283
- effect = null!;
284
- } else {
285
- throw new Error(`Unhandled op ${IO.concrete(e)._ioOpCode}`);
286
- }
287
- } else {
288
- throw e;
289
- }
290
- }
291
- }
292
- } finally {
293
- this.getSupervisor().unsafeOnSuspend(this);
244
+ isDone(): boolean {
245
+ return this.exitValue !== null;
246
+ }
247
+
248
+ isFatal(t: unknown): boolean {
249
+ return this.getFiberRef(FiberRef.currentIsFatal).apply(t);
250
+ }
251
+
252
+ isInterrupted(): boolean {
253
+ return !this.getFiberRef(FiberRef.interruptedCause).isEmpty;
254
+ }
255
+
256
+ log(message: () => string, cause: Cause<any>, overrideLogLevel: Maybe<LogLevel>, trace?: string): void {
257
+ const logLevel = overrideLogLevel.getOrElse(this.getFiberRef(FiberRef.currentLogLevel));
258
+ const spans = this.getFiberRef(FiberRef.currentLogSpan);
259
+ const annotations = this.getFiberRef(FiberRef.currentLogAnnotations);
260
+ const contextMap = this.getFiberRefs();
261
+ Logger.defaultString
262
+ .map((s) => console.log(s))
263
+ .filterLogLevel((level) => level >= LogLevel.Info)
264
+ .log(
265
+ TraceElement.parse(trace),
266
+ this.fiberId,
267
+ logLevel,
268
+ message,
269
+ cause,
270
+ contextMap.unFiberRefs,
271
+ spans,
272
+ annotations,
273
+ );
274
+ }
275
+
276
+ removeChild(child: FiberRuntime<any, any>) {
277
+ if (this._children !== null) {
278
+ this._children.delete(child);
294
279
  }
295
280
  }
296
281
 
297
- runLoop(effect: IO<any, any, any>): Exit<any, any> {
298
- // assert(this.running, "Invalid state in FiberRuntime: Fiber is not running");
282
+ removeObserver(observer: (exit: Exit<E, A>) => void): void {
283
+ this.observers = this.observers.filter((f) => f !== observer);
284
+ }
299
285
 
300
- let cur = IO.concrete(effect);
301
- let lastTrace = undefined! as string;
302
- let ops = 0;
286
+ resume<R>(effect: IO<R, E, A>) {
287
+ this.tell(FiberMessage.Resume(effect));
288
+ }
289
+
290
+ runLoop(
291
+ effect: IO.Concrete,
292
+ minStackIndex: number,
293
+ startStackIndex: number,
294
+ currentDepth: number,
295
+ currentOps: number,
296
+ ): Exit<any, any> | null {
297
+ assert(this.running, "Invalid state in FiberRuntime: Fiber is not running");
298
+
299
+ let op: IO.Concrete | null = effect;
300
+ let ops = currentOps;
301
+ let stackIndex = startStackIndex;
302
+
303
+ if (currentDepth >= MAX_DEPTH_BEFORE_TRAMPOLINE) {
304
+ this.inbox.enqueue(FiberMessage.Resume(effect));
305
+ return null;
306
+ }
303
307
 
304
308
  while (true) {
305
309
  if ((this._runtimeFlags & RuntimeFlag.OpSupervision) !== 0) {
306
- this.getSupervisor().unsafeOnEffect(this, cur);
310
+ this.getSupervisor().unsafeOnEffect(this, op!);
307
311
  }
308
312
 
309
- const nextTrace = IO.concrete(cur).trace;
310
- if (nextTrace !== undefined) lastTrace = nextTrace;
311
-
312
- cur = IO.concrete(this.drainQueueWhileRunning(this._runtimeFlags, lastTrace, cur));
313
+ op = IO.concrete(this.drainQueueWhileRunning(op!));
313
314
 
314
315
  ops += 1;
315
316
 
316
317
  if (ops > this.getFiberRef(FiberRef.currentMaxFiberOps)) {
317
- ops = 0;
318
- const oldCur = cur;
319
- const trace = lastTrace;
320
- cur = IO.concrete(IO.yieldNow.flatMap(() => oldCur, trace));
318
+ this.updateLastTrace(op.trace);
319
+ this.inbox.enqueue(FiberMessage.Resume(op));
320
+
321
+ return null;
321
322
  }
322
- try {
323
- switch (cur._ioOpCode) {
324
- case IOTag.Sync: {
325
- const value = cur.i0();
326
- const cont = this.getNextSuccessCont();
327
- if (cont) {
328
- switch (cont._ioOpCode) {
329
- case IOTag.OnSuccess: {
330
- cur = IO.concrete(cont.i1(value));
331
- break;
332
- }
333
- case IOTag.OnSuccessAndFailure: {
334
- cur = IO.concrete(cont.i2(value));
335
- break;
336
- }
337
- case IOTag.WhileLoop: {
338
- cont.i2(value);
339
- if (cont.i0()) {
340
- this.stack.push(cont);
341
- cur = IO.concrete(cont.i1());
342
- } else {
343
- cur = IO.concrete(IO.unit);
344
- }
345
- break;
346
- }
347
- case IOTag.RevertFlags: {
348
- this.patchRuntimeFlags(this._runtimeFlags, cont.patch);
349
- if (this._runtimeFlags.interruptible && this.isInterrupted()) {
350
- cur = IO.concrete(IO.failCauseNow(this.getInterruptedCause()));
351
- } else {
352
- cur = IO.concrete(IO.succeedNow(value));
353
- }
354
- break;
355
- }
356
- case IOTag.UpdateTrace: {
357
- if (cont.trace !== undefined) lastTrace = cont.trace;
358
- cur = IO.concrete(IO.unit);
359
- break;
360
- }
361
- }
362
- } else {
363
- return Exit.succeed(value);
323
+
324
+ switch (op._ioOpCode) {
325
+ case IOTag.SucceedNow: {
326
+ const value = op.i0;
327
+
328
+ op = null;
329
+
330
+ while (op === null && stackIndex > minStackIndex) {
331
+ stackIndex -= 1;
332
+ const continuation = this._stack[stackIndex];
333
+ this.popStackFrame(stackIndex);
334
+ switch (continuation._ioOpCode) {
335
+ case IOTag.OnSuccess:
336
+ op = continuation.i1(value);
337
+ break;
338
+ case IOTag.OnSuccessAndFailure:
339
+ op = continuation.i2(value);
340
+ break;
341
+ case IOTag.UpdateRuntimeFlags:
342
+ op = this.patchRuntimeFlags(continuation.i0, null, null);
343
+ break;
364
344
  }
365
- break;
366
- }
367
- case IOTag.OnSuccessAndFailure:
368
- case IOTag.OnFailure:
369
- case IOTag.OnSuccess: {
370
- this.stack.push(cur);
371
- cur = IO.concrete(cur.i0);
372
- break;
373
345
  }
374
- case IOTag.Async: {
375
- this.asyncTrace = lastTrace;
376
- this.asyncBlockinOn = cur.i1();
377
- this.initiateAsync(this._runtimeFlags, cur.i0);
378
- throw cur;
346
+
347
+ if (op === null) {
348
+ return Exit.succeed(value);
379
349
  }
380
- case IOTag.UpdateRuntimeFlagsWithin: {
381
- const updateFlags = cur.i0;
382
- const oldRuntimeFlags = this._runtimeFlags;
383
- const newRuntimeFlags = updateFlags.patch(oldRuntimeFlags);
384
350
 
385
- if (newRuntimeFlags === oldRuntimeFlags) {
386
- cur = IO.concrete(cur.i1(oldRuntimeFlags));
387
- } else {
388
- if (newRuntimeFlags.interruptible && this.isInterrupted()) {
389
- cur = IO.concrete(IO.failCauseNow(this.getInterruptedCause()));
390
- } else {
391
- this.patchRuntimeFlags(this._runtimeFlags, updateFlags);
392
- const revertFlags = newRuntimeFlags.diff(oldRuntimeFlags);
393
- this.stack.push(new RevertFlags(revertFlags));
394
- cur = IO.concrete(cur.i1(oldRuntimeFlags));
395
- }
351
+ break;
352
+ }
353
+ case IOTag.Sync: {
354
+ this.updateLastTrace(op.trace);
355
+ const value = op.i0();
356
+
357
+ op = null;
358
+
359
+ while (op === null && stackIndex > minStackIndex) {
360
+ stackIndex -= 1;
361
+ const continuation = this._stack[stackIndex];
362
+ this.popStackFrame(stackIndex);
363
+
364
+ switch (continuation._ioOpCode) {
365
+ case IOTag.OnSuccess:
366
+ op = continuation.i1(value);
367
+ break;
368
+ case IOTag.OnSuccessAndFailure:
369
+ op = continuation.i2(value);
370
+ break;
371
+ case IOTag.UpdateRuntimeFlags:
372
+ op = this.patchRuntimeFlags(continuation.i0, null, null);
373
+ break;
396
374
  }
397
- break;
398
375
  }
399
- case IOTag.GenerateStackTrace: {
400
- cur = IO.concrete(IO.succeedNow(this.generateStackTrace()));
401
- break;
376
+
377
+ if (op === null) {
378
+ return Exit.succeed(value);
402
379
  }
403
- case IOTag.Stateful: {
404
- cur = IO.concrete(cur.i0(this, new Running(this._runtimeFlags, lastTrace)));
405
- break;
380
+ break;
381
+ }
382
+ case IOTag.OnSuccess: {
383
+ this.updateLastTrace(op.trace);
384
+
385
+ const first = op.i0;
386
+
387
+ if (first === IO.unit) {
388
+ op = op.i1(undefined);
389
+ } else {
390
+ stackIndex = this.pushStackFrame(op, stackIndex);
391
+
392
+ const result = this.runLoop(first, stackIndex, stackIndex, currentDepth + 1, ops);
393
+ ops += 1;
394
+
395
+ if (result === null) {
396
+ return null;
397
+ }
398
+
399
+ stackIndex -= 1;
400
+ this.popStackFrame(stackIndex);
401
+
402
+ switch (result._tag) {
403
+ case ExitTag.Success:
404
+ op = op.i1(result.value);
405
+ break;
406
+ case ExitTag.Failure:
407
+ op = IO.concrete(IO.failCauseNow(result.cause));
408
+ break;
409
+ }
406
410
  }
407
- case IOTag.SucceedNow: {
408
- const oldCur = cur;
409
- const cont = this.getNextSuccessCont();
410
- if (cont) {
411
- switch (cont._ioOpCode) {
412
- case IOTag.OnSuccess: {
413
- cur = IO.concrete(cont.i1(oldCur.i0));
414
- break;
415
- }
416
- case IOTag.OnSuccessAndFailure: {
417
- cur = IO.concrete(cont.i2(oldCur.i0));
418
- break;
419
- }
420
- case IOTag.WhileLoop: {
421
- cont.i2(oldCur.i0);
422
- if (cont.i0()) {
423
- this.stack.push(cont);
424
- cur = IO.concrete(cont.i1());
425
- } else {
426
- cur = IO.concrete(IO.unit);
427
- }
428
- break;
429
- }
430
- case IOTag.RevertFlags: {
431
- this.patchRuntimeFlags(this._runtimeFlags, cont.patch);
432
- if (this._runtimeFlags.interruptible && this.isInterrupted()) {
433
- cur = IO.concrete(IO.failCauseNow(this.getInterruptedCause()));
434
- }
435
- break;
436
- }
437
- case IOTag.UpdateTrace: {
438
- if (cont.trace !== undefined) lastTrace = cont.trace;
439
- cur = IO.concrete(IO.unit);
440
- break;
441
- }
442
- }
443
- } else {
444
- return Exit.succeed(oldCur.i0);
445
- }
446
- break;
411
+ break;
412
+ }
413
+ case IOTag.OnSuccessAndFailure: {
414
+ this.updateLastTrace(op.trace);
415
+
416
+ stackIndex = this.pushStackFrame(op, stackIndex);
417
+
418
+ const result = this.runLoop(op.i0, stackIndex, stackIndex, currentDepth + 1, ops);
419
+ ops += 1;
420
+
421
+ if (result === null) {
422
+ return null;
447
423
  }
448
- case IOTag.Fail: {
449
- const cause = cur.i0();
450
- const cont = this.getNextFailCont();
451
- if (cont) {
452
- switch (cont._ioOpCode) {
453
- case IOTag.OnFailure:
454
- case IOTag.OnSuccessAndFailure: {
455
- if (!(this._runtimeFlags.interruptible && this.isInterrupted())) {
456
- cur = IO.concrete(cont.i1(cause));
457
- } else {
458
- cur = IO.concrete(IO.failCauseNow(cause.stripFailures));
459
- }
460
- break;
461
- }
462
- case IOTag.RevertFlags: {
463
- this.patchRuntimeFlags(this._runtimeFlags, cont.patch);
464
- if (this._runtimeFlags.interruptible && this.isInterrupted()) {
465
- const interruptedCause = this.getInterruptedCause();
466
- if (cause.contains(interruptedCause)) {
467
- cur = IO.concrete(IO.failCauseNow(cause));
468
- } else {
469
- cur = IO.concrete(IO.failCauseNow(Cause.sequential(cause, this.getInterruptedCause())));
470
- }
471
- }
472
- break;
473
- }
474
- case IOTag.UpdateTrace: {
475
- if (cont.trace !== undefined) lastTrace = cont.trace;
476
- cur = IO.concrete(IO.unit);
477
- break;
478
- }
479
- }
480
- } else {
481
- return Exit.failCause(cause);
424
+
425
+ stackIndex -= 1;
426
+ this.popStackFrame(stackIndex);
427
+
428
+ switch (result._tag) {
429
+ case ExitTag.Success: {
430
+ op = op.i2(result.value);
431
+ break;
482
432
  }
483
- break;
484
- }
485
- case IOTag.UpdateRuntimeFlags: {
486
- this.patchRuntimeFlags(this._runtimeFlags, cur.i0);
487
- cur = IO.concrete(IO.unit);
488
- break;
489
- }
490
- case IOTag.WhileLoop: {
491
- const iterate = cur;
492
- const check = iterate.i0;
493
- const body = iterate.i1;
494
- if (check()) {
495
- cur = IO.concrete(body());
496
- this.stack.push(iterate);
497
- } else {
498
- cur = IO.concrete(IO.unit);
433
+ case ExitTag.Failure: {
434
+ const cause = result.cause;
435
+ if (this.shouldInterrupt()) {
436
+ op = IO.concrete(IO.failCauseNow(cause.stripFailures));
437
+ } else {
438
+ op = op.i1(result.cause);
439
+ }
499
440
  }
500
- break;
501
441
  }
502
- case IOTag.YieldNow: {
503
- throw cur;
442
+
443
+ break;
444
+ }
445
+ case IOTag.Async: {
446
+ this.updateLastTrace(op.trace);
447
+ this._blockingOn = op.i1();
448
+
449
+ op = this.initiateAsync(op.i0);
450
+
451
+ if (op === null) {
452
+ op = this.drainQueueAfterAsync();
504
453
  }
505
- case IOTag.Commit: {
506
- cur = IO.concrete(cur.commit);
507
- break;
454
+
455
+ if (op === null) {
456
+ return null;
508
457
  }
509
- case IOTag.External: {
510
- cur = IO.concrete(cur.toIO);
511
- break;
458
+
459
+ if (this.shouldInterrupt()) {
460
+ op = IO.concrete(IO.failCauseNow(this.getInterruptedCause()));
512
461
  }
513
- case null: {
514
- switch (cur._tag) {
515
- case MaybeTag.Just: {
516
- cur = IO.concrete(IO.succeedNow(cur.value));
517
- break;
518
- }
519
- case MaybeTag.Nothing: {
520
- cur = IO.concrete(IO.failNow(new NoSuchElementError()));
521
- break;
522
- }
523
- case EitherTag.Left: {
524
- cur = IO.concrete(IO.failNow(cur.left));
525
- break;
462
+
463
+ break;
464
+ }
465
+ case IOTag.UpdateRuntimeFlagsWithin: {
466
+ const trace = op.trace;
467
+ this.updateLastTrace(trace);
468
+ const updateFlags = op.i0;
469
+ const oldRuntimeFlags = this._runtimeFlags;
470
+ const newRuntimeFlags = updateFlags.patch(oldRuntimeFlags);
471
+
472
+ if (newRuntimeFlags === oldRuntimeFlags) {
473
+ op = IO.concrete(op.i1(oldRuntimeFlags));
474
+ } else {
475
+ if (newRuntimeFlags.interruptible && this.isInterrupted()) {
476
+ op = IO.concrete(IO.failCauseNow(this.getInterruptedCause()));
477
+ } else {
478
+ this.patchRuntimeFlagsOnly(updateFlags);
479
+
480
+ const revertFlags = newRuntimeFlags.diff(oldRuntimeFlags);
481
+
482
+ const k = IO.updateRuntimeFlags(revertFlags, trace) as UpdateRuntimeFlags;
483
+
484
+ stackIndex = this.pushStackFrame(k, stackIndex);
485
+
486
+ const exit = this.runLoop(op.i1(oldRuntimeFlags), stackIndex, stackIndex, currentDepth + 1, ops);
487
+ ops += 1;
488
+
489
+ if (exit === null) {
490
+ return null;
526
491
  }
527
- case EitherTag.Right: {
528
- cur = IO.concrete(IO.succeedNow(cur.right));
492
+
493
+ stackIndex -= 1;
494
+ this.popStackFrame(stackIndex);
495
+
496
+ op = this.patchRuntimeFlags(revertFlags, exit.causeOrNull, exit);
497
+ }
498
+ }
499
+ break;
500
+ }
501
+ case IOTag.Stateful: {
502
+ const trace = op.trace;
503
+ this.updateLastTrace(trace);
504
+ op = op.i0(this, FiberStatus.running(this._runtimeFlags, trace) as Running);
505
+ break;
506
+ }
507
+ case IOTag.Fail: {
508
+ let cause = op.i0();
509
+
510
+ op = null;
511
+
512
+ while (op === null && stackIndex > minStackIndex) {
513
+ stackIndex -= 1;
514
+
515
+ const continuation = this._stack[stackIndex];
516
+
517
+ this.popStackFrame(stackIndex);
518
+
519
+ switch (continuation._ioOpCode) {
520
+ case IOTag.OnSuccessAndFailure: {
521
+ if (this.shouldInterrupt()) {
522
+ cause = cause.stripFailures;
523
+ } else {
524
+ op = continuation.i1(cause);
525
+ }
529
526
  break;
530
527
  }
531
- case ExitTag.Failure: {
532
- cur = IO.concrete(IO.failCauseNow(cur.cause));
528
+ case IOTag.UpdateRuntimeFlags:
529
+ op = this.patchRuntimeFlags(continuation.i0, cause, null);
533
530
  break;
534
- }
535
- case ExitTag.Success: {
536
- cur = IO.concrete(IO.succeedNow(cur.value));
531
+ }
532
+ }
533
+
534
+ if (op === null) {
535
+ return Exit.failCause(cause);
536
+ }
537
+
538
+ break;
539
+ }
540
+ case IOTag.UpdateRuntimeFlags: {
541
+ this.updateLastTrace(op.trace);
542
+ op = this.patchRuntimeFlags(op.i0, null, IO.unit);
543
+ break;
544
+ }
545
+ case IOTag.WhileLoop: {
546
+ const iterate = op;
547
+ this.updateLastTrace(iterate.trace);
548
+ const check = iterate.i0;
549
+ const body = iterate.i1;
550
+ const process = iterate.i2;
551
+
552
+ stackIndex = this.pushStackFrame(iterate, stackIndex);
553
+
554
+ op = null;
555
+
556
+ const nextDepth = currentDepth + 1;
557
+
558
+ while (op === null && check()) {
559
+ const exit = this.runLoop(body(), stackIndex, stackIndex, nextDepth, ops);
560
+
561
+ if (exit === null) {
562
+ return null;
563
+ }
564
+
565
+ switch (exit._tag) {
566
+ case ExitTag.Success:
567
+ process(exit.value);
537
568
  break;
538
- }
539
- case "Tag": {
540
- cur = IO.concrete(IO.service(cur));
569
+ case ExitTag.Failure:
570
+ op = IO.concrete(IO.failCauseNow(exit.cause));
541
571
  break;
542
- }
543
572
  }
573
+
574
+ ops += 1;
544
575
  }
576
+
577
+ stackIndex -= 1;
578
+ this.popStackFrame(stackIndex);
579
+
580
+ if (op === null) {
581
+ op = IO.concrete(IO.unit);
582
+ }
583
+
584
+ break;
545
585
  }
546
- } catch (e) {
547
- if (isIOError(e)) {
548
- cur = IO.concrete(IO.failCauseNow(e.cause));
549
- } else if (
550
- isIO(e) &&
551
- (IO.concrete(e)._ioOpCode === IOTag.Async || IO.concrete(e)._ioOpCode === IOTag.YieldNow)
552
- ) {
553
- throw e;
554
- } else if (isInterruptedException(e)) {
555
- cur = IO.concrete(IO.failCauseNow(Cause.parallel(Cause.halt(e), Cause.interrupt(FiberId.none))));
556
- } else {
557
- cur = IO.concrete(IO.failCauseNow(Cause.halt(e, Trace(this.fiberId, Conc(TraceElement.parse(lastTrace))))));
586
+ case IOTag.YieldNow: {
587
+ this.updateLastTrace(op.trace);
588
+ this.inbox.enqueue(FiberMessage.Resume(IO.unit));
589
+ return null;
590
+ }
591
+ case IOTag.Commit: {
592
+ op = IO.concrete(op.commit);
593
+ break;
594
+ }
595
+ case IOTag.External: {
596
+ op = IO.concrete(op.toIO);
597
+ break;
598
+ }
599
+ case null: {
600
+ switch (op._tag) {
601
+ case MaybeTag.Just: {
602
+ op = IO.concrete(IO.succeedNow(op.value));
603
+ break;
604
+ }
605
+ case MaybeTag.Nothing: {
606
+ op = IO.concrete(IO.failNow(new NoSuchElementError()));
607
+ break;
608
+ }
609
+ case EitherTag.Left: {
610
+ op = IO.concrete(IO.failNow(op.left));
611
+ break;
612
+ }
613
+ case EitherTag.Right: {
614
+ op = IO.concrete(IO.succeedNow(op.right));
615
+ break;
616
+ }
617
+ case ExitTag.Failure: {
618
+ op = IO.concrete(IO.failCauseNow(op.cause));
619
+ break;
620
+ }
621
+ case ExitTag.Success: {
622
+ op = IO.concrete(IO.succeedNow(op.value));
623
+ break;
624
+ }
625
+ case "Tag": {
626
+ op = IO.concrete(IO.service(op));
627
+ break;
628
+ }
629
+ }
558
630
  }
559
631
  }
560
632
  }
633
+
634
+ throw new Error("runLoop must exist with a return statement from within the while loop");
561
635
  }
562
636
 
563
- getInterruptedCause(): Cause<never> {
564
- return this.getFiberRef(FiberRef.interruptedCause);
637
+ setFiberRef<A>(fiberRef: FiberRef<A>, value: A): void {
638
+ this._fiberRefs = this._fiberRefs.updateAs(this.fiberId, fiberRef, value);
565
639
  }
566
640
 
567
- isInterrupted(): boolean {
568
- return !this.getFiberRef(FiberRef.interruptedCause).isEmpty;
641
+ setFiberRefs(fiberRefs0: FiberRefs): void {
642
+ this._fiberRefs = fiberRefs0;
569
643
  }
570
644
 
571
- getFiberRef<A>(fiberRef: FiberRef<A>): A {
572
- if (this._fiberRefs.unFiberRefs.has(fiberRef)) {
573
- return this._fiberRefs.unFiberRefs.unsafeGet(fiberRef)!.head[1] as A;
645
+ shouldYieldBeforeFork(): boolean {
646
+ if (this._runtimeFlags.cooperativeYielding) {
647
+ this._forksSinceYield += 1;
648
+ return this._forksSinceYield >= MAX_FORKS_BEFORE_YIELD;
574
649
  }
575
- return fiberRef.initial;
650
+
651
+ return false;
652
+ }
653
+
654
+ start<R>(effect: IO<R, E, A>) {
655
+ let result: Exit<E, A> | null = null;
656
+
657
+ if (!this.running) {
658
+ try {
659
+ this.running = true;
660
+ result = this.evaluateEffect(0, IO.concrete(effect));
661
+ } finally {
662
+ this.running = false;
663
+ if (!this.inbox.isEmpty) {
664
+ this.running = true;
665
+ this.drainQueueLaterOnExecutor();
666
+ }
667
+ }
668
+ } else {
669
+ this.tell(FiberMessage.Resume(effect));
670
+ }
671
+
672
+ return result;
673
+ }
674
+
675
+ startConcurrently(io: IO<any, E, A>): void {
676
+ this.tell(FiberMessage.Resume(io));
677
+ }
678
+
679
+ startFork<R>(effect: IO<R, E, A>): void {
680
+ this.tell(FiberMessage.Resume(effect));
681
+ }
682
+
683
+ startSuspended(): (io: IO<any, E, A>) => any {
684
+ let alreadyCalled = false;
685
+ const callback = (io: IO<any, E, A>) => {
686
+ if (!alreadyCalled) {
687
+ alreadyCalled = true;
688
+ this.tell(FiberMessage.Resume(io));
689
+ }
690
+ };
691
+
692
+ this._asyncContWith = callback;
693
+
694
+ return callback;
576
695
  }
577
696
 
578
697
  tell(message: FiberMessage): void {
579
- this.queue.enqueue(message);
698
+ this.inbox.enqueue(message);
580
699
  if (!this.running) {
581
700
  this.running = true;
582
701
  this.drainQueueLaterOnExecutor();
583
702
  }
584
703
  }
585
704
 
586
- exitValue(): Exit<E, A> {
587
- return this._exitValue;
705
+ tellAddChild(child: FiberRuntime<any, any>): void {
706
+ return this.tell(FiberMessage.Stateful((parentFiber) => parentFiber.addChild(child)));
588
707
  }
589
708
 
590
- addObserver(observer: (exit: Exit<E, A>) => void): void {
591
- if (this._exitValue !== null) observer(this._exitValue);
592
- else this.observers = Cons(observer, this.observers);
709
+ tellAddChildren(children: Iterable<FiberRuntime<any, any>>): void {
710
+ return this.tell(FiberMessage.Stateful((parentFiber) => parentFiber.addChildren(children)));
593
711
  }
594
712
 
595
- getChildren(): Set<FiberRuntime<any, any>> {
596
- if (this._children === null) {
597
- this._children = new Set();
598
- }
599
- return this._children;
713
+ tellInterrupt(cause: Cause<never>): void {
714
+ this.tell(FiberMessage.InterruptSignal(cause));
600
715
  }
601
716
 
602
- getFiberRefs(): FiberRefs {
603
- return this._fiberRefs;
717
+ transferChildren(scope: FiberScope) {
718
+ const children = this._children;
719
+ if (children !== null && children.size > 0) {
720
+ const childs = this.childrenChunk(children);
721
+ this._children = null!;
722
+ if (!childs.isEmpty) {
723
+ const flags = this._runtimeFlags;
724
+ for (const child of childs) {
725
+ scope.unsafeAdd(this, flags, child);
726
+ }
727
+ }
728
+ }
604
729
  }
605
730
 
606
- setFiberRefs(fiberRefs0: FiberRefs): void {
607
- this._fiberRefs = fiberRefs0;
731
+ updateFiberRef<A>(fiberRef: FiberRef<A>, f: (a: A) => A): void {
732
+ this.setFiberRef(fiberRef, f(this.getFiberRef(fiberRef)));
608
733
  }
609
734
 
610
- private patchRuntimeFlags(oldRuntimeFlags: RuntimeFlags, patch: RuntimeFlags.Patch): RuntimeFlags {
611
- const newRuntimeFlags = patch.patch(oldRuntimeFlags);
735
+ private addInterruptedCause(cause: Cause<never>): void {
736
+ const oldSC = this.getFiberRef(FiberRef.interruptedCause);
737
+ if (oldSC.contains(cause)) {
738
+ return;
739
+ }
740
+ this.setFiberRef(FiberRef.interruptedCause, Cause.sequential(oldSC, cause));
741
+ }
612
742
 
613
- this._runtimeFlags = newRuntimeFlags;
743
+ private awaitUnsafe(trace?: string): UIO<Exit<E, A>> {
744
+ const exitValue = this._exitValue;
745
+ if (exitValue !== null) {
746
+ return Exit.succeed(exitValue);
747
+ } else {
748
+ return IO.asyncInterrupt<never, never, Exit<E, A>>(
749
+ (k) => {
750
+ const cb = (exit: Exit<any, any>) => k(IO.succeedNow(exit));
751
+ this.addObserver(cb);
752
+ return Either.left(IO(this.removeObserver(cb)));
753
+ },
754
+ this.id,
755
+ trace,
756
+ );
757
+ }
758
+ }
614
759
 
615
- return newRuntimeFlags;
760
+ private childrenChunk(children: IterableWeakSet<FiberRuntime<any, any>>): Conc<FiberRuntime<any, any>> {
761
+ if (children === null) {
762
+ return Conc.empty();
763
+ }
764
+ const builder = Conc.builder<FiberRuntime<any, any>>();
765
+ children.forEach((child) => {
766
+ if (child !== null) {
767
+ builder.append(child);
768
+ }
769
+ });
770
+ return builder.result();
616
771
  }
617
772
 
618
- private sendInterruptSignalToAllChildren(): boolean {
619
- if (this._children === null || this._children.size === 0) return false;
620
- else {
621
- let told = false;
622
- for (const child of this._children) {
623
- if (child !== null) {
624
- child.tell(FiberMessage.InterruptSignal(Cause.interrupt(this.id)));
625
- told = true;
626
- }
773
+ private drainQueueAfterAsync(): IO.Concrete | null {
774
+ let resumption: IO.Concrete | null = null;
775
+ let message = this.inbox.dequeue(null!);
776
+
777
+ while (message !== null) {
778
+ switch (message._tag) {
779
+ case FiberMessageTag.InterruptSignal:
780
+ this.processNewInterruptSignal(message.cause);
781
+ break;
782
+ case FiberMessageTag.Stateful:
783
+ this.processStatefulMessage(message.onFiber);
784
+ break;
785
+ case FiberMessageTag.Resume:
786
+ resumption = IO.concrete(message.cont);
787
+ break;
627
788
  }
628
- return told;
789
+
790
+ message = this.inbox.dequeue(null!);
629
791
  }
792
+
793
+ return resumption;
630
794
  }
631
795
 
632
- private interruptAllChildren(): UIO<any> {
633
- if (this.sendInterruptSignalToAllChildren()) {
634
- const iterator = this._children[Symbol.iterator]();
796
+ private drainQueueLaterOnExecutor(): void {
797
+ // assert(this.running, "Invalid state in FiberRuntime: Fiber is not running");
635
798
 
636
- this._children = null!;
799
+ this.getFiberRef(FiberRef.currentScheduler).scheduleTask(() => this.run());
800
+ }
637
801
 
638
- let value: IteratorResult<FiberRuntime<any, any>>;
802
+ private drainQueueOnCurrentThread(depth: number): void {
803
+ // assert(this.running, "Invalid state in FiberRuntime: Fiber is not running");
639
804
 
640
- const check = () => {
641
- value = iterator.next();
642
- return !value.done;
643
- };
805
+ let recurse = true;
644
806
 
645
- const body = () => {
646
- if (value != null && !value.done) {
647
- return value.value.await;
648
- } else {
649
- return IO.unit;
807
+ while (recurse) {
808
+ let evaluationSignal = EvaluationSignal.Continue;
809
+ if (this._runtimeFlags.currentFiber) {
810
+ // TODO
811
+ }
812
+ try {
813
+ while (evaluationSignal === EvaluationSignal.Continue) {
814
+ evaluationSignal = this.inbox.isEmpty
815
+ ? EvaluationSignal.Done
816
+ : this.evaluateMessageWhileSuspended(depth, this.inbox.dequeue(null!));
650
817
  }
651
- };
652
-
653
- const io = new IOPrimitive(IOTag.WhileLoop) as any;
654
- io.i0 = check;
655
- io.i1 = body;
656
- io.i2 = () => {
657
- //
658
- };
818
+ } finally {
819
+ this.running = false;
820
+ if (this._runtimeFlags.currentFiber) {
821
+ // TODO
822
+ }
823
+ }
659
824
 
660
- return io;
661
- } else {
662
- return null!;
825
+ if (!this.inbox.isEmpty && !this.running) {
826
+ this.running = true;
827
+ if (evaluationSignal === EvaluationSignal.YieldNow) {
828
+ this.drainQueueLaterOnExecutor();
829
+ recurse = false;
830
+ } else {
831
+ recurse = true;
832
+ }
833
+ } else {
834
+ recurse = false;
835
+ }
663
836
  }
664
837
  }
665
838
 
666
- private initiateAsync(runtimeFlags: RuntimeFlags, asyncRegister: (k: (_: IO<any, any, any>) => void) => any): void {
667
- let alreadyCalled = false;
839
+ private drainQueueWhileRunning(cur0: IO.Concrete): IO<any, any, any> {
840
+ let cur = cur0;
668
841
 
669
- const callback = (effect: IO<any, any, any>) => {
670
- if (!alreadyCalled) {
671
- alreadyCalled = true;
672
- this.tell(FiberMessage.Resume(effect));
673
- }
674
- };
842
+ let message = this.inbox.dequeue(null!);
675
843
 
676
- if (runtimeFlags.interruptible) this.asyncInterruptor = callback;
844
+ while (message) {
845
+ switch (message._tag) {
846
+ case FiberMessageTag.InterruptSignal: {
847
+ this.updateLastTrace(cur.trace);
848
+ this.processNewInterruptSignal(message.cause);
849
+ if (this.isInterruptible()) {
850
+ cur = IO.concrete(IO.failCauseNow(message.cause));
851
+ }
852
+ break;
853
+ }
854
+ case FiberMessageTag.Stateful: {
855
+ this.processStatefulMessage(message.onFiber);
856
+ break;
857
+ }
858
+ case FiberMessageTag.Resume: {
859
+ throw new IllegalStateError("It is illegal to have multiple concurrent run loops in a single fiber");
860
+ }
861
+ }
677
862
 
678
- try {
679
- asyncRegister(callback);
680
- } catch (e) {
681
- callback(IO.failCauseNow(Cause.halt(e)));
863
+ message = this.inbox.dequeue(null!);
682
864
  }
683
- }
684
865
 
685
- setFiberRef<A>(fiberRef: FiberRef<A>, value: A): void {
686
- this._fiberRefs = this._fiberRefs.updateAs(this.fiberId, fiberRef, value);
866
+ return cur;
687
867
  }
688
868
 
689
- private addInterruptedCause(cause: Cause<never>): void {
690
- const oldSC = this.getFiberRef(FiberRef.interruptedCause);
691
- if (oldSC.contains(cause)) {
692
- return;
869
+ private ensureStackCapacity(size: number) {
870
+ const stack = this._stack;
871
+ const stackLength = stack.length;
872
+ if (stackLength < size) {
873
+ const newSize = (size & (size - 1)) == 0 ? size : highestOneBit(size) << 1;
874
+ const newStack = new Array<Continuation>(newSize);
875
+ copyArray(stack, 0, newStack, 0, stackLength);
876
+ this._stack = newStack;
693
877
  }
694
- this.setFiberRef(FiberRef.interruptedCause, Cause.sequential(oldSC, cause));
695
878
  }
696
879
 
697
- private processNewInterruptSignal(cause: Cause<never>): void {
698
- this.addInterruptedCause(cause);
699
- this.sendInterruptSignalToAllChildren();
880
+ private evaluateEffect(initialDepth: number, effect0: IO.Concrete): Exit<E, A> | null {
881
+ // assert(this.running, "Invalid state in FiberRuntime: Fiber is not running");
882
+ this._asyncContWith = null;
883
+ this._blockingOn = null;
884
+
885
+ this.updateLastTrace(effect0.trace);
886
+
887
+ const supervisor = this.getSupervisor();
888
+ supervisor.unsafeOnResume(this);
889
+
890
+ if (this._stack === null) {
891
+ this._stack = new Array(INITIAL_STACK_SIZE);
892
+ }
893
+
894
+ try {
895
+ let effect: IO.Concrete | null = effect0;
896
+ let finalExit: Exit<E, A> | null = null;
897
+
898
+ while (effect !== null) {
899
+ try {
900
+ if (this.shouldInterrupt()) {
901
+ effect = IO.concrete(IO.failCause(this.getInterruptedCause()));
902
+ }
903
+
904
+ const exit = this.runLoop(effect, 0, this._stackSize, initialDepth, 0);
905
+
906
+ if (exit === null) {
907
+ this._forksSinceYield = 0;
908
+ effect = null;
909
+ } else {
910
+ this._runtimeFlags = this._runtimeFlags.enable(RuntimeFlag.WindDown);
911
+ const interruption = this.interruptAllChildren();
912
+
913
+ if (interruption === null) {
914
+ if (this.inbox.isEmpty) {
915
+ finalExit = exit;
916
+
917
+ supervisor.unsafeOnEnd(finalExit, this);
918
+
919
+ this.setExitValue(exit);
920
+ } else {
921
+ this.tell(FiberMessage.Resume(IO.fromExitNow(exit)));
922
+ }
923
+
924
+ effect = null;
925
+ } else {
926
+ effect = IO.concrete(interruption.flatMap(() => IO.fromExitNow(exit), this.id.location));
927
+ }
928
+ }
929
+ } catch (t) {
930
+ if (this.isFatal(t)) {
931
+ // TODO
932
+ }
933
+
934
+ if (isIOError(t)) {
935
+ effect = IO.concrete(IO.failCauseNow(t.cause));
936
+ } else {
937
+ effect = IO.concrete(IO.failCauseNow(Cause.halt(t)));
938
+ }
939
+ }
940
+ }
941
+
942
+ return finalExit;
943
+ } finally {
944
+ this.gcStack();
945
+ this.getSupervisor().unsafeOnSuspend(this);
946
+ }
700
947
  }
701
948
 
702
- private evaluateMessageWhileSuspended(fiberMessage: FiberMessage): EvaluationSignal {
949
+ private evaluateMessageWhileSuspended(depth: number, fiberMessage: FiberMessage): EvaluationSignal {
703
950
  switch (fiberMessage._tag) {
704
951
  case FiberMessageTag.InterruptSignal: {
705
952
  this.processNewInterruptSignal(fiberMessage.cause);
706
953
 
707
- if (this.asyncInterruptor !== null) {
708
- this.asyncInterruptor(IO.failCause(fiberMessage.cause));
709
- this.asyncInterruptor = null!;
710
- }
711
-
712
- return EvaluationSignal.Continue;
713
- }
714
- case FiberMessageTag.GenStackTrace: {
715
- fiberMessage.onTrace(this.generateStackTrace());
716
954
  return EvaluationSignal.Continue;
717
955
  }
718
956
  case FiberMessageTag.Stateful: {
719
- let status: FiberStatus;
720
- if (this._exitValue !== null) {
721
- status = new Done();
722
- } else if (this.asyncTrace === null) {
723
- status = new Running(this._runtimeFlags, null!);
724
- } else {
725
- status = new Suspended(this._runtimeFlags, this.asyncBlockinOn, this.asyncTrace);
726
- }
727
-
728
- fiberMessage.onFiber(this, status);
957
+ this.processStatefulMessage(fiberMessage.onFiber);
729
958
 
730
959
  return EvaluationSignal.Continue;
731
960
  }
732
961
  case FiberMessageTag.Resume: {
733
- this.asyncInterruptor = null!;
734
- this.asyncTrace = null!;
735
- this.asyncBlockinOn = null!;
962
+ const nextEffect = fiberMessage.cont;
963
+ const exit = this.evaluateEffect(depth, IO.concrete(nextEffect));
964
+ if (exit === null) {
965
+ return EvaluationSignal.YieldNow;
966
+ }
967
+ return EvaluationSignal.Continue;
968
+ }
969
+ }
970
+ }
736
971
 
737
- this.evaluateEffect(fiberMessage.cont);
972
+ /**
973
+ * Removes references of entries from the stack higher than the current index
974
+ * so that they can be garbage collected.
975
+ *
976
+ * @note
977
+ * We only GC up to the {@link STACK_IDX_GC_THRESHOLD} index because
978
+ * we know that entries in indices higher than that have been auto-gc'd
979
+ * during the runloop
980
+ * @note
981
+ * This method MUST be invoked by the fiber itself while it's still running.
982
+ */
983
+ private gcStack(): void {
984
+ const fromIndex = this._stackSize;
985
+ if (fromIndex === 0) {
986
+ this._stack = null!;
987
+ } else {
988
+ const stack = this._stack;
989
+ const toIndex = Math.min(STACK_IDX_GC_THRESHOLD, stack.length);
738
990
 
739
- return EvaluationSignal.Continue;
991
+ if (fromIndex < toIndex && stack[fromIndex] !== null) {
992
+ stack.fill(null!, fromIndex, toIndex);
740
993
  }
741
- case FiberMessageTag.YieldNow: {
742
- return EvaluationSignal.YieldNow;
994
+ }
995
+ }
996
+
997
+ private getStatus(): FiberStatus {
998
+ if (this._exitValue !== null) {
999
+ return FiberStatus.done;
1000
+ } else {
1001
+ if (this._asyncContWith !== null) {
1002
+ return FiberStatus.suspended(this._runtimeFlags, this._blockingOn ?? FiberId.none, this._lastTrace);
1003
+ } else {
1004
+ return FiberStatus.running(this._runtimeFlags, this._lastTrace);
743
1005
  }
744
1006
  }
745
1007
  }
746
1008
 
747
- private generateStackTrace() {
748
- const builder = new StackTraceBuilder();
1009
+ private initiateAsync(asyncRegister: (k: (_: IO<any, any, any>) => void) => any): IO.Concrete | null {
1010
+ let alreadyCalled = false;
749
1011
 
750
- const stack = this.stack.clone();
751
- while (stack.hasNext) {
752
- builder.append(TraceElement.parse(stack.pop()!.trace));
1012
+ const callback = (effect: IO<any, any, any>) => {
1013
+ if (!alreadyCalled) {
1014
+ alreadyCalled = true;
1015
+ this.tell(FiberMessage.Resume(effect));
1016
+ }
1017
+ };
1018
+
1019
+ if (this.isInterruptible()) {
1020
+ this._asyncContWith = callback;
1021
+ } else {
1022
+ this._asyncContWith = () => void 0;
753
1023
  }
754
1024
 
755
- return new Trace(this.fiberId, builder.result());
756
- }
1025
+ try {
1026
+ const sync = asyncRegister(callback);
1027
+
1028
+ if (sync != null) {
1029
+ if (!alreadyCalled) {
1030
+ alreadyCalled = true;
1031
+ this._asyncContWith = null;
1032
+ this._blockingOn = null;
1033
+ return sync;
1034
+ } else {
1035
+ this.log(
1036
+ () =>
1037
+ "Async operation attempted synchronous resumption, but its callback was already invoked; synchronous value will be discarded",
1038
+ Cause.empty(),
1039
+ Just(LogLevel.Error),
1040
+ this.id.location,
1041
+ );
1042
+
1043
+ return null;
1044
+ }
1045
+ } else {
1046
+ return null;
1047
+ }
1048
+ } catch (t) {
1049
+ callback(IO.failCauseNow(Cause.halt(t)));
757
1050
 
758
- private setExitValue(exit: Exit<E, A>): void {
759
- this._exitValue = exit;
760
- for (const observer of this.observers) {
761
- observer(exit);
1051
+ return null;
762
1052
  }
763
- this.observers = List.empty();
764
1053
  }
765
1054
 
766
- resume<R>(effect: IO<R, E, A>) {
767
- this.tell(FiberMessage.Resume(effect));
768
- }
1055
+ private interruptAllChildren(): UIO<any> {
1056
+ if (this.sendInterruptSignalToAllChildren()) {
1057
+ const iterator = this._children[Symbol.iterator]();
769
1058
 
770
- start<R>(effect: IO<R, E, A>) {
771
- if (!this.running) {
772
- try {
773
- this.running = true;
774
- this.evaluateEffect(effect);
775
- } finally {
776
- this.running = false;
777
- if (!this.queue.isEmpty) {
778
- this.drainQueueLaterOnExecutor();
1059
+ this._children = null!;
1060
+
1061
+ let value: IteratorResult<FiberRuntime<any, any>>;
1062
+
1063
+ const check = () => {
1064
+ value = iterator.next();
1065
+ return !value.done;
1066
+ };
1067
+
1068
+ const body = () => {
1069
+ if (value != null && !value.done) {
1070
+ return value.value.await;
1071
+ } else {
1072
+ return IO.unit;
779
1073
  }
780
- }
1074
+ };
1075
+
1076
+ const io = new IOPrimitive(IOTag.WhileLoop) as any;
1077
+ io.i0 = check;
1078
+ io.i1 = body;
1079
+ io.i2 = () => {
1080
+ //
1081
+ };
1082
+
1083
+ return io;
781
1084
  } else {
782
- this.tell(FiberMessage.Resume(effect));
1085
+ return null!;
783
1086
  }
784
1087
  }
785
1088
 
786
- startFork<R>(effect: IO<R, E, A>): void {
787
- this.tell(FiberMessage.Resume(effect));
1089
+ private isInterruptible() {
1090
+ return this._runtimeFlags.interruptible;
788
1091
  }
789
1092
 
790
- updateFiberRef<A>(fiberRef: FiberRef<A>, f: (a: A) => A): void {
791
- this.setFiberRef(fiberRef, f(this.getFiberRef(fiberRef)));
1093
+ private patchRuntimeFlags<R, E, A>(
1094
+ patch: RuntimeFlags.Patch,
1095
+ cause: Cause<E> | null,
1096
+ continueEffect: IO<R, E, A> | null,
1097
+ ): IO.Concrete | null {
1098
+ const changed = this.patchRuntimeFlagsOnly(patch);
1099
+ const interruptEnabled = patch.isEnabled(RuntimeFlag.Interruption);
1100
+
1101
+ if (changed && interruptEnabled && this.shouldInterrupt()) {
1102
+ if (cause !== null) {
1103
+ return IO.concrete(IO.failCauseNow(Cause.sequential(cause, this.getInterruptedCause())));
1104
+ } else {
1105
+ return IO.concrete(IO.failCauseNow(this.getInterruptedCause()));
1106
+ }
1107
+ } else if (cause !== null) {
1108
+ return IO.concrete(IO.failCauseNow(cause));
1109
+ } else {
1110
+ return IO.concrete(continueEffect!);
1111
+ }
792
1112
  }
793
1113
 
794
- removeObserver(observer: (exit: Exit<E, A>) => void): void {
795
- this.observers = this.observers.filter((f) => f !== observer);
796
- }
1114
+ private patchRuntimeFlagsOnly(patch: RuntimeFlags.Patch): boolean {
1115
+ const oldFlags = this._runtimeFlags;
1116
+ const newFlags = patch.patch(oldFlags);
1117
+ const changed = oldFlags !== newFlags;
1118
+ if (changed) {
1119
+ if (patch.isEnabled(RuntimeFlag.CurrentFiber)) {
1120
+ // TODO
1121
+ } else {
1122
+ // TODO
1123
+ }
797
1124
 
798
- addChild(child: FiberRuntime<any, any>): void {
799
- this.getChildren().add(child);
1125
+ this._runtimeFlags = newFlags;
1126
+ }
1127
+
1128
+ return changed;
800
1129
  }
801
1130
 
802
- removeChild(child: FiberRuntime<any, any>) {
803
- if (this._children !== null) {
804
- this._children.delete(child);
1131
+ /**
1132
+ * Sets the `_stackSize` to `nextStackIndex`.
1133
+ *
1134
+ * This method might also null out the entry in the stack to allow it to be
1135
+ * GC'd, but only if the index is >= `FiberRuntime.StackIdxGcThreshold`.
1136
+ *
1137
+ * This is based on the assumption that when the stack is shallow, the entries
1138
+ * in the array will keep being overwritten as the pointer moves up and down.
1139
+ */
1140
+ private popStackFrame(nextStackIndex: number): void {
1141
+ if (nextStackIndex >= STACK_IDX_GC_THRESHOLD) {
1142
+ this._stack[nextStackIndex] = null!;
805
1143
  }
1144
+ this._stackSize = nextStackIndex;
806
1145
  }
807
1146
 
808
- get scope() {
809
- return FiberScope.unsafeMake(this);
810
- }
1147
+ private processNewInterruptSignal(cause: Cause<never>): void {
1148
+ this.addInterruptedCause(cause);
1149
+ this.sendInterruptSignalToAllChildren();
811
1150
 
812
- log(message: () => string, cause: Cause<any>, overrideLogLevel: Maybe<LogLevel>, trace?: string): void {
813
- const logLevel = overrideLogLevel.getOrElse(this.getFiberRef(FiberRef.currentLogLevel));
814
- const spans = this.getFiberRef(FiberRef.currentLogSpan);
815
- const annotations = this.getFiberRef(FiberRef.currentLogAnnotations);
816
- const contextMap = this.getFiberRefs();
817
- Logger.defaultString
818
- .map((s) => console.log(s))
819
- .filterLogLevel((level) => level >= LogLevel.Info)
820
- .log(
821
- TraceElement.parse(trace),
822
- this.fiberId,
823
- logLevel,
824
- message,
825
- cause,
826
- contextMap.unFiberRefs,
827
- spans,
828
- annotations,
829
- );
1151
+ const k = this._asyncContWith;
1152
+
1153
+ if (k !== null) {
1154
+ k(IO.failCauseNow(cause));
1155
+ }
830
1156
  }
831
1157
 
832
- deleteFiberRef(ref: FiberRef<any>): void {
833
- this._fiberRefs = this._fiberRefs.delete(ref);
1158
+ private processStatefulMessage(onFiber: (_: FiberRuntime<any, any>) => void): void {
1159
+ try {
1160
+ onFiber(this);
1161
+ } catch (t) {
1162
+ if (this.isFatal(t)) {
1163
+ // TODO
1164
+ } else {
1165
+ this.log(
1166
+ () => `An unexpected error was encountered while processing stateful fiber message with callback ${onFiber}`,
1167
+ Cause.halt(t),
1168
+ Just(LogLevel.Error),
1169
+ this.id.location,
1170
+ );
1171
+ }
1172
+ }
834
1173
  }
835
1174
 
836
- location = this.fiberId.location;
1175
+ private pushStackFrame(k: Continuation, stackIndex: number): number {
1176
+ const newSize = stackIndex + 1;
837
1177
 
838
- get status(): UIO<FiberStatus> {
839
- return this.ask((_, status) => status);
1178
+ this.ensureStackCapacity(newSize);
1179
+
1180
+ this._stack[stackIndex] = k;
1181
+ this._stackSize = newSize;
1182
+
1183
+ return newSize;
840
1184
  }
841
1185
 
842
- get trace(): UIO<Trace> {
843
- return IO.defer(() => {
844
- const future = Future.unsafeMake<never, Trace>(this.fiberId);
845
- this.tell(FiberMessage.GenStackTrace((trace) => future.unsafeDone(IO.succeedNow(trace))));
846
- return future.await;
847
- });
1186
+ private run(): void {
1187
+ this.drainQueueOnCurrentThread(0);
848
1188
  }
849
1189
 
850
- getNextSuccessCont() {
851
- while (this.stack.hasNext) {
852
- const frame = this.stack.pop()!;
853
- if (frame._ioOpCode !== IOTag.OnFailure) {
854
- return frame;
1190
+ private sendInterruptSignalToAllChildren(): boolean {
1191
+ if (this._children === null || this._children.size === 0) return false;
1192
+ else {
1193
+ let told = false;
1194
+ for (const child of this._children) {
1195
+ if (child !== null) {
1196
+ child.tell(FiberMessage.InterruptSignal(Cause.interrupt(this.id)));
1197
+ told = true;
1198
+ }
855
1199
  }
1200
+ return told;
856
1201
  }
857
1202
  }
858
1203
 
859
- getNextFailCont() {
860
- while (this.stack.hasNext) {
861
- const frame = this.stack.pop()!;
862
- if (frame._ioOpCode !== IOTag.OnSuccess && frame._ioOpCode !== IOTag.WhileLoop) {
863
- return frame;
864
- }
1204
+ private setExitValue(exit: Exit<E, A>): void {
1205
+ this._exitValue = exit;
1206
+ for (const observer of this.observers) {
1207
+ observer(exit);
865
1208
  }
1209
+ this.observers = List.empty();
866
1210
  }
867
1211
 
868
- isFatal(t: unknown): boolean {
869
- return this.getFiberRef(FiberRef.currentIsFatal).apply(t);
1212
+ private shouldInterrupt() {
1213
+ return this.isInterruptible() && this.isInterrupted();
1214
+ }
1215
+
1216
+ private updateLastTrace(newTrace?: string): void {
1217
+ if (newTrace !== null && newTrace !== "" && this._lastTrace !== newTrace) {
1218
+ this._lastTrace = newTrace;
1219
+ }
870
1220
  }
871
1221
  }
872
1222
 
@@ -875,3 +1225,25 @@ const enum EvaluationSignal {
875
1225
  YieldNow,
876
1226
  Done,
877
1227
  }
1228
+
1229
+ export function highestOneBit(i: number) {
1230
+ i |= i >> 1;
1231
+ i |= i >> 2;
1232
+ i |= i >> 4;
1233
+ i |= i >> 8;
1234
+ i |= i >> 16;
1235
+ return i - (i >>> 1);
1236
+ }
1237
+
1238
+ function copyArray<A>(
1239
+ source: ArrayLike<A>,
1240
+ sourcePos: number,
1241
+ dest: Array<A> | Uint8Array,
1242
+ destPos: number,
1243
+ length: number,
1244
+ ): void {
1245
+ const j = Math.min(source.length, sourcePos + length);
1246
+ for (let i = sourcePos; i < j; i++) {
1247
+ dest[destPos + i - sourcePos] = source[i]!;
1248
+ }
1249
+ }