effect 2.4.19 → 3.0.1

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 (615) hide show
  1. package/Array/package.json +6 -0
  2. package/FiberHandle/package.json +6 -0
  3. package/Record/package.json +6 -0
  4. package/dist/cjs/{ReadonlyArray.js → Array.js} +46 -23
  5. package/dist/cjs/Array.js.map +1 -0
  6. package/dist/cjs/Brand.js +2 -2
  7. package/dist/cjs/Brand.js.map +1 -1
  8. package/dist/cjs/Channel.js +4 -8
  9. package/dist/cjs/Channel.js.map +1 -1
  10. package/dist/cjs/Chunk.js +5 -1
  11. package/dist/cjs/Chunk.js.map +1 -1
  12. package/dist/cjs/ConfigError.js.map +1 -1
  13. package/dist/cjs/Cron.js +13 -13
  14. package/dist/cjs/Cron.js.map +1 -1
  15. package/dist/cjs/Effect.js +14 -10
  16. package/dist/cjs/Effect.js.map +1 -1
  17. package/dist/cjs/Either.js +4 -1
  18. package/dist/cjs/Either.js.map +1 -1
  19. package/dist/cjs/ExecutionStrategy.js.map +1 -1
  20. package/dist/cjs/Exit.js +3 -9
  21. package/dist/cjs/Exit.js.map +1 -1
  22. package/dist/cjs/Fiber.js +2 -8
  23. package/dist/cjs/Fiber.js.map +1 -1
  24. package/dist/cjs/FiberHandle.js +306 -0
  25. package/dist/cjs/FiberHandle.js.map +1 -0
  26. package/dist/cjs/FiberMap.js +105 -28
  27. package/dist/cjs/FiberMap.js.map +1 -1
  28. package/dist/cjs/FiberRefs.js.map +1 -1
  29. package/dist/cjs/FiberSet.js +51 -15
  30. package/dist/cjs/FiberSet.js.map +1 -1
  31. package/dist/cjs/HashMap.js.map +1 -1
  32. package/dist/cjs/HashSet.js.map +1 -1
  33. package/dist/cjs/Iterable.js +40 -5
  34. package/dist/cjs/Iterable.js.map +1 -1
  35. package/dist/cjs/Layer.js.map +1 -1
  36. package/dist/cjs/List.js +3 -3
  37. package/dist/cjs/List.js.map +1 -1
  38. package/dist/cjs/Metric.js +3 -1
  39. package/dist/cjs/Metric.js.map +1 -1
  40. package/dist/cjs/MetricKey.js.map +1 -1
  41. package/dist/cjs/MetricKeyType.js.map +1 -1
  42. package/dist/cjs/MutableHashMap.js +0 -4
  43. package/dist/cjs/MutableHashMap.js.map +1 -1
  44. package/dist/cjs/Option.js +3 -6
  45. package/dist/cjs/Option.js.map +1 -1
  46. package/dist/cjs/{ReadonlyRecord.js → Record.js} +29 -29
  47. package/dist/cjs/Record.js.map +1 -0
  48. package/dist/cjs/STM.js +4 -10
  49. package/dist/cjs/STM.js.map +1 -1
  50. package/dist/cjs/Schedule.js +2 -2
  51. package/dist/cjs/Schedule.js.map +1 -1
  52. package/dist/cjs/ScopedCache.js.map +1 -1
  53. package/dist/cjs/Stream.js +3 -9
  54. package/dist/cjs/Stream.js.map +1 -1
  55. package/dist/cjs/StreamHaltStrategy.js +2 -0
  56. package/dist/cjs/StreamHaltStrategy.js.map +1 -1
  57. package/dist/cjs/String.js +44 -2
  58. package/dist/cjs/String.js.map +1 -1
  59. package/dist/cjs/TestAnnotations.js +1 -1
  60. package/dist/cjs/TestAnnotations.js.map +1 -1
  61. package/dist/cjs/TestClock.js +3 -3
  62. package/dist/cjs/TestClock.js.map +1 -1
  63. package/dist/cjs/Tracer.js.map +1 -1
  64. package/dist/cjs/index.js +8 -6
  65. package/dist/cjs/index.js.map +1 -1
  66. package/dist/cjs/internal/{readonlyArray.js → array.js} +1 -1
  67. package/dist/cjs/internal/array.js.map +1 -0
  68. package/dist/cjs/internal/cache.js +3 -3
  69. package/dist/cjs/internal/cache.js.map +1 -1
  70. package/dist/cjs/internal/cause.js +3 -3
  71. package/dist/cjs/internal/cause.js.map +1 -1
  72. package/dist/cjs/internal/channel/channelExecutor.js +15 -15
  73. package/dist/cjs/internal/channel/channelExecutor.js.map +1 -1
  74. package/dist/cjs/internal/channel/channelState.js +1 -1
  75. package/dist/cjs/internal/channel/channelState.js.map +1 -1
  76. package/dist/cjs/internal/channel/singleProducerAsyncInput.js +1 -1
  77. package/dist/cjs/internal/channel/singleProducerAsyncInput.js.map +1 -1
  78. package/dist/cjs/internal/channel.js +10 -10
  79. package/dist/cjs/internal/channel.js.map +1 -1
  80. package/dist/cjs/internal/clock.js +2 -2
  81. package/dist/cjs/internal/clock.js.map +1 -1
  82. package/dist/cjs/internal/configError.js +20 -19
  83. package/dist/cjs/internal/configError.js.map +1 -1
  84. package/dist/cjs/internal/configProvider/pathPatch.js +1 -1
  85. package/dist/cjs/internal/configProvider/pathPatch.js.map +1 -1
  86. package/dist/cjs/internal/configProvider.js +47 -48
  87. package/dist/cjs/internal/configProvider.js.map +1 -1
  88. package/dist/cjs/internal/core-effect.js +42 -28
  89. package/dist/cjs/internal/core-effect.js.map +1 -1
  90. package/dist/cjs/internal/core-stream.js +2 -3
  91. package/dist/cjs/internal/core-stream.js.map +1 -1
  92. package/dist/cjs/internal/core.js +27 -31
  93. package/dist/cjs/internal/core.js.map +1 -1
  94. package/dist/cjs/internal/dataSource.js +19 -2
  95. package/dist/cjs/internal/dataSource.js.map +1 -1
  96. package/dist/cjs/internal/differ/readonlyArrayPatch.js +6 -6
  97. package/dist/cjs/internal/differ/readonlyArrayPatch.js.map +1 -1
  98. package/dist/cjs/internal/effect/circular.js +1 -1
  99. package/dist/cjs/internal/effect/circular.js.map +1 -1
  100. package/dist/cjs/internal/executionStrategy.js +4 -4
  101. package/dist/cjs/internal/executionStrategy.js.map +1 -1
  102. package/dist/cjs/internal/fiber.js +5 -6
  103. package/dist/cjs/internal/fiber.js.map +1 -1
  104. package/dist/cjs/internal/fiberRefs/patch.js +1 -1
  105. package/dist/cjs/internal/fiberRefs/patch.js.map +1 -1
  106. package/dist/cjs/internal/fiberRefs.js +1 -1
  107. package/dist/cjs/internal/fiberRefs.js.map +1 -1
  108. package/dist/cjs/internal/fiberRuntime.js +33 -33
  109. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  110. package/dist/cjs/internal/groupBy.js +3 -3
  111. package/dist/cjs/internal/groupBy.js.map +1 -1
  112. package/dist/cjs/internal/hashMap.js.map +1 -1
  113. package/dist/cjs/internal/hashSet.js.map +1 -1
  114. package/dist/cjs/internal/layer/circular.js.map +1 -1
  115. package/dist/cjs/internal/layer.js +5 -5
  116. package/dist/cjs/internal/layer.js.map +1 -1
  117. package/dist/cjs/internal/logger.js +28 -8
  118. package/dist/cjs/internal/logger.js.map +1 -1
  119. package/dist/cjs/internal/managedRuntime.js +1 -1
  120. package/dist/cjs/internal/managedRuntime.js.map +1 -1
  121. package/dist/cjs/internal/metric/boundaries.js +4 -4
  122. package/dist/cjs/internal/metric/boundaries.js.map +1 -1
  123. package/dist/cjs/internal/metric/hook.js +20 -17
  124. package/dist/cjs/internal/metric/hook.js.map +1 -1
  125. package/dist/cjs/internal/metric/key.js +4 -4
  126. package/dist/cjs/internal/metric/key.js.map +1 -1
  127. package/dist/cjs/internal/metric/keyType.js +6 -1
  128. package/dist/cjs/internal/metric/keyType.js.map +1 -1
  129. package/dist/cjs/internal/metric/state.js +4 -4
  130. package/dist/cjs/internal/metric/state.js.map +1 -1
  131. package/dist/cjs/internal/metric.js +4 -4
  132. package/dist/cjs/internal/metric.js.map +1 -1
  133. package/dist/cjs/internal/pool.js +11 -11
  134. package/dist/cjs/internal/pool.js.map +1 -1
  135. package/dist/cjs/internal/pubsub.js +5 -5
  136. package/dist/cjs/internal/pubsub.js.map +1 -1
  137. package/dist/cjs/internal/query.js +2 -2
  138. package/dist/cjs/internal/query.js.map +1 -1
  139. package/dist/cjs/internal/queue.js +9 -9
  140. package/dist/cjs/internal/queue.js.map +1 -1
  141. package/dist/cjs/internal/rateLimiter.js +1 -1
  142. package/dist/cjs/internal/rateLimiter.js.map +1 -1
  143. package/dist/cjs/internal/redBlackTree/iterator.js +2 -2
  144. package/dist/cjs/internal/redBlackTree/iterator.js.map +1 -1
  145. package/dist/cjs/internal/reloadable.js +1 -1
  146. package/dist/cjs/internal/reloadable.js.map +1 -1
  147. package/dist/cjs/internal/runtime.js +4 -4
  148. package/dist/cjs/internal/runtime.js.map +1 -1
  149. package/dist/cjs/internal/schedule.js +5 -5
  150. package/dist/cjs/internal/schedule.js.map +1 -1
  151. package/dist/cjs/internal/scopedCache.js +7 -7
  152. package/dist/cjs/internal/scopedCache.js.map +1 -1
  153. package/dist/cjs/internal/scopedRef.js +4 -4
  154. package/dist/cjs/internal/scopedRef.js.map +1 -1
  155. package/dist/cjs/internal/secret.js +2 -2
  156. package/dist/cjs/internal/secret.js.map +1 -1
  157. package/dist/cjs/internal/sink.js +10 -10
  158. package/dist/cjs/internal/sink.js.map +1 -1
  159. package/dist/cjs/internal/stm/stm/tExit.js +2 -4
  160. package/dist/cjs/internal/stm/stm/tExit.js.map +1 -1
  161. package/dist/cjs/internal/stm/stm.js +11 -11
  162. package/dist/cjs/internal/stm/stm.js.map +1 -1
  163. package/dist/cjs/internal/stm/tMap.js +3 -3
  164. package/dist/cjs/internal/stm/tMap.js.map +1 -1
  165. package/dist/cjs/internal/stm/tPriorityQueue.js +11 -11
  166. package/dist/cjs/internal/stm/tPriorityQueue.js.map +1 -1
  167. package/dist/cjs/internal/stm/tPubSub.js +3 -3
  168. package/dist/cjs/internal/stm/tPubSub.js.map +1 -1
  169. package/dist/cjs/internal/stm/tQueue.js +3 -3
  170. package/dist/cjs/internal/stm/tQueue.js.map +1 -1
  171. package/dist/cjs/internal/stm/tSet.js +1 -1
  172. package/dist/cjs/internal/stm/tSet.js.map +1 -1
  173. package/dist/cjs/internal/stream/haltStrategy.js +5 -5
  174. package/dist/cjs/internal/stream/haltStrategy.js.map +1 -1
  175. package/dist/cjs/internal/stream.js +84 -85
  176. package/dist/cjs/internal/stream.js.map +1 -1
  177. package/dist/cjs/internal/supervisor.js +1 -1
  178. package/dist/cjs/internal/supervisor.js.map +1 -1
  179. package/dist/cjs/internal/take.js +1 -1
  180. package/dist/cjs/internal/take.js.map +1 -1
  181. package/dist/cjs/internal/tracer.js.map +1 -1
  182. package/dist/cjs/internal/trie.js.map +1 -1
  183. package/dist/cjs/internal/version.js +1 -1
  184. package/dist/cjs/internal/version.js.map +1 -1
  185. package/dist/dts/{ReadonlyArray.d.ts → Array.d.ts} +42 -18
  186. package/dist/dts/Array.d.ts.map +1 -0
  187. package/dist/dts/BigDecimal.d.ts.map +1 -1
  188. package/dist/dts/BigInt.d.ts.map +1 -1
  189. package/dist/dts/Brand.d.ts +1 -19
  190. package/dist/dts/Brand.d.ts.map +1 -1
  191. package/dist/dts/Cache.d.ts +10 -10
  192. package/dist/dts/Cache.d.ts.map +1 -1
  193. package/dist/dts/Cause.d.ts +1 -1
  194. package/dist/dts/Cause.d.ts.map +1 -1
  195. package/dist/dts/Channel.d.ts +6 -4
  196. package/dist/dts/Channel.d.ts.map +1 -1
  197. package/dist/dts/Chunk.d.ts +1 -4
  198. package/dist/dts/Chunk.d.ts.map +1 -1
  199. package/dist/dts/ConfigError.d.ts +7 -6
  200. package/dist/dts/ConfigError.d.ts.map +1 -1
  201. package/dist/dts/Cron.d.ts +0 -5
  202. package/dist/dts/Cron.d.ts.map +1 -1
  203. package/dist/dts/Duration.d.ts.map +1 -1
  204. package/dist/dts/Effect.d.ts +38 -33
  205. package/dist/dts/Effect.d.ts.map +1 -1
  206. package/dist/dts/Either.d.ts +5 -2
  207. package/dist/dts/Either.d.ts.map +1 -1
  208. package/dist/dts/Encoding.d.ts.map +1 -1
  209. package/dist/dts/Equivalence.d.ts.map +1 -1
  210. package/dist/dts/ExecutionStrategy.d.ts +10 -2
  211. package/dist/dts/ExecutionStrategy.d.ts.map +1 -1
  212. package/dist/dts/Exit.d.ts +4 -3
  213. package/dist/dts/Exit.d.ts.map +1 -1
  214. package/dist/dts/Fiber.d.ts +4 -2
  215. package/dist/dts/Fiber.d.ts.map +1 -1
  216. package/dist/dts/FiberHandle.d.ts +189 -0
  217. package/dist/dts/FiberHandle.d.ts.map +1 -0
  218. package/dist/dts/FiberMap.d.ts +48 -12
  219. package/dist/dts/FiberMap.d.ts.map +1 -1
  220. package/dist/dts/FiberRefs.d.ts +1 -1
  221. package/dist/dts/FiberRefs.d.ts.map +1 -1
  222. package/dist/dts/FiberSet.d.ts +9 -5
  223. package/dist/dts/FiberSet.d.ts.map +1 -1
  224. package/dist/dts/Function.d.ts.map +1 -1
  225. package/dist/dts/GroupBy.d.ts +1 -1
  226. package/dist/dts/GroupBy.d.ts.map +1 -1
  227. package/dist/dts/HashMap.d.ts +0 -1
  228. package/dist/dts/HashMap.d.ts.map +1 -1
  229. package/dist/dts/HashSet.d.ts +0 -1
  230. package/dist/dts/HashSet.d.ts.map +1 -1
  231. package/dist/dts/Iterable.d.ts +12 -5
  232. package/dist/dts/Iterable.d.ts.map +1 -1
  233. package/dist/dts/Layer.d.ts +6 -6
  234. package/dist/dts/Layer.d.ts.map +1 -1
  235. package/dist/dts/List.d.ts +0 -11
  236. package/dist/dts/List.d.ts.map +1 -1
  237. package/dist/dts/Logger.d.ts +2 -2
  238. package/dist/dts/Logger.d.ts.map +1 -1
  239. package/dist/dts/Metric.d.ts +7 -2
  240. package/dist/dts/Metric.d.ts.map +1 -1
  241. package/dist/dts/MetricKey.d.ts +4 -1
  242. package/dist/dts/MetricKey.d.ts.map +1 -1
  243. package/dist/dts/MetricKeyType.d.ts +4 -1
  244. package/dist/dts/MetricKeyType.d.ts.map +1 -1
  245. package/dist/dts/MutableHashMap.d.ts.map +1 -1
  246. package/dist/dts/Option.d.ts +5 -3
  247. package/dist/dts/Option.d.ts.map +1 -1
  248. package/dist/dts/Order.d.ts.map +1 -1
  249. package/dist/dts/{ReadonlyRecord.d.ts → Record.d.ts} +29 -30
  250. package/dist/dts/Record.d.ts.map +1 -0
  251. package/dist/dts/Request.d.ts +1 -1
  252. package/dist/dts/Request.d.ts.map +1 -1
  253. package/dist/dts/RequestResolver.d.ts +2 -2
  254. package/dist/dts/RequestResolver.d.ts.map +1 -1
  255. package/dist/dts/STM.d.ts +6 -4
  256. package/dist/dts/STM.d.ts.map +1 -1
  257. package/dist/dts/Schedule.d.ts +1 -1
  258. package/dist/dts/Scheduler.d.ts.map +1 -1
  259. package/dist/dts/ScopedCache.d.ts +9 -9
  260. package/dist/dts/ScopedCache.d.ts.map +1 -1
  261. package/dist/dts/SortedMap.d.ts.map +1 -1
  262. package/dist/dts/SortedSet.d.ts +1 -1
  263. package/dist/dts/SortedSet.d.ts.map +1 -1
  264. package/dist/dts/Stream.d.ts +8 -6
  265. package/dist/dts/Stream.d.ts.map +1 -1
  266. package/dist/dts/StreamHaltStrategy.d.ts +14 -2
  267. package/dist/dts/StreamHaltStrategy.d.ts.map +1 -1
  268. package/dist/dts/String.d.ts +25 -1
  269. package/dist/dts/String.d.ts.map +1 -1
  270. package/dist/dts/Subscribable.d.ts.map +1 -1
  271. package/dist/dts/TestAnnotation.d.ts.map +1 -1
  272. package/dist/dts/TestAnnotationMap.d.ts.map +1 -1
  273. package/dist/dts/TestAnnotations.d.ts +0 -3
  274. package/dist/dts/TestAnnotations.d.ts.map +1 -1
  275. package/dist/dts/TestClock.d.ts.map +1 -1
  276. package/dist/dts/TestLive.d.ts.map +1 -1
  277. package/dist/dts/TestServices.d.ts.map +1 -1
  278. package/dist/dts/TestSized.d.ts.map +1 -1
  279. package/dist/dts/Tracer.d.ts +12 -5
  280. package/dist/dts/Tracer.d.ts.map +1 -1
  281. package/dist/dts/Trie.d.ts +1 -1
  282. package/dist/dts/Trie.d.ts.map +1 -1
  283. package/dist/dts/Types.d.ts +0 -7
  284. package/dist/dts/Types.d.ts.map +1 -1
  285. package/dist/dts/index.d.ts +11 -7
  286. package/dist/dts/index.d.ts.map +1 -1
  287. package/dist/dts/internal/array.d.ts +5 -0
  288. package/dist/dts/internal/array.d.ts.map +1 -0
  289. package/dist/dts/internal/core-stream.d.ts +4 -0
  290. package/dist/dts/internal/core-stream.d.ts.map +1 -1
  291. package/dist/dts/internal/core.d.ts +3 -1
  292. package/dist/dts/internal/core.d.ts.map +1 -1
  293. package/dist/dts/internal/fiber.d.ts +5 -1
  294. package/dist/dts/internal/fiber.d.ts.map +1 -1
  295. package/dist/dts/internal/hashMap.d.ts.map +1 -1
  296. package/dist/dts/internal/logger.d.ts.map +1 -1
  297. package/dist/dts/internal/metric/keyType.d.ts +3 -1
  298. package/dist/dts/internal/metric/keyType.d.ts.map +1 -1
  299. package/dist/dts/internal/metric/state.d.ts.map +1 -1
  300. package/dist/dts/internal/random.d.ts.map +1 -1
  301. package/dist/dts/internal/runtimeFlags.d.ts.map +1 -1
  302. package/dist/dts/internal/stm/stm/tExit.d.ts +4 -1
  303. package/dist/dts/internal/stm/stm/tExit.d.ts.map +1 -1
  304. package/dist/dts/internal/stm/stm.d.ts +3 -0
  305. package/dist/dts/internal/stm/stm.d.ts.map +1 -1
  306. package/dist/dts/internal/stream.d.ts +5 -1
  307. package/dist/dts/internal/stream.d.ts.map +1 -1
  308. package/dist/esm/{ReadonlyArray.js → Array.js} +42 -20
  309. package/dist/esm/Array.js.map +1 -0
  310. package/dist/esm/Brand.js +2 -2
  311. package/dist/esm/Brand.js.map +1 -1
  312. package/dist/esm/Channel.js +4 -2
  313. package/dist/esm/Channel.js.map +1 -1
  314. package/dist/esm/Chunk.js +4 -1
  315. package/dist/esm/Chunk.js.map +1 -1
  316. package/dist/esm/ConfigError.js.map +1 -1
  317. package/dist/esm/Cron.js +13 -13
  318. package/dist/esm/Cron.js.map +1 -1
  319. package/dist/esm/Effect.js +11 -2
  320. package/dist/esm/Effect.js.map +1 -1
  321. package/dist/esm/Either.js +4 -1
  322. package/dist/esm/Either.js.map +1 -1
  323. package/dist/esm/ExecutionStrategy.js.map +1 -1
  324. package/dist/esm/Exit.js +4 -2
  325. package/dist/esm/Exit.js.map +1 -1
  326. package/dist/esm/Fiber.js +3 -1
  327. package/dist/esm/Fiber.js.map +1 -1
  328. package/dist/esm/FiberHandle.js +265 -0
  329. package/dist/esm/FiberHandle.js.map +1 -0
  330. package/dist/esm/FiberMap.js +103 -26
  331. package/dist/esm/FiberMap.js.map +1 -1
  332. package/dist/esm/FiberRefs.js.map +1 -1
  333. package/dist/esm/FiberSet.js +51 -15
  334. package/dist/esm/FiberSet.js.map +1 -1
  335. package/dist/esm/HashMap.js.map +1 -1
  336. package/dist/esm/HashSet.js.map +1 -1
  337. package/dist/esm/Iterable.js +39 -4
  338. package/dist/esm/Iterable.js.map +1 -1
  339. package/dist/esm/Layer.js.map +1 -1
  340. package/dist/esm/List.js +3 -3
  341. package/dist/esm/List.js.map +1 -1
  342. package/dist/esm/Metric.js +3 -1
  343. package/dist/esm/Metric.js.map +1 -1
  344. package/dist/esm/MetricKey.js.map +1 -1
  345. package/dist/esm/MetricKeyType.js.map +1 -1
  346. package/dist/esm/MutableHashMap.js +0 -3
  347. package/dist/esm/MutableHashMap.js.map +1 -1
  348. package/dist/esm/Option.js +4 -2
  349. package/dist/esm/Option.js.map +1 -1
  350. package/dist/esm/{ReadonlyRecord.js → Record.js} +29 -29
  351. package/dist/esm/Record.js.map +1 -0
  352. package/dist/esm/STM.js +5 -3
  353. package/dist/esm/STM.js.map +1 -1
  354. package/dist/esm/Schedule.js +1 -1
  355. package/dist/esm/Schedule.js.map +1 -1
  356. package/dist/esm/ScopedCache.js.map +1 -1
  357. package/dist/esm/Stream.js +5 -3
  358. package/dist/esm/Stream.js.map +1 -1
  359. package/dist/esm/StreamHaltStrategy.js +2 -0
  360. package/dist/esm/StreamHaltStrategy.js.map +1 -1
  361. package/dist/esm/String.js +37 -1
  362. package/dist/esm/String.js.map +1 -1
  363. package/dist/esm/TestAnnotations.js +1 -1
  364. package/dist/esm/TestAnnotations.js.map +1 -1
  365. package/dist/esm/TestClock.js +3 -3
  366. package/dist/esm/TestClock.js.map +1 -1
  367. package/dist/esm/Tracer.js.map +1 -1
  368. package/dist/esm/index.js +11 -7
  369. package/dist/esm/index.js.map +1 -1
  370. package/dist/esm/internal/{readonlyArray.js → array.js} +1 -1
  371. package/dist/esm/internal/array.js.map +1 -0
  372. package/dist/esm/internal/cache.js +3 -3
  373. package/dist/esm/internal/cache.js.map +1 -1
  374. package/dist/esm/internal/cause.js +3 -3
  375. package/dist/esm/internal/cause.js.map +1 -1
  376. package/dist/esm/internal/channel/channelExecutor.js +15 -15
  377. package/dist/esm/internal/channel/channelExecutor.js.map +1 -1
  378. package/dist/esm/internal/channel/channelState.js +1 -1
  379. package/dist/esm/internal/channel/channelState.js.map +1 -1
  380. package/dist/esm/internal/channel/singleProducerAsyncInput.js +1 -1
  381. package/dist/esm/internal/channel/singleProducerAsyncInput.js.map +1 -1
  382. package/dist/esm/internal/channel.js +8 -8
  383. package/dist/esm/internal/channel.js.map +1 -1
  384. package/dist/esm/internal/clock.js +2 -2
  385. package/dist/esm/internal/clock.js.map +1 -1
  386. package/dist/esm/internal/configError.js +20 -19
  387. package/dist/esm/internal/configError.js.map +1 -1
  388. package/dist/esm/internal/configProvider/pathPatch.js +1 -1
  389. package/dist/esm/internal/configProvider/pathPatch.js.map +1 -1
  390. package/dist/esm/internal/configProvider.js +47 -48
  391. package/dist/esm/internal/configProvider.js.map +1 -1
  392. package/dist/esm/internal/core-effect.js +39 -26
  393. package/dist/esm/internal/core-effect.js.map +1 -1
  394. package/dist/esm/internal/core-stream.js +3 -2
  395. package/dist/esm/internal/core-stream.js.map +1 -1
  396. package/dist/esm/internal/core.js +24 -26
  397. package/dist/esm/internal/core.js.map +1 -1
  398. package/dist/esm/internal/dataSource.js +19 -2
  399. package/dist/esm/internal/dataSource.js.map +1 -1
  400. package/dist/esm/internal/differ/readonlyArrayPatch.js +6 -6
  401. package/dist/esm/internal/differ/readonlyArrayPatch.js.map +1 -1
  402. package/dist/esm/internal/effect/circular.js +1 -1
  403. package/dist/esm/internal/effect/circular.js.map +1 -1
  404. package/dist/esm/internal/executionStrategy.js +4 -4
  405. package/dist/esm/internal/executionStrategy.js.map +1 -1
  406. package/dist/esm/internal/fiber.js +6 -5
  407. package/dist/esm/internal/fiber.js.map +1 -1
  408. package/dist/esm/internal/fiberRefs/patch.js +1 -1
  409. package/dist/esm/internal/fiberRefs/patch.js.map +1 -1
  410. package/dist/esm/internal/fiberRefs.js +1 -1
  411. package/dist/esm/internal/fiberRefs.js.map +1 -1
  412. package/dist/esm/internal/fiberRuntime.js +33 -33
  413. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  414. package/dist/esm/internal/groupBy.js +3 -3
  415. package/dist/esm/internal/groupBy.js.map +1 -1
  416. package/dist/esm/internal/hashMap.js.map +1 -1
  417. package/dist/esm/internal/hashSet.js.map +1 -1
  418. package/dist/esm/internal/layer/circular.js.map +1 -1
  419. package/dist/esm/internal/layer.js +5 -5
  420. package/dist/esm/internal/layer.js.map +1 -1
  421. package/dist/esm/internal/logger.js +28 -8
  422. package/dist/esm/internal/logger.js.map +1 -1
  423. package/dist/esm/internal/managedRuntime.js +1 -1
  424. package/dist/esm/internal/managedRuntime.js.map +1 -1
  425. package/dist/esm/internal/metric/boundaries.js +4 -4
  426. package/dist/esm/internal/metric/boundaries.js.map +1 -1
  427. package/dist/esm/internal/metric/hook.js +20 -17
  428. package/dist/esm/internal/metric/hook.js.map +1 -1
  429. package/dist/esm/internal/metric/key.js +4 -4
  430. package/dist/esm/internal/metric/key.js.map +1 -1
  431. package/dist/esm/internal/metric/keyType.js +5 -1
  432. package/dist/esm/internal/metric/keyType.js.map +1 -1
  433. package/dist/esm/internal/metric/state.js +4 -4
  434. package/dist/esm/internal/metric/state.js.map +1 -1
  435. package/dist/esm/internal/metric.js +4 -4
  436. package/dist/esm/internal/metric.js.map +1 -1
  437. package/dist/esm/internal/pool.js +11 -11
  438. package/dist/esm/internal/pool.js.map +1 -1
  439. package/dist/esm/internal/pubsub.js +5 -5
  440. package/dist/esm/internal/pubsub.js.map +1 -1
  441. package/dist/esm/internal/query.js +2 -2
  442. package/dist/esm/internal/query.js.map +1 -1
  443. package/dist/esm/internal/queue.js +9 -9
  444. package/dist/esm/internal/queue.js.map +1 -1
  445. package/dist/esm/internal/rateLimiter.js +1 -1
  446. package/dist/esm/internal/rateLimiter.js.map +1 -1
  447. package/dist/esm/internal/redBlackTree/iterator.js +2 -2
  448. package/dist/esm/internal/redBlackTree/iterator.js.map +1 -1
  449. package/dist/esm/internal/reloadable.js +1 -1
  450. package/dist/esm/internal/reloadable.js.map +1 -1
  451. package/dist/esm/internal/runtime.js +4 -4
  452. package/dist/esm/internal/runtime.js.map +1 -1
  453. package/dist/esm/internal/schedule.js +3 -3
  454. package/dist/esm/internal/schedule.js.map +1 -1
  455. package/dist/esm/internal/scopedCache.js +7 -7
  456. package/dist/esm/internal/scopedCache.js.map +1 -1
  457. package/dist/esm/internal/scopedRef.js +4 -4
  458. package/dist/esm/internal/scopedRef.js.map +1 -1
  459. package/dist/esm/internal/secret.js +2 -2
  460. package/dist/esm/internal/secret.js.map +1 -1
  461. package/dist/esm/internal/sink.js +10 -10
  462. package/dist/esm/internal/sink.js.map +1 -1
  463. package/dist/esm/internal/stm/stm/tExit.js +3 -2
  464. package/dist/esm/internal/stm/stm/tExit.js.map +1 -1
  465. package/dist/esm/internal/stm/stm.js +11 -9
  466. package/dist/esm/internal/stm/stm.js.map +1 -1
  467. package/dist/esm/internal/stm/tMap.js +3 -3
  468. package/dist/esm/internal/stm/tMap.js.map +1 -1
  469. package/dist/esm/internal/stm/tPriorityQueue.js +11 -11
  470. package/dist/esm/internal/stm/tPriorityQueue.js.map +1 -1
  471. package/dist/esm/internal/stm/tPubSub.js +3 -3
  472. package/dist/esm/internal/stm/tPubSub.js.map +1 -1
  473. package/dist/esm/internal/stm/tQueue.js +3 -3
  474. package/dist/esm/internal/stm/tQueue.js.map +1 -1
  475. package/dist/esm/internal/stm/tSet.js +1 -1
  476. package/dist/esm/internal/stm/tSet.js.map +1 -1
  477. package/dist/esm/internal/stream/haltStrategy.js +5 -5
  478. package/dist/esm/internal/stream/haltStrategy.js.map +1 -1
  479. package/dist/esm/internal/stream.js +85 -84
  480. package/dist/esm/internal/stream.js.map +1 -1
  481. package/dist/esm/internal/supervisor.js +1 -1
  482. package/dist/esm/internal/supervisor.js.map +1 -1
  483. package/dist/esm/internal/take.js +1 -1
  484. package/dist/esm/internal/take.js.map +1 -1
  485. package/dist/esm/internal/tracer.js.map +1 -1
  486. package/dist/esm/internal/trie.js.map +1 -1
  487. package/dist/esm/internal/version.js +1 -1
  488. package/dist/esm/internal/version.js.map +1 -1
  489. package/package.json +23 -15
  490. package/src/{ReadonlyArray.ts → Array.ts} +50 -24
  491. package/src/Brand.ts +3 -3
  492. package/src/Cache.ts +12 -10
  493. package/src/Cause.ts +1 -1
  494. package/src/Channel.ts +12 -9
  495. package/src/Chunk.ts +3 -3
  496. package/src/ConfigError.ts +7 -6
  497. package/src/Cron.ts +17 -17
  498. package/src/Effect.ts +46 -57
  499. package/src/Either.ts +7 -7
  500. package/src/ExecutionStrategy.ts +10 -2
  501. package/src/Exit.ts +11 -9
  502. package/src/Fiber.ts +11 -8
  503. package/src/FiberHandle.ts +433 -0
  504. package/src/FiberMap.ts +200 -73
  505. package/src/FiberRefs.ts +1 -1
  506. package/src/FiberSet.ts +96 -36
  507. package/src/GroupBy.ts +1 -1
  508. package/src/HashMap.ts +0 -1
  509. package/src/HashSet.ts +0 -1
  510. package/src/Iterable.ts +48 -10
  511. package/src/Layer.ts +6 -6
  512. package/src/List.ts +3 -4
  513. package/src/Logger.ts +2 -2
  514. package/src/Metric.ts +9 -2
  515. package/src/MetricKey.ts +9 -1
  516. package/src/MetricKeyType.ts +6 -1
  517. package/src/MutableHashMap.ts +1 -1
  518. package/src/Option.ts +9 -6
  519. package/src/{ReadonlyRecord.ts → Record.ts} +28 -29
  520. package/src/Request.ts +1 -1
  521. package/src/RequestResolver.ts +4 -4
  522. package/src/STM.ts +12 -9
  523. package/src/Schedule.ts +1 -1
  524. package/src/ScopedCache.ts +11 -9
  525. package/src/SortedSet.ts +1 -1
  526. package/src/Stream.ts +14 -11
  527. package/src/StreamHaltStrategy.ts +14 -2
  528. package/src/String.ts +45 -2
  529. package/src/TestAnnotations.ts +1 -1
  530. package/src/TestClock.ts +3 -3
  531. package/src/Tracer.ts +13 -5
  532. package/src/Trie.ts +1 -1
  533. package/src/Types.ts +0 -8
  534. package/src/index.ts +13 -8
  535. package/src/internal/{readonlyArray.ts → array.ts} +1 -1
  536. package/src/internal/cache.ts +40 -40
  537. package/src/internal/cause.ts +5 -6
  538. package/src/internal/channel/channelExecutor.ts +15 -15
  539. package/src/internal/channel/channelState.ts +1 -1
  540. package/src/internal/channel/singleProducerAsyncInput.ts +1 -1
  541. package/src/internal/channel.ts +11 -11
  542. package/src/internal/clock.ts +2 -2
  543. package/src/internal/configError.ts +22 -21
  544. package/src/internal/configProvider/pathPatch.ts +1 -1
  545. package/src/internal/configProvider.ts +50 -53
  546. package/src/internal/core-effect.ts +73 -70
  547. package/src/internal/core-stream.ts +5 -2
  548. package/src/internal/core.ts +51 -50
  549. package/src/internal/dataSource.ts +19 -20
  550. package/src/internal/differ/readonlyArrayPatch.ts +6 -6
  551. package/src/internal/effect/circular.ts +2 -2
  552. package/src/internal/executionStrategy.ts +14 -12
  553. package/src/internal/fiber.ts +8 -5
  554. package/src/internal/fiberRefs/patch.ts +1 -1
  555. package/src/internal/fiberRefs.ts +1 -1
  556. package/src/internal/fiberRuntime.ts +45 -45
  557. package/src/internal/groupBy.ts +4 -4
  558. package/src/internal/hashMap.ts +0 -1
  559. package/src/internal/hashSet.ts +0 -1
  560. package/src/internal/layer/circular.ts +2 -2
  561. package/src/internal/layer.ts +9 -9
  562. package/src/internal/logger.ts +28 -8
  563. package/src/internal/managedRuntime.ts +1 -1
  564. package/src/internal/metric/boundaries.ts +5 -5
  565. package/src/internal/metric/hook.ts +21 -18
  566. package/src/internal/metric/key.ts +8 -5
  567. package/src/internal/metric/keyType.ts +5 -2
  568. package/src/internal/metric/state.ts +5 -5
  569. package/src/internal/metric.ts +8 -6
  570. package/src/internal/pool.ts +11 -11
  571. package/src/internal/pubsub.ts +6 -6
  572. package/src/internal/query.ts +4 -4
  573. package/src/internal/queue.ts +11 -11
  574. package/src/internal/rateLimiter.ts +1 -1
  575. package/src/internal/redBlackTree/iterator.ts +2 -2
  576. package/src/internal/reloadable.ts +1 -1
  577. package/src/internal/runtime.ts +5 -5
  578. package/src/internal/schedule.ts +8 -9
  579. package/src/internal/scopedCache.ts +53 -53
  580. package/src/internal/scopedRef.ts +4 -4
  581. package/src/internal/secret.ts +2 -2
  582. package/src/internal/sink.ts +10 -10
  583. package/src/internal/stm/stm/tExit.ts +5 -2
  584. package/src/internal/stm/stm.ts +13 -9
  585. package/src/internal/stm/tMap.ts +3 -3
  586. package/src/internal/stm/tPriorityQueue.ts +11 -11
  587. package/src/internal/stm/tPubSub.ts +3 -3
  588. package/src/internal/stm/tQueue.ts +3 -3
  589. package/src/internal/stm/tSet.ts +1 -1
  590. package/src/internal/stream/haltStrategy.ts +23 -14
  591. package/src/internal/stream.ts +91 -88
  592. package/src/internal/supervisor.ts +1 -1
  593. package/src/internal/take.ts +1 -1
  594. package/src/internal/tracer.ts +2 -2
  595. package/src/internal/trie.ts +0 -1
  596. package/src/internal/version.ts +1 -1
  597. package/ReadonlyArray/package.json +0 -6
  598. package/ReadonlyRecord/package.json +0 -6
  599. package/dist/cjs/ReadonlyArray.js.map +0 -1
  600. package/dist/cjs/ReadonlyRecord.js.map +0 -1
  601. package/dist/cjs/internal/Iterable.js +0 -61
  602. package/dist/cjs/internal/Iterable.js.map +0 -1
  603. package/dist/cjs/internal/readonlyArray.js.map +0 -1
  604. package/dist/dts/ReadonlyArray.d.ts.map +0 -1
  605. package/dist/dts/ReadonlyRecord.d.ts.map +0 -1
  606. package/dist/dts/internal/Iterable.d.ts +0 -2
  607. package/dist/dts/internal/Iterable.d.ts.map +0 -1
  608. package/dist/dts/internal/readonlyArray.d.ts +0 -5
  609. package/dist/dts/internal/readonlyArray.d.ts.map +0 -1
  610. package/dist/esm/ReadonlyArray.js.map +0 -1
  611. package/dist/esm/ReadonlyRecord.js.map +0 -1
  612. package/dist/esm/internal/Iterable.js +0 -53
  613. package/dist/esm/internal/Iterable.js.map +0 -1
  614. package/dist/esm/internal/readonlyArray.js.map +0 -1
  615. package/src/internal/Iterable.ts +0 -54
