@clayroach/effect 3.19.14-source-capture.8 → 3.19.14-source-trace.2

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 (452) hide show
  1. package/SourceLocation/package.json +6 -0
  2. package/dist/cjs/Effect.js +2 -28
  3. package/dist/cjs/Effect.js.map +1 -1
  4. package/dist/cjs/FiberRef.js +12 -1
  5. package/dist/cjs/FiberRef.js.map +1 -1
  6. package/dist/cjs/Layer.js +2 -24
  7. package/dist/cjs/Layer.js.map +1 -1
  8. package/dist/cjs/RuntimeFlags.js +1 -29
  9. package/dist/cjs/RuntimeFlags.js.map +1 -1
  10. package/dist/cjs/SourceLocation.js +60 -0
  11. package/dist/cjs/SourceLocation.js.map +1 -0
  12. package/dist/cjs/Tracer.js +1 -15
  13. package/dist/cjs/Tracer.js.map +1 -1
  14. package/dist/cjs/Utils.js +1 -1
  15. package/dist/cjs/Utils.js.map +1 -1
  16. package/dist/cjs/index.js +3 -1
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/internal/clock.js +1 -1
  19. package/dist/cjs/internal/clock.js.map +1 -1
  20. package/dist/cjs/internal/core.js +17 -50
  21. package/dist/cjs/internal/core.js.map +1 -1
  22. package/dist/cjs/internal/effect/circular.js +18 -30
  23. package/dist/cjs/internal/effect/circular.js.map +1 -1
  24. package/dist/cjs/internal/fiberRuntime.js +16 -65
  25. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  26. package/dist/cjs/internal/layer/circular.js +1 -5
  27. package/dist/cjs/internal/layer/circular.js.map +1 -1
  28. package/dist/cjs/internal/layer.js +1 -3
  29. package/dist/cjs/internal/layer.js.map +1 -1
  30. package/dist/cjs/internal/logger.js +25 -2
  31. package/dist/cjs/internal/logger.js.map +1 -1
  32. package/dist/cjs/internal/runtimeFlags.js +2 -11
  33. package/dist/cjs/internal/runtimeFlags.js.map +1 -1
  34. package/dist/cjs/internal/tracer.js +1 -114
  35. package/dist/cjs/internal/tracer.js.map +1 -1
  36. package/dist/dts/Config.d.ts +2 -2
  37. package/dist/dts/Config.d.ts.map +1 -1
  38. package/dist/dts/Effect.d.ts +8 -29
  39. package/dist/dts/Effect.d.ts.map +1 -1
  40. package/dist/dts/FiberRef.d.ts +12 -0
  41. package/dist/dts/FiberRef.d.ts.map +1 -1
  42. package/dist/dts/Layer.d.ts +0 -22
  43. package/dist/dts/Layer.d.ts.map +1 -1
  44. package/dist/dts/RuntimeFlags.d.ts +0 -28
  45. package/dist/dts/RuntimeFlags.d.ts.map +1 -1
  46. package/dist/dts/SourceLocation.d.ts +88 -0
  47. package/dist/dts/SourceLocation.d.ts.map +1 -0
  48. package/dist/dts/Tracer.d.ts +0 -15
  49. package/dist/dts/Tracer.d.ts.map +1 -1
  50. package/dist/dts/index.d.ts +6 -0
  51. package/dist/dts/index.d.ts.map +1 -1
  52. package/dist/dts/internal/core.d.ts.map +1 -1
  53. package/dist/dts/internal/layer.d.ts.map +1 -1
  54. package/dist/dts/internal/runtimeFlags.d.ts.map +1 -1
  55. package/dist/esm/Effect.js +0 -26
  56. package/dist/esm/Effect.js.map +1 -1
  57. package/dist/esm/FiberRef.js +11 -0
  58. package/dist/esm/FiberRef.js.map +1 -1
  59. package/dist/esm/Layer.js +0 -22
  60. package/dist/esm/Layer.js.map +1 -1
  61. package/dist/esm/RuntimeFlags.js +0 -28
  62. package/dist/esm/RuntimeFlags.js.map +1 -1
  63. package/dist/esm/SourceLocation.js +51 -0
  64. package/dist/esm/SourceLocation.js.map +1 -0
  65. package/dist/esm/Tracer.js +0 -14
  66. package/dist/esm/Tracer.js.map +1 -1
  67. package/dist/esm/Utils.js +1 -1
  68. package/dist/esm/Utils.js.map +1 -1
  69. package/dist/esm/index.js +6 -0
  70. package/dist/esm/index.js.map +1 -1
  71. package/dist/esm/internal/clock.js +1 -1
  72. package/dist/esm/internal/clock.js.map +1 -1
  73. package/dist/esm/internal/core.js +12 -45
  74. package/dist/esm/internal/core.js.map +1 -1
  75. package/dist/esm/internal/effect/circular.js +18 -30
  76. package/dist/esm/internal/effect/circular.js.map +1 -1
  77. package/dist/esm/internal/fiberRuntime.js +13 -60
  78. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  79. package/dist/esm/internal/layer/circular.js +0 -4
  80. package/dist/esm/internal/layer/circular.js.map +1 -1
  81. package/dist/esm/internal/layer.js +0 -2
  82. package/dist/esm/internal/layer.js.map +1 -1
  83. package/dist/esm/internal/logger.js +25 -2
  84. package/dist/esm/internal/logger.js.map +1 -1
  85. package/dist/esm/internal/runtimeFlags.js +1 -9
  86. package/dist/esm/internal/runtimeFlags.js.map +1 -1
  87. package/dist/esm/internal/tracer.js +0 -111
  88. package/dist/esm/internal/tracer.js.map +1 -1
  89. package/package.json +12 -1
  90. package/src/Arbitrary.ts +1101 -0
  91. package/src/Array.ts +3589 -0
  92. package/src/BigDecimal.ts +1349 -0
  93. package/src/BigInt.ts +643 -0
  94. package/src/Boolean.ts +287 -0
  95. package/src/Brand.ts +360 -0
  96. package/src/Cache.ts +281 -0
  97. package/src/Cause.ts +1555 -0
  98. package/src/Channel.ts +2355 -0
  99. package/src/ChildExecutorDecision.ts +146 -0
  100. package/src/Chunk.ts +1495 -0
  101. package/src/Clock.ts +111 -0
  102. package/src/Config.ts +542 -0
  103. package/src/ConfigError.ts +270 -0
  104. package/src/ConfigProvider.ts +333 -0
  105. package/src/ConfigProviderPathPatch.ts +100 -0
  106. package/src/Console.ts +226 -0
  107. package/src/Context.ts +585 -0
  108. package/src/Cron.ts +706 -0
  109. package/src/Data.ts +596 -0
  110. package/src/DateTime.ts +1686 -0
  111. package/src/DefaultServices.ts +34 -0
  112. package/src/Deferred.ts +301 -0
  113. package/src/Differ.ts +450 -0
  114. package/src/Duration.ts +1000 -0
  115. package/src/Effect.ts +14817 -0
  116. package/src/Effectable.ts +107 -0
  117. package/src/Either.ts +1040 -0
  118. package/src/Encoding.ts +195 -0
  119. package/src/Equal.ts +98 -0
  120. package/src/Equivalence.ts +235 -0
  121. package/src/ExecutionPlan.ts +308 -0
  122. package/src/ExecutionStrategy.ts +119 -0
  123. package/src/Exit.ts +467 -0
  124. package/src/FastCheck.ts +9 -0
  125. package/src/Fiber.ts +744 -0
  126. package/src/FiberHandle.ts +540 -0
  127. package/src/FiberId.ts +195 -0
  128. package/src/FiberMap.ts +656 -0
  129. package/src/FiberRef.ts +444 -0
  130. package/src/FiberRefs.ts +204 -0
  131. package/src/FiberRefsPatch.ts +105 -0
  132. package/src/FiberSet.ts +491 -0
  133. package/src/FiberStatus.ts +108 -0
  134. package/src/Function.ts +1222 -0
  135. package/src/GlobalValue.ts +53 -0
  136. package/src/Graph.ts +3732 -0
  137. package/src/GroupBy.ts +103 -0
  138. package/src/HKT.ts +45 -0
  139. package/src/Hash.ts +195 -0
  140. package/src/HashMap.ts +519 -0
  141. package/src/HashRing.ts +317 -0
  142. package/src/HashSet.ts +2346 -0
  143. package/src/Inspectable.ts +287 -0
  144. package/src/Iterable.ts +1119 -0
  145. package/src/JSONSchema.ts +1044 -0
  146. package/src/KeyedPool.ts +167 -0
  147. package/src/Layer.ts +1228 -0
  148. package/src/LayerMap.ts +436 -0
  149. package/src/List.ts +977 -0
  150. package/src/LogLevel.ts +285 -0
  151. package/src/LogSpan.ts +25 -0
  152. package/src/Logger.ts +702 -0
  153. package/src/Mailbox.ts +268 -0
  154. package/src/ManagedRuntime.ts +180 -0
  155. package/src/Match.ts +1477 -0
  156. package/src/MergeDecision.ts +95 -0
  157. package/src/MergeState.ts +172 -0
  158. package/src/MergeStrategy.ts +107 -0
  159. package/src/Metric.ts +780 -0
  160. package/src/MetricBoundaries.ts +69 -0
  161. package/src/MetricHook.ts +151 -0
  162. package/src/MetricKey.ts +224 -0
  163. package/src/MetricKeyType.ts +262 -0
  164. package/src/MetricLabel.ts +47 -0
  165. package/src/MetricPair.ts +71 -0
  166. package/src/MetricPolling.ts +148 -0
  167. package/src/MetricRegistry.ts +48 -0
  168. package/src/MetricState.ts +257 -0
  169. package/src/Micro.ts +4405 -0
  170. package/src/ModuleVersion.ts +18 -0
  171. package/src/MutableHashMap.ts +411 -0
  172. package/src/MutableHashSet.ts +706 -0
  173. package/src/MutableList.ts +297 -0
  174. package/src/MutableQueue.ts +227 -0
  175. package/src/MutableRef.ts +202 -0
  176. package/src/NonEmptyIterable.ts +32 -0
  177. package/src/Number.ts +1071 -0
  178. package/src/Option.ts +2170 -0
  179. package/src/Order.ts +373 -0
  180. package/src/Ordering.ts +111 -0
  181. package/src/ParseResult.ts +2031 -0
  182. package/src/PartitionedSemaphore.ts +200 -0
  183. package/src/Pipeable.ts +566 -0
  184. package/src/Pool.ts +204 -0
  185. package/src/Predicate.ts +1405 -0
  186. package/src/Pretty.ts +205 -0
  187. package/src/PrimaryKey.ts +23 -0
  188. package/src/PubSub.ts +182 -0
  189. package/src/Queue.ts +644 -0
  190. package/src/Random.ts +204 -0
  191. package/src/RateLimiter.ts +138 -0
  192. package/src/RcMap.ts +141 -0
  193. package/src/RcRef.ts +122 -0
  194. package/src/Readable.ts +93 -0
  195. package/src/Record.ts +1274 -0
  196. package/src/RedBlackTree.ts +421 -0
  197. package/src/Redacted.ts +144 -0
  198. package/src/Ref.ts +180 -0
  199. package/src/RegExp.ts +38 -0
  200. package/src/Reloadable.ts +127 -0
  201. package/src/Request.ts +347 -0
  202. package/src/RequestBlock.ts +118 -0
  203. package/src/RequestResolver.ts +366 -0
  204. package/src/Resource.ts +119 -0
  205. package/src/Runtime.ts +383 -0
  206. package/src/RuntimeFlags.ts +336 -0
  207. package/src/RuntimeFlagsPatch.ts +183 -0
  208. package/src/STM.ts +2045 -0
  209. package/src/Schedule.ts +2219 -0
  210. package/src/ScheduleDecision.ts +62 -0
  211. package/src/ScheduleInterval.ts +151 -0
  212. package/src/ScheduleIntervals.ts +122 -0
  213. package/src/Scheduler.ts +353 -0
  214. package/src/Schema.ts +10914 -0
  215. package/src/SchemaAST.ts +3043 -0
  216. package/src/Scope.ts +204 -0
  217. package/src/ScopedCache.ts +151 -0
  218. package/src/ScopedRef.ts +117 -0
  219. package/src/Secret.ts +88 -0
  220. package/src/SingleProducerAsyncInput.ts +67 -0
  221. package/src/Sink.ts +1461 -0
  222. package/src/SortedMap.ts +287 -0
  223. package/src/SortedSet.ts +390 -0
  224. package/src/SourceLocation.ts +108 -0
  225. package/src/Stream.ts +6468 -0
  226. package/src/StreamEmit.ts +136 -0
  227. package/src/StreamHaltStrategy.ts +123 -0
  228. package/src/Streamable.ts +45 -0
  229. package/src/String.ts +778 -0
  230. package/src/Struct.ts +243 -0
  231. package/src/Subscribable.ts +100 -0
  232. package/src/SubscriptionRef.ts +298 -0
  233. package/src/Supervisor.ts +240 -0
  234. package/src/Symbol.ts +29 -0
  235. package/src/SynchronizedRef.ts +270 -0
  236. package/src/TArray.ts +495 -0
  237. package/src/TDeferred.ts +100 -0
  238. package/src/TMap.ts +515 -0
  239. package/src/TPriorityQueue.ts +223 -0
  240. package/src/TPubSub.ts +200 -0
  241. package/src/TQueue.ts +432 -0
  242. package/src/TRandom.ts +129 -0
  243. package/src/TReentrantLock.ts +224 -0
  244. package/src/TRef.ts +178 -0
  245. package/src/TSemaphore.ts +129 -0
  246. package/src/TSet.ts +365 -0
  247. package/src/TSubscriptionRef.ts +192 -0
  248. package/src/Take.ts +258 -0
  249. package/src/TestAnnotation.ts +158 -0
  250. package/src/TestAnnotationMap.ts +119 -0
  251. package/src/TestAnnotations.ts +117 -0
  252. package/src/TestClock.ts +556 -0
  253. package/src/TestConfig.ts +47 -0
  254. package/src/TestContext.ts +36 -0
  255. package/src/TestLive.ts +53 -0
  256. package/src/TestServices.ts +390 -0
  257. package/src/TestSized.ts +55 -0
  258. package/src/Tracer.ts +182 -0
  259. package/src/Trie.ts +840 -0
  260. package/src/Tuple.ts +305 -0
  261. package/src/Types.ts +353 -0
  262. package/src/Unify.ts +113 -0
  263. package/src/UpstreamPullRequest.ts +117 -0
  264. package/src/UpstreamPullStrategy.ts +121 -0
  265. package/src/Utils.ts +809 -0
  266. package/src/index.ts +1568 -0
  267. package/src/internal/array.ts +8 -0
  268. package/src/internal/blockedRequests.ts +520 -0
  269. package/src/internal/cache.ts +733 -0
  270. package/src/internal/cause.ts +1050 -0
  271. package/src/internal/channel/channelExecutor.ts +1200 -0
  272. package/src/internal/channel/channelState.ts +134 -0
  273. package/src/internal/channel/childExecutorDecision.ts +96 -0
  274. package/src/internal/channel/continuation.ts +200 -0
  275. package/src/internal/channel/mergeDecision.ts +113 -0
  276. package/src/internal/channel/mergeState.ts +120 -0
  277. package/src/internal/channel/mergeStrategy.ts +72 -0
  278. package/src/internal/channel/singleProducerAsyncInput.ts +259 -0
  279. package/src/internal/channel/subexecutor.ts +229 -0
  280. package/src/internal/channel/upstreamPullRequest.ts +84 -0
  281. package/src/internal/channel/upstreamPullStrategy.ts +87 -0
  282. package/src/internal/channel.ts +2603 -0
  283. package/src/internal/clock.ts +95 -0
  284. package/src/internal/completedRequestMap.ts +9 -0
  285. package/src/internal/concurrency.ts +54 -0
  286. package/src/internal/config.ts +716 -0
  287. package/src/internal/configError.ts +304 -0
  288. package/src/internal/configProvider/pathPatch.ts +97 -0
  289. package/src/internal/configProvider.ts +799 -0
  290. package/src/internal/console.ts +153 -0
  291. package/src/internal/context.ts +337 -0
  292. package/src/internal/core-effect.ts +2293 -0
  293. package/src/internal/core-stream.ts +998 -0
  294. package/src/internal/core.ts +3189 -0
  295. package/src/internal/data.ts +36 -0
  296. package/src/internal/dataSource.ts +327 -0
  297. package/src/internal/dateTime.ts +1277 -0
  298. package/src/internal/defaultServices/console.ts +100 -0
  299. package/src/internal/defaultServices.ts +163 -0
  300. package/src/internal/deferred.ts +46 -0
  301. package/src/internal/differ/chunkPatch.ts +211 -0
  302. package/src/internal/differ/contextPatch.ts +232 -0
  303. package/src/internal/differ/hashMapPatch.ts +220 -0
  304. package/src/internal/differ/hashSetPatch.ts +176 -0
  305. package/src/internal/differ/orPatch.ts +311 -0
  306. package/src/internal/differ/readonlyArrayPatch.ts +210 -0
  307. package/src/internal/differ.ts +200 -0
  308. package/src/internal/doNotation.ts +80 -0
  309. package/src/internal/effect/circular.ts +895 -0
  310. package/src/internal/effectable.ts +131 -0
  311. package/src/internal/either.ts +110 -0
  312. package/src/internal/encoding/base64.ts +286 -0
  313. package/src/internal/encoding/base64Url.ts +29 -0
  314. package/src/internal/encoding/common.ts +51 -0
  315. package/src/internal/encoding/hex.ts +315 -0
  316. package/src/internal/errors.ts +7 -0
  317. package/src/internal/executionPlan.ts +114 -0
  318. package/src/internal/executionStrategy.ts +74 -0
  319. package/src/internal/fiber.ts +388 -0
  320. package/src/internal/fiberId.ts +267 -0
  321. package/src/internal/fiberMessage.ts +82 -0
  322. package/src/internal/fiberRefs/patch.ts +144 -0
  323. package/src/internal/fiberRefs.ts +297 -0
  324. package/src/internal/fiberRuntime.ts +3842 -0
  325. package/src/internal/fiberScope.ts +71 -0
  326. package/src/internal/fiberStatus.ts +119 -0
  327. package/src/internal/groupBy.ts +530 -0
  328. package/src/internal/hashMap/array.ts +49 -0
  329. package/src/internal/hashMap/bitwise.ts +32 -0
  330. package/src/internal/hashMap/config.ts +14 -0
  331. package/src/internal/hashMap/keySet.ts +8 -0
  332. package/src/internal/hashMap/node.ts +391 -0
  333. package/src/internal/hashMap.ts +586 -0
  334. package/src/internal/hashSet.ts +323 -0
  335. package/src/internal/keyedPool.ts +244 -0
  336. package/src/internal/layer/circular.ts +214 -0
  337. package/src/internal/layer.ts +1483 -0
  338. package/src/internal/logSpan.ts +20 -0
  339. package/src/internal/logger-circular.ts +24 -0
  340. package/src/internal/logger.ts +522 -0
  341. package/src/internal/mailbox.ts +561 -0
  342. package/src/internal/managedRuntime/circular.ts +6 -0
  343. package/src/internal/managedRuntime.ts +134 -0
  344. package/src/internal/matcher.ts +652 -0
  345. package/src/internal/metric/boundaries.ts +75 -0
  346. package/src/internal/metric/hook.ts +483 -0
  347. package/src/internal/metric/key.ts +167 -0
  348. package/src/internal/metric/keyType.ts +238 -0
  349. package/src/internal/metric/label.ts +41 -0
  350. package/src/internal/metric/pair.ts +48 -0
  351. package/src/internal/metric/polling.ts +149 -0
  352. package/src/internal/metric/registry.ts +187 -0
  353. package/src/internal/metric/state.ts +290 -0
  354. package/src/internal/metric.ts +577 -0
  355. package/src/internal/opCodes/cause.ts +35 -0
  356. package/src/internal/opCodes/channel.ts +83 -0
  357. package/src/internal/opCodes/channelChildExecutorDecision.ts +17 -0
  358. package/src/internal/opCodes/channelMergeDecision.ts +11 -0
  359. package/src/internal/opCodes/channelMergeState.ts +17 -0
  360. package/src/internal/opCodes/channelMergeStrategy.ts +11 -0
  361. package/src/internal/opCodes/channelState.ts +23 -0
  362. package/src/internal/opCodes/channelUpstreamPullRequest.ts +11 -0
  363. package/src/internal/opCodes/channelUpstreamPullStrategy.ts +11 -0
  364. package/src/internal/opCodes/config.ts +65 -0
  365. package/src/internal/opCodes/configError.ts +35 -0
  366. package/src/internal/opCodes/continuation.ts +11 -0
  367. package/src/internal/opCodes/deferred.ts +11 -0
  368. package/src/internal/opCodes/effect.ts +89 -0
  369. package/src/internal/opCodes/layer.ts +59 -0
  370. package/src/internal/opCodes/streamHaltStrategy.ts +23 -0
  371. package/src/internal/option.ts +80 -0
  372. package/src/internal/pool.ts +432 -0
  373. package/src/internal/pubsub.ts +1762 -0
  374. package/src/internal/query.ts +204 -0
  375. package/src/internal/queue.ts +766 -0
  376. package/src/internal/random.ts +161 -0
  377. package/src/internal/rateLimiter.ts +93 -0
  378. package/src/internal/rcMap.ts +285 -0
  379. package/src/internal/rcRef.ts +192 -0
  380. package/src/internal/redBlackTree/iterator.ts +200 -0
  381. package/src/internal/redBlackTree/node.ts +68 -0
  382. package/src/internal/redBlackTree.ts +1245 -0
  383. package/src/internal/redacted.ts +73 -0
  384. package/src/internal/ref.ts +171 -0
  385. package/src/internal/reloadable.ts +140 -0
  386. package/src/internal/request.ts +177 -0
  387. package/src/internal/resource.ts +76 -0
  388. package/src/internal/ringBuffer.ts +68 -0
  389. package/src/internal/runtime.ts +558 -0
  390. package/src/internal/runtimeFlags.ts +178 -0
  391. package/src/internal/runtimeFlagsPatch.ts +103 -0
  392. package/src/internal/schedule/decision.ts +47 -0
  393. package/src/internal/schedule/interval.ts +101 -0
  394. package/src/internal/schedule/intervals.ts +180 -0
  395. package/src/internal/schedule.ts +2199 -0
  396. package/src/internal/schema/errors.ts +191 -0
  397. package/src/internal/schema/schemaId.ts +106 -0
  398. package/src/internal/schema/util.ts +50 -0
  399. package/src/internal/scopedCache.ts +644 -0
  400. package/src/internal/scopedRef.ts +118 -0
  401. package/src/internal/secret.ts +89 -0
  402. package/src/internal/singleShotGen.ts +35 -0
  403. package/src/internal/sink.ts +2120 -0
  404. package/src/internal/stack.ts +10 -0
  405. package/src/internal/stm/core.ts +817 -0
  406. package/src/internal/stm/entry.ts +59 -0
  407. package/src/internal/stm/journal.ts +123 -0
  408. package/src/internal/stm/opCodes/stm.ts +71 -0
  409. package/src/internal/stm/opCodes/stmState.ts +17 -0
  410. package/src/internal/stm/opCodes/strategy.ts +17 -0
  411. package/src/internal/stm/opCodes/tExit.ts +29 -0
  412. package/src/internal/stm/opCodes/tryCommit.ts +11 -0
  413. package/src/internal/stm/stm.ts +1453 -0
  414. package/src/internal/stm/stmState.ts +136 -0
  415. package/src/internal/stm/tArray.ts +550 -0
  416. package/src/internal/stm/tDeferred.ts +81 -0
  417. package/src/internal/stm/tExit.ts +190 -0
  418. package/src/internal/stm/tMap.ts +824 -0
  419. package/src/internal/stm/tPriorityQueue.ts +267 -0
  420. package/src/internal/stm/tPubSub.ts +551 -0
  421. package/src/internal/stm/tQueue.ts +393 -0
  422. package/src/internal/stm/tRandom.ts +140 -0
  423. package/src/internal/stm/tReentrantLock.ts +352 -0
  424. package/src/internal/stm/tRef.ts +195 -0
  425. package/src/internal/stm/tSemaphore.ts +113 -0
  426. package/src/internal/stm/tSet.ts +259 -0
  427. package/src/internal/stm/tSubscriptionRef.ts +286 -0
  428. package/src/internal/stm/tryCommit.ts +34 -0
  429. package/src/internal/stm/txnId.ts +14 -0
  430. package/src/internal/stm/versioned.ts +4 -0
  431. package/src/internal/stream/debounceState.ts +57 -0
  432. package/src/internal/stream/emit.ts +123 -0
  433. package/src/internal/stream/haltStrategy.ts +94 -0
  434. package/src/internal/stream/handoff.ts +187 -0
  435. package/src/internal/stream/handoffSignal.ts +59 -0
  436. package/src/internal/stream/pull.ts +34 -0
  437. package/src/internal/stream/sinkEndReason.ts +30 -0
  438. package/src/internal/stream/zipAllState.ts +88 -0
  439. package/src/internal/stream/zipChunksState.ts +56 -0
  440. package/src/internal/stream.ts +8801 -0
  441. package/src/internal/string-utils.ts +107 -0
  442. package/src/internal/subscriptionRef.ts +138 -0
  443. package/src/internal/supervisor/patch.ts +190 -0
  444. package/src/internal/supervisor.ts +303 -0
  445. package/src/internal/synchronizedRef.ts +114 -0
  446. package/src/internal/take.ts +199 -0
  447. package/src/internal/testing/sleep.ts +27 -0
  448. package/src/internal/testing/suspendedWarningData.ts +85 -0
  449. package/src/internal/testing/warningData.ts +94 -0
  450. package/src/internal/tracer.ts +150 -0
  451. package/src/internal/trie.ts +722 -0
  452. package/src/internal/version.ts +7 -0