package/src/FiberMap.ts CHANGED
@@ -13,6 +13,7 @@ import * as FiberRef from "./FiberRef.js"
13
13
  import { dual } from "./Function.js"
14
14
  import * as Inspectable from "./Inspectable.js"
15
15
  import type { FiberRuntime } from "./internal/fiberRuntime.js"
16
+ import * as Iterable from "./Iterable.js"
16
17
  import * as MutableHashMap from "./MutableHashMap.js"
17
18
  import * as Option from "./Option.js"
18
19
  import { type Pipeable, pipeArguments } from "./Pipeable.js"
@@ -39,8 +40,14 @@ export interface FiberMap<in out K, out A = unknown, out E = unknown>
39
40
  extends Pipeable, Inspectable.Inspectable, Iterable<[K, Fiber.RuntimeFiber<A, E>]>
40
41
  {
41
42
  readonly [TypeId]: TypeId
42
- readonly backing: MutableHashMap.MutableHashMap<K, Fiber.RuntimeFiber<A, E>>
43
- readonly deferred: Deferred.Deferred<never, unknown>
43
+ readonly deferred: Deferred.Deferred<void, unknown>
44
+ /** @internal */
45
+ state: {
46
+ readonly _tag: "Open"
47
+ readonly backing: MutableHashMap.MutableHashMap<K, Fiber.RuntimeFiber<A, E>>
48
+ } | {
49
+ readonly _tag: "Closed"
50
+ }
44
51
  }
45
52
 
46
53
  /**
@@ -52,7 +59,10 @@ export const isFiberMap = (u: unknown): u is FiberMap<unknown> => Predicate.hasP
52
59
  const Proto = {
53
60
  [TypeId]: TypeId,
54
61
  [Symbol.iterator](this: FiberMap<unknown>) {
55
- return this.backing[Symbol.iterator]()
62
+ if (this.state._tag === "Closed") {
63
+ return Iterable.empty()
64
+ }
65
+ return this.state.backing[Symbol.iterator]()
56
66
  },
57
67
  toString(this: FiberMap<unknown>) {
58
68
  return Inspectable.format(this.toJSON())
@@ -60,7 +70,7 @@ const Proto = {
60
70
  toJSON(this: FiberMap<unknown>) {
61
71
  return {
62
72
  _id: "FiberMap",
63
- backing: this.backing.toJSON()
73
+ state: this.state
64
74
  }
65
75
  },
66
76
  [Inspectable.NodeInspectSymbol](this: FiberMap<unknown>) {
@@ -73,10 +83,10 @@ const Proto = {
73
83
 
74
84
  const unsafeMake = <K, A = unknown, E = unknown>(
75
85
  backing: MutableHashMap.MutableHashMap<K, Fiber.RuntimeFiber<A, E>>,
76
- deferred: Deferred.Deferred<never, E>
86
+ deferred: Deferred.Deferred<void, E>
77
87
  ): FiberMap<K, A, E> => {
78
88
  const self = Object.create(Proto)
79
- self.backing = backing
89
+ self.state = { _tag: "Open", backing }
80
90
  self.deferred = deferred
81
91
  return self
82
92
  }
@@ -108,12 +118,19 @@ const unsafeMake = <K, A = unknown, E = unknown>(
108
118
  */