@@ -0,0 +1,656 @@
1
+ /**
2
+ * @since 2.0.0
3
+ */
4
+ import type { NoSuchElementException } from "./Cause.js"
5
+ import * as Cause from "./Cause.js"
6
+ import * as Deferred from "./Deferred.js"
7
+ import * as Effect from "./Effect.js"
8
+ import * as Exit from "./Exit.js"
9
+ import * as Fiber from "./Fiber.js"
10
+ import * as FiberId from "./FiberId.js"
11
+ import { constFalse, constVoid, dual } from "./Function.js"
12
+ import * as HashSet from "./HashSet.js"
13
+ import * as Inspectable from "./Inspectable.js"
14
+ import * as Iterable from "./Iterable.js"
15
+ import * as MutableHashMap from "./MutableHashMap.js"
16
+ import * as Option from "./Option.js"
17
+ import { type Pipeable, pipeArguments } from "./Pipeable.js"
18
+ import * as Predicate from "./Predicate.js"
19
+ import * as Runtime from "./Runtime.js"
20
+ import type * as Scope from "./Scope.js"
21
+
22
+ /**
23
+ * @since 2.0.0
24
+ * @categories type ids
25
+ */
26
+ export const TypeId: unique symbol = Symbol.for("effect/FiberMap")
27
+
28
+ /**
29
+ * @since 2.0.0
30
+ * @categories type ids
31
+ */
32
+ export type TypeId = typeof TypeId
33
+
34
+ /**
35
+ * @since 2.0.0
36
+ * @categories models
37
+ */
38
+ export interface FiberMap<in out K, out A = unknown, out E = unknown>
39
+ extends Pipeable, Inspectable.Inspectable, Iterable<[K, Fiber.RuntimeFiber<A, E>]>
40
+ {
41
+ readonly [TypeId]: TypeId
42
+ readonly deferred: Deferred.Deferred<void, unknown>
43
+ /** @internal */
44
+ state: {
45
+ readonly _tag: "Open"
46
+ readonly backing: MutableHashMap.MutableHashMap<K, Fiber.RuntimeFiber<A, E>>
47
+ } | {
48
+ readonly _tag: "Closed"
49
+ }
50
+ }
51
+
52
+ /**
53
+ * @since 2.0.0
54
+ * @categories refinements
55
+ */
56
+ export const isFiberMap = (u: unknown): u is FiberMap<unknown> => Predicate.hasProperty(u, TypeId)
57
+
58
+ const Proto = {
59
+ [TypeId]: TypeId,
60
+ [Symbol.iterator](this: FiberMap<unknown>) {
61
+ if (this.state._tag === "Closed") {
62
+ return Iterable.empty()
63
+ }
64
+ return this.state.backing[Symbol.iterator]()
65
+ },
66
+ toString(this: FiberMap<unknown>) {
67
+ return Inspectable.format(this.toJSON())
68
+ },
69
+ toJSON(this: FiberMap<unknown>) {
70
+ return {
71
+ _id: "FiberMap",
72
+ state: this.state
73
+ }
74
+ },
75
+ [Inspectable.NodeInspectSymbol](this: FiberMap<unknown>) {
76
+ return this.toJSON()
77
+ },
78
+ pipe() {
79
+ return pipeArguments(this, arguments)
80
+ }
81
+ }
82
+
83
+ const unsafeMake = <K, A = unknown, E = unknown>(
84
+ backing: MutableHashMap.MutableHashMap<K, Fiber.RuntimeFiber<A, E>>,
85
+ deferred: Deferred.Deferred<void, E>
86
+ ): FiberMap<K, A, E> => {
87
+ const self = Object.create(Proto)
88
+ self.state = { _tag: "Open", backing }
89
+ self.deferred = deferred
90
+ return self
91
+ }
92
+
93
+ /**
94
+ * A FiberMap can be used to store a collection of fibers, indexed by some key.
95
+ * When the associated Scope is closed, all fibers in the map will be interrupted.
96
+ *
97
+ * You can add fibers to the map using `FiberMap.set` or `FiberMap.run`, and the fibers will
98
+ * be automatically removed from the FiberMap when they complete.
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * import { Effect, FiberMap } from "effect"
103
+ *
104
+ * Effect.gen(function*() {
105
+ * const map = yield* FiberMap.make<string>()
106
+ *
107
+ * // run some effects and add the fibers to the map
108
+ * yield* FiberMap.run(map, "fiber a", Effect.never)
109
+ * yield* FiberMap.run(map, "fiber b", Effect.never)
110
+ *
111
+ * yield* Effect.sleep(1000)
112
+ * }).pipe(
113
+ * Effect.scoped // The fibers will be interrupted when the scope is closed
114
+ * )
115
+ * ```
116
+ *
117
+ * @since 2.0.0
118
+ * @categories constructors
119
+ */
120
+ export const make = <K, A = unknown, E = unknown>(): Effect.Effect<FiberMap<K, A, E>, never, Scope.Scope> =>
121
+ Effect.acquireRelease(
122
+ Effect.map(Deferred.make<void, E>(), (deferred) =>
123
+ unsafeMake<K, A, E>(
124
+ MutableHashMap.empty(),
125
+ deferred
126
+ )),
127
+ (map) =>
128
+ Effect.withFiberRuntime((parent) => {
129
+ const state = map.state
130
+ if (state._tag === "Closed") return Effect.void
131
+ map.state = { _tag: "Closed" }
132
+ return Fiber.interruptAllAs(
133
+ Iterable.map(state.backing, ([, fiber]) => fiber),
134
+ FiberId.combine(parent.id(), internalFiberId)
135
+ ).pipe(
136
+ Effect.intoDeferred(map.deferred)
137
+ )
138
+ })
139
+ )
140
+
141
+ /**
142
+ * Create an Effect run function that is backed by a FiberMap.
143
+ *
144
+ * @since 2.0.0
145
+ * @categories constructors
146
+ */
147
+ export const makeRuntime = <R, K, E = unknown, A = unknown>(): Effect.Effect<
148
+ <XE extends E, XA extends A>(
149
+ key: K,
150
+ effect: Effect.Effect<XA, XE, R>,
151
+ options?:
152
+ | Runtime.RunForkOptions & {
153
+ readonly onlyIfMissing?: boolean | undefined
154
+ }
155
+ | undefined
156
+ ) => Fiber.RuntimeFiber<XA, XE>,
157
+ never,
158
+ Scope.Scope | R
159
+ > =>
160
+ Effect.flatMap(
161
+ make<K, A, E>(),
162
+ (self) => runtime(self)<R>()
163
+ )
164
+
165
+ /**
166
+ * Create an Effect run function that is backed by a FiberMap.
167
+ *
168
+ * @since 3.13.0
169
+ * @categories constructors
170
+ */
171
+ export const makeRuntimePromise = <R, K, A = unknown, E = unknown>(): Effect.Effect<
172
+ <XE extends E, XA extends A>(
173
+ key: K,
174
+ effect: Effect.Effect<XA, XE, R>,
175
+ options?:
176
+ | Runtime.RunForkOptions & {
177
+ readonly onlyIfMissing?: boolean | undefined
178
+ }
179
+ | undefined
180
+ ) => Promise<XA>,
181
+ never,
182
+ Scope.Scope | R
183
+ > =>
184
+ Effect.flatMap(
185
+ make<K, A, E>(),
186
+ (self) => runtimePromise(self)<R>()
187
+ )
188
+
189
+ const internalFiberIdId = -1
190
+ const internalFiberId = FiberId.make(internalFiberIdId, 0)
191
+ const isInternalInterruption = Cause.reduceWithContext(undefined, {
192
+ emptyCase: constFalse,
193
+ failCase: constFalse,
194
+ dieCase: constFalse,
195
+ interruptCase: (_, fiberId) => HashSet.has(FiberId.ids(fiberId), internalFiberIdId),
196
+ sequentialCase: (_, left, right) => left || right,
197
+ parallelCase: (_, left, right) => left || right
198
+ })
199
+
200
+ /**
201
+ * Add a fiber to the FiberMap. When the fiber completes, it will be removed from the FiberMap.
202
+ * If the key already exists in the FiberMap, the previous fiber will be interrupted.
203
+ *
204
+ * @since 2.0.0
205
+ * @categories combinators
206
+ */
207
+ export const unsafeSet: {
208
+ <K, A, E, XE extends E, XA extends A>(
209
+ key: K,
210
+ fiber: Fiber.RuntimeFiber<XA, XE>,
211
+ options?: {
212
+ readonly interruptAs?: FiberId.FiberId | undefined
213
+ readonly onlyIfMissing?: boolean | undefined
214
+ readonly propagateInterruption?: boolean | undefined
215
+ } | undefined
216
+ ): (self: FiberMap<K, A, E>) => void
217
+ <K, A, E, XE extends E, XA extends A>(
218
+ self: FiberMap<K, A, E>,
219
+ key: K,
220
+ fiber: Fiber.RuntimeFiber<XA, XE>,
221
+ options?: {
222
+ readonly interruptAs?: FiberId.FiberId | undefined
223
+ readonly onlyIfMissing?: boolean | undefined
224
+ readonly propagateInterruption?: boolean | undefined
225
+ } | undefined
226
+ ): void
227
+ } = dual((args) => isFiberMap(args[0]), <K, A, E, XE extends E, XA extends A>(
228
+ self: FiberMap<K, A, E>,
229
+ key: K,
230
+ fiber: Fiber.RuntimeFiber<XA, XE>,
231
+ options?: {
232
+ readonly interruptAs?: FiberId.FiberId | undefined
233
+ readonly onlyIfMissing?: boolean | undefined
234
+ readonly propagateInterruption?: boolean | undefined
235
+ } | undefined
236
+ ): void => {
237
+ if (self.state._tag === "Closed") {
238
+ fiber.unsafeInterruptAsFork(FiberId.combine(options?.interruptAs ?? FiberId.none, internalFiberId))
239
+ return
240
+ }
241
+
242
+ const previous = MutableHashMap.get(self.state.backing, key)
243
+ if (previous._tag === "Some") {
244
+ if (options?.onlyIfMissing === true) {
245
+ fiber.unsafeInterruptAsFork(FiberId.combine(options?.interruptAs ?? FiberId.none, internalFiberId))
246
+ return
247
+ } else if (previous.value === fiber) {
248
+ return
249
+ }
250
+ previous.value.unsafeInterruptAsFork(FiberId.combine(options?.interruptAs ?? FiberId.none, internalFiberId))
251
+ }
252
+
253
+ MutableHashMap.set(self.state.backing, key, fiber)
254
+ fiber.addObserver((exit) => {
255
+ if (self.state._tag === "Closed") {
256
+ return
257
+ }
258
+ const current = MutableHashMap.get(self.state.backing, key)
259
+ if (Option.isSome(current) && fiber === current.value) {
260
+ MutableHashMap.remove(self.state.backing, key)
261
+ }
262
+ if (
263
+ Exit.isFailure(exit) &&
264
+ (
265
+ options?.propagateInterruption === true ?
266
+ !isInternalInterruption(exit.cause) :
267
+ !Cause.isInterruptedOnly(exit.cause)
268
+ )
269
+ ) {
270
+ Deferred.unsafeDone(self.deferred, exit as any)
271
+ }
272
+ })
273
+ })
274
+
275
+ /**
276
+ * Add a fiber to the FiberMap. When the fiber completes, it will be removed from the FiberMap.
277
+ * If the key already exists in the FiberMap, the previous fiber will be interrupted.
278
+ *
279
+ * @since 2.0.0
280
+ * @categories combinators
281
+ */
282
+ export const set: {
283
+ <K, A, E, XE extends E, XA extends A>(
284
+ key: K,
285
+ fiber: Fiber.RuntimeFiber<XA, XE>,
286
+ options?: {
287
+ readonly onlyIfMissing?: boolean | undefined
288
+ readonly propagateInterruption?: boolean | undefined
289
+ } | undefined
290
+ ): (self: FiberMap<K, A, E>) => Effect.Effect<void>
291
+ <K, A, E, XE extends E, XA extends A>(
292
+ self: FiberMap<K, A, E>,
293
+ key: K,
294
+ fiber: Fiber.RuntimeFiber<XA, XE>,
295
+ options?: {
296
+ readonly onlyIfMissing?: boolean | undefined
297
+ readonly propagateInterruption?: boolean | undefined
298
+ } | undefined
299
+ ): Effect.Effect<void>
300
+ } = dual((args) => isFiberMap(args[0]), <K, A, E, XE extends E, XA extends A>(
301
+ self: FiberMap<K, A, E>,
302
+ key: K,
303
+ fiber: Fiber.RuntimeFiber<XA, XE>,
304
+ options?: {
305
+ readonly onlyIfMissing?: boolean | undefined
306
+ readonly propagateInterruption?: boolean | undefined
307
+ } | undefined
308
+ ): Effect.Effect<void> =>
309
+ Effect.fiberIdWith(
310
+ (fiberId) =>
311
+ Effect.sync(() =>
312
+ unsafeSet(self, key, fiber, {
313
+ ...options,
314
+ interruptAs: fiberId
315
+ })
316
+ )
317
+ ))
318
+
319
+ /**
320
+ * Retrieve a fiber from the FiberMap.
321
+ *
322
+ * @since 2.0.0
323
+ * @categories combinators
324
+ */
325
+ export const unsafeGet: {
326
+ <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Option.Option<Fiber.RuntimeFiber<A, E>>
327
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): Option.Option<Fiber.RuntimeFiber<A, E>>
328
+ } = dual<
329
+ <K>(
330
+ key: K
331
+ ) => <A, E>(self: FiberMap<K, A, E>) => Option.Option<Fiber.RuntimeFiber<A, E>>,
332
+ <K, A, E>(
333
+ self: FiberMap<K, A, E>,
334
+ key: K
335
+ ) => Option.Option<Fiber.RuntimeFiber<A, E>>
336
+ >(2, (self, key) => self.state._tag === "Closed" ? Option.none() : MutableHashMap.get(self.state.backing, key))
337
+
338
+ /**
339
+ * Retrieve a fiber from the FiberMap.
340
+ *
341
+ * @since 2.0.0
342
+ * @categories combinators
343
+ */
344
+ export const get: {
345
+ <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>
346
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>
347
+ } = dual<
348
+ <K>(
349
+ key: K
350
+ ) => <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>,
351
+ <K, A, E>(
352
+ self: FiberMap<K, A, E>,
353
+ key: K
354
+ ) => Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>
355
+ >(2, (self, key) => Effect.suspend(() => unsafeGet(self, key)))
356
+
357
+ /**
358
+ * Check if a key exists in the FiberMap.
359
+ *
360
+ * @since 2.0.0
361
+ * @categories combinators
362
+ */
363
+ export const unsafeHas: {
364
+ <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => boolean
365
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): boolean
366
+ } = dual(
367
+ 2,
368
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): boolean =>
369
+ self.state._tag === "Closed" ? false : MutableHashMap.has(self.state.backing, key)
370
+ )
371
+
372
+ /**
373
+ * Check if a key exists in the FiberMap.
374
+ *
375
+ * @since 2.0.0
376
+ * @categories combinators
377
+ */
378
+ export const has: {
379
+ <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<boolean>
380
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<boolean>
381
+ } = dual(
382
+ 2,
383
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<boolean> => Effect.sync(() => unsafeHas(self, key))
384
+ )
385
+
386
+ /**
387
+ * Remove a fiber from the FiberMap, interrupting it if it exists.
388
+ *
389
+ * @since 2.0.0
390
+ * @categories combinators
391
+ */
392
+ export const remove: {
393
+ <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<void>
394
+ <K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<void>
395
+ } = dual<
396
+ <K>(
397
+ key: K
398
+ ) => <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<void>,
399
+ <K, A, E>(
400
+ self: FiberMap<K, A, E>,
401
+ key: K
402
+ ) => Effect.Effect<void>
403
+ >(2, (self, key) =>
404
+ Effect.withFiberRuntime((removeFiber) => {
405
+ if (self.state._tag === "Closed") {
406
+ return Effect.void
407
+ }
408
+ const fiber = MutableHashMap.get(self.state.backing, key)
409
+ if (fiber._tag === "None") {
410
+ return Effect.void
411
+ }
412
+ // will be removed by the observer
413
+ return Fiber.interruptAs(fiber.value, FiberId.combine(removeFiber.id(), internalFiberId))
414
+ }))
415
+
416
+ /**
417
+ * @since 2.0.0
418
+ * @categories combinators
419
+ */
420
+ export const clear = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<void> =>
421
+ Effect.withFiberRuntime((clearFiber) => {
422
+ if (self.state._tag === "Closed") {
423
+ return Effect.void
424
+ }
425
+
426
+ return Effect.forEach(self.state.backing, ([, fiber]) =>
427
+ // will be removed by the observer
428
+ Fiber.interruptAs(fiber, FiberId.combine(clearFiber.id(), internalFiberId)))
429
+ })
430
+
431
+ const constInterruptedFiber = (function() {
432
+ let fiber: Fiber.RuntimeFiber<never, never> | undefined = undefined
433
+ return () => {
434
+ if (fiber === undefined) {
435
+ fiber = Effect.runFork(Effect.interrupt)
436
+ }
437
+ return fiber
438
+ }
439
+ })()
440
+
441
+ /**
442
+ * Run an Effect and add the forked fiber to the FiberMap.
443
+ * When the fiber completes, it will be removed from the FiberMap.
444
+ *
445
+ * @since 2.0.0
446
+ * @categories combinators
447
+ */
448
+ export const run: {
449
+ <K, A, E>(
450
+ self: FiberMap<K, A, E>,
451
+ key: K,
452
+ options?: {
453
+ readonly onlyIfMissing?: boolean | undefined
454
+ readonly propagateInterruption?: boolean | undefined
455
+ } | undefined
456
+ ): <R, XE extends E, XA extends A>(
457
+ effect: Effect.Effect<XA, XE, R>
458
+ ) => Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R>
459
+ <K, A, E, R, XE extends E, XA extends A>(
460
+ self: FiberMap<K, A, E>,
461
+ key: K,
462
+ effect: Effect.Effect<XA, XE, R>,
463
+ options?: {
464
+ readonly onlyIfMissing?: boolean | undefined
465
+ readonly propagateInterruption?: boolean | undefined
466
+ } | undefined
467
+ ): Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R>
468
+ } = function() {
469
+ const self = arguments[0]
470
+ if (Effect.isEffect(arguments[2])) {
471
+ return runImpl(self, arguments[1], arguments[2], arguments[3]) as any
472
+ }
473
+ const key = arguments[1]
474
+ const options = arguments[2]
475
+ return (effect: Effect.Effect<any, any, any>) => runImpl(self, key, effect, options)
476
+ }
477
+
478
+ const runImpl = <K, A, E, R, XE extends E, XA extends A>(
479
+ self: FiberMap<K, A, E>,
480
+ key: K,
481
+ effect: Effect.Effect<XA, XE, R>,
482
+ options?: {
483
+ readonly onlyIfMissing?: boolean
484
+ readonly propagateInterruption?: boolean | undefined
485
+ }
486
+ ) =>
487
+ Effect.withFiberRuntime((parent) => {
488
+ if (self.state._tag === "Closed") {
489
+ return Effect.interrupt
490
+ } else if (options?.onlyIfMissing === true && unsafeHas(self, key)) {
491
+ return Effect.sync(constInterruptedFiber)
492
+ }
493
+ const runtime = Runtime.make<R>({
494
+ context: parent.currentContext as any,
495
+ fiberRefs: parent.getFiberRefs(),
496
+ runtimeFlags: Runtime.defaultRuntime.runtimeFlags
497
+ })
498
+ const fiber = Runtime.runFork(runtime)(effect)
499
+ unsafeSet(self, key, fiber, { ...options, interruptAs: parent.id() })
500
+ return Effect.succeed(fiber)
501
+ })
502
+
503
+ /**
504
+ * Capture a Runtime and use it to fork Effect's, adding the forked fibers to the FiberMap.
505
+ *
506
+ * @example
507
+ * ```ts
508
+ * import { Context, Effect, FiberMap } from "effect"
509
+ *
510
+ * interface Users {
511
+ * readonly _: unique symbol
512
+ * }
513
+ * const Users = Context.GenericTag<Users, {
514
+ * getAll: Effect.Effect<Array<unknown>>
515
+ * }>("Users")
516
+ *
517
+ * Effect.gen(function*() {
518
+ * const map = yield* FiberMap.make<string>()
519
+ * const run = yield* FiberMap.runtime(map)<Users>()
520
+ *
521
+ * // run some effects and add the fibers to the map
522
+ * run("effect-a", Effect.andThen(Users, _ => _.getAll))
523
+ * run("effect-b", Effect.andThen(Users, _ => _.getAll))
524
+ * }).pipe(
525
+ * Effect.scoped // The fibers will be interrupted when the scope is closed
526
+ * )
527
+ * ```
528
+ *
529
+ * @since 2.0.0
530
+ * @categories combinators
531
+ */
532
+ export const runtime: <K, A, E>(
533
+ self: FiberMap<K, A, E>
534
+ ) => <R = never>() => Effect.Effect<
535
+ <XE extends E, XA extends A>(
536
+ key: K,
537
+ effect: Effect.Effect<XA, XE, R>,
538
+ options?:
539
+ | Runtime.RunForkOptions & {
540
+ readonly onlyIfMissing?: boolean | undefined
541
+ readonly propagateInterruption?: boolean | undefined
542
+ }
543
+ | undefined
544
+ ) => Fiber.RuntimeFiber<XA, XE>,
545
+ never,
546
+ R
547
+ > = <K, A, E>(self: FiberMap<K, A, E>) => <R>() =>
548
+ Effect.map(
549
+ Effect.runtime<R>(),
550
+ (runtime) => {
551
+ const runFork = Runtime.runFork(runtime)
552
+ return <XE extends E, XA extends A>(
553
+ key: K,
554
+ effect: Effect.Effect<XA, XE, R>,
555
+ options?:
556
+ | Runtime.RunForkOptions & {
557
+ readonly onlyIfMissing?: boolean | undefined
558
+ readonly propagateInterruption?: boolean | undefined
559
+ }
560
+ | undefined
561
+ ) => {
562
+ if (self.state._tag === "Closed") {
563
+ return constInterruptedFiber()
564
+ } else if (options?.onlyIfMissing === true && unsafeHas(self, key)) {
565
+ return constInterruptedFiber()
566
+ }
567
+ const fiber = runFork(effect, options)
568
+ unsafeSet(self, key, fiber, options)
569
+ return fiber
570
+ }
571
+ }
572
+ )
573
+
574
+ /**
575
+ * Capture a Runtime and use it to fork Effect's, adding the forked fibers to the FiberMap.
576
+ *
577
+ * @since 3.13.0
578
+ * @categories combinators
579
+ */
580
+ export const runtimePromise = <K, A, E>(self: FiberMap<K, A, E>): <R = never>() => Effect.Effect<
581
+ <XE extends E, XA extends A>(
582
+ key: K,
583
+ effect: Effect.Effect<XA, XE, R>,
584
+ options?:
585
+ | Runtime.RunForkOptions & {
586
+ readonly onlyIfMissing?: boolean | undefined
587
+ readonly propagateInterruption?: boolean | undefined
588
+ }
589
+ | undefined
590
+ ) => Promise<XA>,
591
+ never,
592
+ R
593
+ > =>
594
+ <R>() =>
595
+ Effect.map(
596
+ runtime(self)<R>(),
597
+ (runFork) =>
598
+ <XE extends E, XA extends A>(
599
+ key: K,
600
+ effect: Effect.Effect<XA, XE, R>,
601
+ options?:
602
+ | Runtime.RunForkOptions & { readonly propagateInterruption?: boolean | undefined }
603
+ | undefined
604
+ ): Promise<XA> =>
605
+ new Promise((resolve, reject) =>
606
+ runFork(key, effect, options).addObserver((exit) => {
607
+ if (Exit.isSuccess(exit)) {
608
+ resolve(exit.value)
609
+ } else {
610
+ reject(Cause.squash(exit.cause))
611
+ }
612
+ })
613
+ )
614
+ )
615
+
616
+ /**
617
+ * @since 2.0.0
618
+ * @categories combinators
619
+ */
620
+ export const size = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<number> =>
621
+ Effect.sync(() => self.state._tag === "Closed" ? 0 : MutableHashMap.size(self.state.backing))
622
+
623
+ /**
624
+ * Join all fibers in the FiberMap. If any of the Fiber's in the map terminate with a failure,
625
+ * the returned Effect will terminate with the first failure that occurred.
626
+ *
627
+ * @since 2.0.0
628
+ * @categories combinators
629
+ * @example
630
+ * ```ts
631
+ * import { Effect, FiberMap } from "effect";
632
+ *
633
+ * Effect.gen(function* (_) {
634
+ * const map = yield* _(FiberMap.make());
635
+ * yield* _(FiberMap.set(map, "a", Effect.runFork(Effect.fail("error"))));
636
+ *
637
+ * // parent fiber will fail with "error"
638
+ * yield* _(FiberMap.join(map));
639
+ * });
640
+ * ```
641
+ */
642
+ export const join = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<void, E> =>
643
+ Deferred.await(self.deferred as Deferred.Deferred<void, E>)
644
+
645
+ /**
646
+ * Wait for the FiberMap to be empty.
647
+ *
648
+ * @since 3.13.0
649
+ * @categories combinators
650
+ */
651
+ export const awaitEmpty = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<void, E> =>
652
+ Effect.whileLoop({
653
+ while: () => self.state._tag === "Open" && MutableHashMap.size(self.state.backing) > 0,
654
+ body: () => Fiber.await(Iterable.unsafeHead(self)[1]),
655
+ step: constVoid
656
+ })