109
119
  export const make = <K, A = unknown, E = unknown>(): Effect.Effect<FiberMap<K, A, E>, never, Scope.Scope> =>
110
120
  Effect.acquireRelease(
111
- Effect.map(Deferred.make<never, E>(), (deferred) =>
121
+ Effect.map(Deferred.make<void, E>(), (deferred) =>
112
122
  unsafeMake<K, A, E>(
113
123
  MutableHashMap.empty(),
114
124
  deferred
115
125
  )),
116
- clear
126
+ (map) =>
127
+ Effect.zipRight(
128
+ clear(map),
129
+ Effect.suspend(() => {
130
+ map.state = { _tag: "Closed" }
131
+ return Deferred.done(map.deferred, Exit.void)
132
+ })
133
+ )
117
134
  )
118
135
 
119
136
  /**
@@ -126,7 +143,11 @@ export const makeRuntime = <R, K, E = unknown, A = unknown>(): Effect.Effect<
126
143
  <XE extends E, XA extends A>(
127
144
  key: K,
128
145
  effect: Effect.Effect<XA, XE, R>,
129
- options?: Runtime.RunForkOptions | undefined
146
+ options?:
147
+ | Runtime.RunForkOptions & {
148
+ readonly onlyIfMissing?: boolean | undefined
149
+ }
150
+ | undefined
130
151
  ) => Fiber.RuntimeFiber<XA, XE>,
131
152
  never,
132
153
  Scope.Scope | R
@@ -147,41 +168,54 @@ export const unsafeSet: {
147
168
  <K, A, E, XE extends E, XA extends A>(
148
169
  key: K,
149
170
  fiber: Fiber.RuntimeFiber<XA, XE>,
150
- interruptAs?: FiberId.FiberId
171
+ options?: {
172
+ readonly interruptAs?: FiberId.FiberId | undefined
173
+ readonly onlyIfMissing?: boolean | undefined
174
+ } | undefined
151
175
  ): (self: FiberMap<K, A, E>) => void
152
176
  <K, A, E, XE extends E, XA extends A>(
153
177
  self: FiberMap<K, A, E>,
154
178
  key: K,
155
179
  fiber: Fiber.RuntimeFiber<XA, XE>,
156
- interruptAs?: FiberId.FiberId
180
+ options?: {
181
+ readonly interruptAs?: FiberId.FiberId | undefined
182
+ readonly onlyIfMissing?: boolean | undefined
183
+ } | undefined
157
184
  ): void
158
- } = dual<
159
- <K, A, E, XE extends E, XA extends A>(
160
- key: K,
161
- fiber: Fiber.RuntimeFiber<XA, XE>,
162
- interruptAs?: FiberId.FiberId
163
- ) => (self: FiberMap<K, A, E>) => void,
164
- <K, A, E, XE extends E, XA extends A>(
165
- self: FiberMap<K, A, E>,
166
- key: K,
167
- fiber: Fiber.RuntimeFiber<XA, XE>,
168
- interruptAs?: FiberId.FiberId
169
- ) => void
170
- >((args) => isFiberMap(args[0]), (self, key, fiber, interruptAs) => {
171
- const previous = MutableHashMap.get(self.backing, key)
185
+ } = dual((args) => isFiberMap(args[0]), <K, A, E, XE extends E, XA extends A>(
186
+ self: FiberMap<K, A, E>,
187
+ key: K,
188
+ fiber: Fiber.RuntimeFiber<XA, XE>,
189
+ options?: {
190
+ readonly interruptAs?: FiberId.FiberId | undefined
191
+ readonly onlyIfMissing?: boolean | undefined
192
+ } | undefined
193
+ ): void => {
194
+ if (self.state._tag === "Closed") {
195
+ fiber.unsafeInterruptAsFork(options?.interruptAs ?? FiberId.none)
196
+ return
197
+ }
198
+
199
+ const previous = MutableHashMap.get(self.state.backing, key)
172
200
  if (previous._tag === "Some") {
173
- if (previous.value === fiber) {
201
+ if (options?.onlyIfMissing === true) {
202
+ fiber.unsafeInterruptAsFork(options?.interruptAs ?? FiberId.none)
203
+ return
204
+ } else if (previous.value === fiber) {
174
205
  return
175
206
  }
176
- previous.value.unsafeInterruptAsFork(interruptAs ?? FiberId.none)
207
+ previous.value.unsafeInterruptAsFork(options?.interruptAs ?? FiberId.none)
177
208
  }
178
209
 
179
210
  ;(fiber as FiberRuntime<unknown, unknown>).setFiberRef(FiberRef.unhandledErrorLogLevel, Option.none())
180
- MutableHashMap.set(self.backing, key, fiber)
211
+ MutableHashMap.set(self.state.backing, key, fiber)
181
212
  fiber.addObserver((exit) => {
182
- const current = MutableHashMap.get(self.backing, key)
213
+ if (self.state._tag === "Closed") {
214
+ return
215
+ }
216
+ const current = MutableHashMap.get(self.state.backing, key)
183
217
  if (Option.isSome(current) && fiber === current.value) {
184
- MutableHashMap.remove(self.backing, key)
218
+ MutableHashMap.remove(self.state.backing, key)
185
219
  }
186
220
  if (Exit.isFailure(exit) && !Cause.isInterruptedOnly(exit.cause)) {
187
221
  Deferred.unsafeDone(self.deferred, exit as any)
@@ -199,26 +233,35 @@ export const unsafeSet: {
199
233
  export const set: {
200
234
  <K, A, E, XE extends E, XA extends A>(
201
235
  key: K,
202
- fiber: Fiber.RuntimeFiber<XA, XE>
236
+ fiber: Fiber.RuntimeFiber<XA, XE>,
237
+ options?: {
238
+ readonly onlyIfMissing?: boolean | undefined
239
+ } | undefined
203
240
  ): (self: FiberMap<K, A, E>) => Effect.Effect<void>
204
241
  <K, A, E, XE extends E, XA extends A>(
205
242
  self: FiberMap<K, A, E>,
206
243
  key: K,
207
- fiber: Fiber.RuntimeFiber<XA, XE>
244
+ fiber: Fiber.RuntimeFiber<XA, XE>,
245
+ options?: {
246
+ readonly onlyIfMissing?: boolean | undefined
247
+ } | undefined
208
248
  ): Effect.Effect<void>
209
- } = dual<
210
- <K, A, E, XE extends E, XA extends A>(
211
- key: K,
212
- fiber: Fiber.RuntimeFiber<XA, XE>
213
- ) => (self: FiberMap<K, A, E>) => Effect.Effect<void>,
214
- <K, A, E, XE extends E, XA extends A>(
215
- self: FiberMap<K, A, E>,
216
- key: K,
217
- fiber: Fiber.RuntimeFiber<XA, XE>
218
- ) => Effect.Effect<void>
219
- >(3, (self, key, fiber) =>
249
+ } = dual((args) => isFiberMap(args[0]), <K, A, E, XE extends E, XA extends A>(
250
+ self: FiberMap<K, A, E>,
251
+ key: K,
252
+ fiber: Fiber.RuntimeFiber<XA, XE>,
253
+ options?: {
254
+ readonly onlyIfMissing?: boolean | undefined
255
+ } | undefined
256
+ ): Effect.Effect<void> =>
220
257
  Effect.fiberIdWith(
221
- (fiberId) => Effect.sync(() => unsafeSet(self, key, fiber, fiberId))
258
+ (fiberId) =>
259
+ Effect.sync(() =>
260
+ unsafeSet(self, key, fiber, {
261
+ interruptAs: fiberId,
262
+ onlyIfMissing: options?.onlyIfMissing
263
+ })
264
+ )
222
265
  ))
223
266
 
224
267
  /**
@@ -238,7 +281,7 @@ export const unsafeGet: {
238
281
  self: FiberMap<K, A, E>,
239
282
  key: K
240
283
  ) => Option.Option<Fiber.RuntimeFiber<A, E>>
241
- >(2, (self, key) => MutableHashMap.get(self.backing, key))
284
+ >(2, (self, key) => self.state._tag === "Closed" ? Option.none() : MutableHashMap.get(self.state.backing, key))
242
285
 
243
286
  /**
244
287
  * Retrieve a fiber from the FiberMap.
@@ -257,7 +300,36 @@ export const get: {
257
300
  self: FiberMap<K, A, E>,
258
301
  key: K
259
302
  ) => Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>
260
- >(2, (self, key) => Effect.suspend(() => MutableHashMap.get(self.backing, key)))
303
+ >(2, (self, key) => Effect.suspend(() => unsafeGet(self, key)))
304
+
305
+ /**
306
+ * Check if a key exists in the FiberMap.
307
+ *
308
+ * @since 2.0.0
309
+ * @categories combinators
310
+ */
311
+ export const unsafeHas: {
312
+ <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => boolean
313
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): boolean
314
+ } = dual(
315
+ 2,
316
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): boolean =>
317
+ self.state._tag === "Closed" ? false : MutableHashMap.has(self.state.backing, key)
318
+ )
319
+
320
+ /**
321
+ * Check if a key exists in the FiberMap.
322
+ *
323
+ * @since 2.0.0
324
+ * @categories combinators
325
+ */
326
+ export const has: {
327
+ <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<boolean>
328
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<boolean>
329
+ } = dual(
330
+ 2,
331
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<boolean> => Effect.sync(() => unsafeHas(self, key))
332
+ )
261
333
 
262
334
  /**
263
335
  * Remove a fiber from the FiberMap, interrupting it if it exists.
@@ -278,11 +350,14 @@ export const remove: {
278
350
  ) => Effect.Effect<void>
279
351
  >(2, (self, key) =>
280
352
  Effect.suspend(() => {
281
- const fiber = MutableHashMap.get(self.backing, key)
353
+ if (self.state._tag === "Closed") {
354
+ return Effect.void
355
+ }
356
+ const fiber = MutableHashMap.get(self.state.backing, key)
282
357
  if (fiber._tag === "None") {
283
- return Effect.unit
358
+ return Effect.void
284
359
  }
285
- MutableHashMap.remove(self.backing, key)
360
+ // will be removed by the observer
286
361
  return Fiber.interrupt(fiber.value)
287
362
  }))
288
363
 
@@ -291,12 +366,25 @@ export const remove: {
291
366
  * @categories combinators
292
367
  */
293
368
  export const clear = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<void> =>
294
- Effect.zipRight(
295
- Effect.forEach(self.backing, ([_, fiber]) => Fiber.interrupt(fiber)),
296
- Effect.sync(() => {
297
- MutableHashMap.clear(self.backing)
298
- })
299
- )
369
+ Effect.suspend(() => {
370
+ if (self.state._tag === "Closed") {
371
+ return Effect.void
372
+ }
373
+
374
+ return Effect.forEach(self.state.backing, ([, fiber]) =>
375
+ // will be removed by the observer
376
+ Fiber.interrupt(fiber))
377
+ })
378
+
379
+ const constInterruptedFiber = (function() {
380
+ let fiber: Fiber.RuntimeFiber<never, never> | undefined = undefined
381
+ return () => {
382
+ if (fiber === undefined) {
383
+ fiber = Effect.runFork(Effect.interrupt)
384
+ }
385
+ return fiber
386
+ }
387
+ })()
300
388
 
301
389
  /**
302
390
  * Run an Effect and add the forked fiber to the FiberMap.
@@ -308,32 +396,58 @@ export const clear = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<void> =>
308
396
  export const run: {
309
397
  <K, A, E>(
310
398
  self: FiberMap<K, A, E>,
311
- key: K
399
+ key: K,
400
+ options?: {
401
+ readonly onlyIfMissing?: boolean | undefined
402
+ } | undefined
312
403
  ): <R, XE extends E, XA extends A>(
313
404
  effect: Effect.Effect<XA, XE, R>
314
405
  ) => Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R>
315
406
  <K, A, E, R, XE extends E, XA extends A>(
316
407
  self: FiberMap<K, A, E>,
317
408
  key: K,
318
- effect: Effect.Effect<XA, XE, R>
409
+ effect: Effect.Effect<XA, XE, R>,
410
+ options?: {
411
+ readonly onlyIfMissing?: boolean | undefined
412
+ } | undefined
319
413
  ): Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R>
320
414
  } = function() {
321
- if (arguments.length === 2) {
415
+ if (Effect.isEffect(arguments[2])) {
322
416
  const self = arguments[0] as FiberMap<any>
323
417
  const key = arguments[1]
324
- return (effect: Effect.Effect<any, any, any>) =>
325
- Effect.tap(
326
- Effect.forkDaemon(effect),
327
- (fiber) => set(self, key, fiber)
418
+ const effect = arguments[2] as Effect.Effect<any, any, any>
419
+ const options = arguments[3] as { readonly onlyIfMissing?: boolean } | undefined
420
+ return Effect.suspend(() => {
421
+ if (self.state._tag === "Closed") {
422
+ return Effect.interrupt
423
+ } else if (options?.onlyIfMissing === true && unsafeHas(self, key)) {
424
+ return Effect.sync(constInterruptedFiber)
425
+ }
426
+ return Effect.uninterruptibleMask((restore) =>
427
+ Effect.tap(
428
+ restore(Effect.forkDaemon(effect)),
429
+ (fiber) => set(self, key, fiber, options)
430
+ )
328
431
  )
432
+ }) as any
329
433
  }
330
434
  const self = arguments[0] as FiberMap<any>
331
435
  const key = arguments[1]
332
- const effect = arguments[2] as Effect.Effect<any, any, any>
333
- return Effect.tap(
334
- Effect.forkDaemon(effect),
335
- (fiber) => set(self, key, fiber)
336
- ) as any
436
+ const options = arguments[2] as { readonly onlyIfMissing?: boolean } | undefined
437
+ return (effect: Effect.Effect<any, any, any>) =>
438
+ Effect.suspend(() => {
439
+ if (self.state._tag === "Closed") {
440
+ return Effect.interrupt
441
+ } else if (options?.onlyIfMissing === true && unsafeHas(self, key)) {
442
+ return Effect.sync(constInterruptedFiber)
443
+ }
444
+ return Effect.uninterruptibleMask((restore) =>
445
+ Effect.tap(
446
+ restore(Effect.forkDaemon(effect)),
447
+ (fiber) => set(self, key, fiber, options)
448
+ )
449
+ )
450
+ })
337
451
  }
338
452
 
339
453
  /**
@@ -369,7 +483,11 @@ export const runtime: <K, A, E>(
369
483
  <XE extends E, XA extends A>(
370
484
  key: K,
371
485
  effect: Effect.Effect<XA, XE, R>,
372
- options?: Runtime.RunForkOptions | undefined
486
+ options?:
487
+ | Runtime.RunForkOptions & {
488
+ readonly onlyIfMissing?: boolean | undefined
489
+ }
490
+ | undefined
373
491
  ) => Fiber.RuntimeFiber<XA, XE>,
374
492
  never,
375
493
  R
@@ -381,10 +499,19 @@ export const runtime: <K, A, E>(
381
499
  return <XE extends E, XA extends A>(
382
500
  key: K,
383
501
  effect: Effect.Effect<XA, XE, R>,
384
- options?: Runtime.RunForkOptions | undefined
502
+ options?:
503
+ | Runtime.RunForkOptions & {
504
+ readonly onlyIfMissing?: boolean | undefined
505
+ }
506
+ | undefined
385
507
  ) => {
508
+ if (self.state._tag === "Closed") {
509
+ return constInterruptedFiber()
510
+ } else if (options?.onlyIfMissing === true && unsafeHas(self, key)) {
511
+ return constInterruptedFiber()
512
+ }
386
513
  const fiber = runFork(effect, options)
387
- unsafeSet(self, key, fiber)
514
+ unsafeSet(self, key, fiber, options)
388
515
  return fiber
389
516
  }
390
517
  }
@@ -395,7 +522,7 @@ export const runtime: <K, A, E>(
395
522
  * @categories combinators
396
523
  */
397
524
  export const size = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<number> =>
398
- Effect.sync(() => MutableHashMap.size(self.backing))
525
+ Effect.sync(() => self.state._tag === "Closed" ? 0 : MutableHashMap.size(self.state.backing))
399
526
 
400
527
  /**
401
528
  * Join all fibers in the FiberMap. If any of the Fiber's in the map terminate with a failure,
@@ -414,5 +541,5 @@ export const size = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<number> =>
414
541
  * yield* _(FiberMap.join(map));
415
542
  * });
416
543
  */
417
- export const join = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<never, E> =>
418
- Deferred.await(self.deferred as Deferred.Deferred<never, E>)
544
+ export const join = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<void, E> =>
545
+ Deferred.await(self.deferred as Deferred.Deferred<void, E>)
package/src/FiberRefs.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @since 2.0.0
3
3
  */
4
+ import type * as Arr from "./Array.js"
4
5
  import type * as Effect from "./Effect.js"
5
6
  import type * as FiberId from "./FiberId.js"
6
7
  import type * as FiberRef from "./FiberRef.js"
@@ -8,7 +9,6 @@ import type * as HashSet from "./HashSet.js"
8
9
  import * as internal from "./internal/fiberRefs.js"
9
10
  import type * as Option from "./Option.js"
10
11
  import type { Pipeable } from "./Pipeable.js"
11
- import type * as Arr from "./ReadonlyArray.js"
12
12
 
13
13
  /**
14
14
  * @since 2.0.0
package/src/FiberSet.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * @since 2.0.0
3
3
  */
4
4
  import * as Effect from "effect/Effect"
5
+ import * as FiberId from "effect/FiberId"
5
6
  import type * as Scope from "effect/Scope"
6
7
  import * as Cause from "./Cause.js"
7
8
  import * as Deferred from "./Deferred.js"
@@ -11,6 +12,7 @@ import * as FiberRef from "./FiberRef.js"
11
12
  import { dual } from "./Function.js"
12
13
  import * as Inspectable from "./Inspectable.js"
13
14
  import type { FiberRuntime } from "./internal/fiberRuntime.js"
15
+ import * as Iterable from "./Iterable.js"
14
16
  import * as Option from "./Option.js"
15
17
  import { type Pipeable, pipeArguments } from "./Pipeable.js"
16
18
  import * as Predicate from "./Predicate.js"
@@ -36,8 +38,14 @@ export interface FiberSet<out A = unknown, out E = unknown>
36
38
  extends Pipeable, Inspectable.Inspectable, Iterable<Fiber.RuntimeFiber<A, E>>
37
39
  {
38
40
  readonly [TypeId]: TypeId
39
- readonly backing: Set<Fiber.RuntimeFiber<A, E>>
40
- readonly deferred: Deferred.Deferred<never, unknown>
41
+ readonly deferred: Deferred.Deferred<void, unknown>
42
+ /** @internal */
43
+ state: {
44
+ readonly _tag: "Open"
45
+ readonly backing: Set<Fiber.RuntimeFiber<A, E>>
46
+ } | {
47
+ readonly _tag: "Closed"
48
+ }
41
49
  }
42
50
 
43
51
  /**
@@ -49,7 +57,10 @@ export const isFiberSet = (u: unknown): u is FiberSet<unknown, unknown> => Predi
49
57
  const Proto = {
50
58
  [TypeId]: TypeId,
51
59
  [Symbol.iterator](this: FiberSet<unknown, unknown>) {
52
- return this.backing[Symbol.iterator]()
60
+ if (this.state._tag === "Closed") {
61
+ return Iterable.empty()
62
+ }
63
+ return this.state.backing[Symbol.iterator]()
53
64
  },
54
65
  toString(this: FiberSet<unknown, unknown>) {
55
66
  return Inspectable.format(this.toJSON())
@@ -57,7 +68,7 @@ const Proto = {
57
68
  toJSON(this: FiberSet<unknown, unknown>) {
58
69
  return {
59
70
  _id: "FiberMap",
60
- backing: Inspectable.toJSON(Array.from(this.backing))
71
+ state: this.state
61
72
  }
62
73
  },
63
74
  [Inspectable.NodeInspectSymbol](this: FiberSet<unknown, unknown>) {
@@ -70,10 +81,10 @@ const Proto = {
70
81
 
71
82
  const unsafeMake = <A, E>(
72
83
  backing: Set<Fiber.RuntimeFiber<A, E>>,
73
- deferred: Deferred.Deferred<never, unknown>
84
+ deferred: Deferred.Deferred<void, unknown>
74
85
  ): FiberSet<A, E> => {
75
86
  const self = Object.create(Proto)
76
- self.backing = backing
87
+ self.state = { _tag: "Open", backing }
77
88
  self.deferred = deferred
78
89
  return self
79
90
  }
@@ -105,8 +116,15 @@ const unsafeMake = <A, E>(
105
116
  */
106
117
  export const make = <A = unknown, E = unknown>(): Effect.Effect<FiberSet<A, E>, never, Scope.Scope> =>
107
118
  Effect.acquireRelease(
108
- Effect.map(Deferred.make<never, unknown>(), (deferred) => unsafeMake(new Set(), deferred)),
109
- clear
119
+ Effect.map(Deferred.make<void, unknown>(), (deferred) => unsafeMake(new Set(), deferred)),
120
+ (set) =>
121
+ Effect.zipRight(
122
+ clear(set),
123
+ Effect.suspend(() => {
124
+ set.state = { _tag: "Closed" }
125
+ return Deferred.done(set.deferred, Exit.void)
126
+ })
127
+ )
110
128
  )
111
129
 
112
130
  /**
@@ -135,24 +153,39 @@ export const makeRuntime = <R = never, A = unknown, E = unknown>(): Effect.Effec
135
153
  * @categories combinators
136
154
  */
137
155
  export const unsafeAdd: {
138
- <A, E, XE extends E, XA extends A>(fiber: Fiber.RuntimeFiber<XA, XE>): (self: FiberSet<A, E>) => void
139
- <A, E, XE extends E, XA extends A>(self: FiberSet<A, E>, fiber: Fiber.RuntimeFiber<XA, XE>): void
140
- } = dual<
141
156
  <A, E, XE extends E, XA extends A>(
142
- fiber: Fiber.RuntimeFiber<XA, XE>
143
- ) => (self: FiberSet<A, E>) => void,
157
+ fiber: Fiber.RuntimeFiber<XA, XE>,
158
+ options?: {
159
+ readonly interruptAs?: FiberId.FiberId | undefined
160
+ } | undefined
161
+ ): (self: FiberSet<A, E>) => void
144
162
  <A, E, XE extends E, XA extends A>(
145
163
  self: FiberSet<A, E>,
146
- fiber: Fiber.RuntimeFiber<XA, XE>
147
- ) => void
148
- >(2, (self, fiber) => {
149
- if (self.backing.has(fiber)) {
164
+ fiber: Fiber.RuntimeFiber<XA, XE>,
165
+ options?: {
166
+ readonly interruptAs?: FiberId.FiberId | undefined
167
+ } | undefined
168
+ ): void
169
+ } = dual((args) => isFiberSet(args[0]), <A, E, XE extends E, XA extends A>(
170
+ self: FiberSet<A, E>,
171
+ fiber: Fiber.RuntimeFiber<XA, XE>,
172
+ options?: {
173
+ readonly interruptAs?: FiberId.FiberId | undefined
174
+ } | undefined
175
+ ): void => {
176
+ if (self.state._tag === "Closed") {
177
+ fiber.unsafeInterruptAsFork(options?.interruptAs ?? FiberId.none)
178
+ return
179
+ } else if (self.state.backing.has(fiber)) {
150
180
  return
151
181
  }
152
182
  ;(fiber as FiberRuntime<unknown, unknown>).setFiberRef(FiberRef.unhandledErrorLogLevel, Option.none())
153
- self.backing.add(fiber)
183
+ self.state.backing.add(fiber)
154
184
  fiber.addObserver((exit) => {
155
- self.backing.delete(fiber)
185
+ if (self.state._tag === "Closed") {
186
+ return
187
+ }
188
+ self.state.backing.delete(fiber)
156
189
  if (Exit.isFailure(exit) && !Cause.isInterruptedOnly(exit.cause)) {
157
190
  Deferred.unsafeDone(self.deferred, exit as any)
158
191
  }
@@ -181,19 +214,31 @@ export const add: {
181
214
  self: FiberSet<A, E>,
182
215
  fiber: Fiber.RuntimeFiber<XA, XE>
183
216
  ) => Effect.Effect<void>
184
- >(2, (self, fiber) => Effect.sync(() => unsafeAdd(self, fiber)))
217
+ >(
218
+ 2,
219
+ (self, fiber) =>
220
+ Effect.fiberIdWith((fiberId) =>
221
+ Effect.sync(() =>
222
+ unsafeAdd(self, fiber, {
223
+ interruptAs: fiberId
224
+ })
225
+ )
226
+ )
227
+ )
185
228
 
186
229
  /**
187
230
  * @since 2.0.0
188
231
  * @categories combinators
189
232
  */
190
233
  export const clear = <A, E>(self: FiberSet<A, E>): Effect.Effect<void> =>
191
- Effect.zipRight(
192
- Effect.forEach(self.backing, (fiber) => Fiber.interrupt(fiber)),
193
- Effect.sync(() => {
194
- self.backing.clear()
195
- })
196
- )
234
+ Effect.suspend(() => {
235
+ if (self.state._tag === "Closed") {
236
+ return Effect.void
237
+ }
238
+ return Effect.forEach(self.state.backing, (fiber) =>
239
+ // will be removed by the observer
240
+ Fiber.interrupt(fiber))
241
+ })
197
242
 
198
243
  /**
199
244
  * Fork an Effect and add the forked fiber to the FiberSet.
@@ -214,16 +259,30 @@ export const run: {
214
259
  const self = arguments[0] as FiberSet<any, any>
215
260
  if (arguments.length === 1) {
216
261
  return (effect: Effect.Effect<any, any, any>) =>
262
+ Effect.suspend(() => {
263
+ if (self.state._tag === "Closed") {
264
+ return Effect.interrupt
265
+ }
266
+ return Effect.uninterruptibleMask((restore) =>
267
+ Effect.tap(
268
+ restore(Effect.forkDaemon(effect)),
269
+ (fiber) => add(self, fiber)
270
+ )
271
+ )
272
+ })
273
+ }
274
+ const effect = arguments[1] as Effect.Effect<any, any, any>
275
+ return Effect.suspend(() => {
276
+ if (self.state._tag === "Closed") {
277
+ return Effect.interrupt
278
+ }
279
+ return Effect.uninterruptibleMask((restore) =>
217
280
  Effect.tap(
218
- Effect.forkDaemon(effect),
281
+ restore(Effect.forkDaemon(effect)),
219
282
  (fiber) => add(self, fiber)
220
283
  )
221
- }
222
- const effect = arguments[1] as Effect.Effect<any, any, any>
223
- return Effect.tap(
224
- Effect.forkDaemon(effect),
225
- (fiber) => add(self, fiber)
226
- ) as any
284
+ )
285
+ }) as any
227
286
  }
228
287
 
229
288
  /**
@@ -281,7 +340,8 @@ export const runtime: <A, E>(
281
340
  * @since 2.0.0
282
341
  * @categories combinators
283
342
  */
284
- export const size = <A, E>(self: FiberSet<A, E>): Effect.Effect<number> => Effect.sync(() => self.backing.size)
343
+ export const size = <A, E>(self: FiberSet<A, E>): Effect.Effect<number> =>
344
+ Effect.sync(() => self.state._tag === "Closed" ? 0 : self.state.backing.size)
285
345
 
286
346
  /**
287
347
  * Join all fibers in the FiberSet. If any of the Fiber's in the set terminate with a failure,
@@ -300,5 +360,5 @@ export const size = <A, E>(self: FiberSet<A, E>): Effect.Effect<number> => Effec
300
360
  * yield* _(FiberSet.join(set));
301
361
  * });
302
362
  */
303
- export const join = <A, E>(self: FiberSet<A, E>): Effect.Effect<never, E> =>
304
- Deferred.await(self.deferred as Deferred.Deferred<never, E>)
363
+ export const join = <A, E>(self: FiberSet<A, E>): Effect.Effect<void, E> =>
364
+ Deferred.await(self.deferred as Deferred.Deferred<void, E>)