@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,561 @@
1
+ import * as Arr from "../Array.js"
2
+ import type { Cause } from "../Cause.js"
3
+ import { NoSuchElementException } from "../Cause.js"
4
+ import type { Channel } from "../Channel.js"
5
+ import * as Chunk from "../Chunk.js"
6
+ import type { Effect } from "../Effect.js"
7
+ import * as Effectable from "../Effectable.js"
8
+ import type { Exit } from "../Exit.js"
9
+ import { dual } from "../Function.js"
10
+ import * as Inspectable from "../Inspectable.js"
11
+ import type * as Api from "../Mailbox.js"
12
+ import * as Option from "../Option.js"
13
+ import { pipeArguments } from "../Pipeable.js"
14
+ import { hasProperty } from "../Predicate.js"
15
+ import type { Scheduler } from "../Scheduler.js"
16
+ import type { Scope } from "../Scope.js"
17
+ import type { Stream } from "../Stream.js"
18
+ import * as channel from "./channel.js"
19
+ import * as channelExecutor from "./channel/channelExecutor.js"
20
+ import * as coreChannel from "./core-stream.js"
21
+ import * as core from "./core.js"
22
+ import * as circular from "./effect/circular.js"
23
+ import * as fiberRuntime from "./fiberRuntime.js"
24
+ import * as stream from "./stream.js"
25
+
26
+ /** @internal */
27
+ export const TypeId: Api.TypeId = Symbol.for("effect/Mailbox") as Api.TypeId
28
+
29
+ /** @internal */
30
+ export const ReadonlyTypeId: Api.ReadonlyTypeId = Symbol.for("effect/Mailbox/ReadonlyMailbox") as Api.ReadonlyTypeId
31
+
32
+ /** @internal */
33
+ export const isMailbox = (u: unknown): u is Api.Mailbox<unknown, unknown> => hasProperty(u, TypeId)
34
+
35
+ /** @internal */
36
+ export const isReadonlyMailbox = (u: unknown): u is Api.ReadonlyMailbox<unknown, unknown> =>
37
+ hasProperty(u, ReadonlyTypeId)
38
+
39
+ type MailboxState<A, E> = {
40
+ readonly _tag: "Open"
41
+ readonly takers: Set<(_: Effect<void, E>) => void>
42
+ readonly offers: Set<OfferEntry<A>>
43
+ readonly awaiters: Set<(_: Effect<void, E>) => void>
44
+ } | {
45
+ readonly _tag: "Closing"
46
+ readonly takers: Set<(_: Effect<void, E>) => void>
47
+ readonly offers: Set<OfferEntry<A>>
48
+ readonly awaiters: Set<(_: Effect<void, E>) => void>
49
+ readonly exit: Exit<void, E>
50
+ } | {
51
+ readonly _tag: "Done"
52
+ readonly exit: Exit<void, E>
53
+ }
54
+
55
+ type OfferEntry<A> = {
56
+ readonly _tag: "Array"
57
+ readonly remaining: Array<A>
58
+ offset: number
59
+ readonly resume: (_: Effect<Chunk.Chunk<A>>) => void
60
+ } | {
61
+ readonly _tag: "Single"
62
+ readonly message: A
63
+ readonly resume: (_: Effect<boolean>) => void
64
+ }
65
+
66
+ const empty = Chunk.empty()
67
+ const exitEmpty = core.exitSucceed(empty)
68
+ const exitFalse = core.exitSucceed(false)
69
+ const exitTrue = core.exitSucceed(true)
70
+ const constDone = [empty, true] as const
71
+
72
+ class MailboxImpl<A, E> extends Effectable.Class<readonly [messages: Chunk.Chunk<A>, done: boolean], E>
73
+ implements Api.Mailbox<A, E>
74
+ {
75
+ readonly [TypeId]: Api.TypeId = TypeId
76
+ readonly [ReadonlyTypeId]: Api.ReadonlyTypeId = ReadonlyTypeId
77
+ private state: MailboxState<A, E> = {
78
+ _tag: "Open",
79
+ takers: new Set(),
80
+ offers: new Set(),
81
+ awaiters: new Set()
82
+ }
83
+ private messages: Array<A> = []
84
+ private messagesChunk = Chunk.empty<A>()
85
+ constructor(
86
+ readonly scheduler: Scheduler,
87
+ private capacity: number,
88
+ readonly strategy: "suspend" | "dropping" | "sliding"
89
+ ) {
90
+ super()
91
+ }
92
+
93
+ offer(message: A): Effect<boolean> {
94
+ return core.suspend(() => {
95
+ if (this.state._tag !== "Open") {
96
+ return exitFalse
97
+ } else if (this.messages.length + this.messagesChunk.length >= this.capacity) {
98
+ switch (this.strategy) {
99
+ case "dropping":
100
+ return exitFalse
101
+ case "suspend":
102
+ if (this.capacity <= 0 && this.state.takers.size > 0) {
103
+ this.messages.push(message)
104
+ this.releaseTaker()
105
+ return exitTrue
106
+ }
107
+ return this.offerRemainingSingle(message)
108
+ case "sliding":
109
+ this.unsafeTake()
110
+ this.messages.push(message)
111
+ return exitTrue
112
+ }
113
+ }
114
+ this.messages.push(message)
115
+ this.scheduleReleaseTaker()
116
+ return exitTrue
117
+ })
118
+ }
119
+ unsafeOffer(message: A): boolean {
120
+ if (this.state._tag !== "Open") {
121
+ return false
122
+ } else if (this.messages.length + this.messagesChunk.length >= this.capacity) {
123
+ if (this.strategy === "sliding") {
124
+ this.unsafeTake()
125
+ this.messages.push(message)
126
+ return true
127
+ } else if (this.capacity <= 0 && this.state.takers.size > 0) {
128
+ this.messages.push(message)
129
+ this.releaseTaker()
130
+ return true
131
+ }
132
+ return false
133
+ }
134
+ this.messages.push(message)
135
+ this.scheduleReleaseTaker()
136
+ return true
137
+ }
138
+ offerAll(messages: Iterable<A>): Effect<Chunk.Chunk<A>> {
139
+ return core.suspend(() => {
140
+ if (this.state._tag !== "Open") {
141
+ return core.succeed(Chunk.fromIterable(messages))
142
+ }
143
+ const remaining = this.unsafeOfferAllArray(messages)
144
+ if (remaining.length === 0) {
145
+ return exitEmpty
146
+ } else if (this.strategy === "dropping") {
147
+ return core.succeed(Chunk.unsafeFromArray(remaining))
148
+ }
149
+ return this.offerRemainingArray(remaining)
150
+ })
151
+ }
152
+ unsafeOfferAll(messages: Iterable<A>): Chunk.Chunk<A> {
153
+ return Chunk.unsafeFromArray(this.unsafeOfferAllArray(messages))
154
+ }
155
+ unsafeOfferAllArray(messages: Iterable<A>): Array<A> {
156
+ if (this.state._tag !== "Open") {
157
+ return Arr.fromIterable(messages)
158
+ } else if (this.capacity === Number.POSITIVE_INFINITY || this.strategy === "sliding") {
159
+ if (this.messages.length > 0) {
160
+ this.messagesChunk = Chunk.appendAll(this.messagesChunk, Chunk.unsafeFromArray(this.messages))
161
+ }
162
+ if (this.strategy === "sliding") {
163
+ this.messagesChunk = this.messagesChunk.pipe(
164
+ Chunk.appendAll(Chunk.fromIterable(messages)),
165
+ Chunk.takeRight(this.capacity)
166
+ )
167
+ } else if (Chunk.isChunk(messages)) {
168
+ this.messagesChunk = Chunk.appendAll(this.messagesChunk, messages)
169
+ } else {
170
+ this.messages = Arr.fromIterable(messages)
171
+ }
172
+ this.scheduleReleaseTaker()
173
+ return []
174
+ }
175
+ const free = this.capacity <= 0
176
+ ? this.state.takers.size
177
+ : this.capacity - this.messages.length - this.messagesChunk.length
178
+ if (free === 0) {
179
+ return Arr.fromIterable(messages)
180
+ }
181
+ const remaining: Array<A> = []
182
+ let i = 0
183
+ for (const message of messages) {
184
+ if (i < free) {
185
+ this.messages.push(message)
186
+ } else {
187
+ remaining.push(message)
188
+ }
189
+ i++
190
+ }
191
+ this.scheduleReleaseTaker()
192
+ return remaining
193
+ }
194
+ fail(error: E) {
195
+ return this.done(core.exitFail(error))
196
+ }
197
+ failCause(cause: Cause<E>) {
198
+ return this.done(core.exitFailCause(cause))
199
+ }
200
+ unsafeDone(exit: Exit<void, E>): boolean {
201
+ if (this.state._tag !== "Open") {
202
+ return false
203
+ } else if (this.state.offers.size === 0 && this.messages.length === 0 && this.messagesChunk.length === 0) {
204
+ this.finalize(exit)
205
+ return true
206
+ }
207
+ this.state = { ...this.state, _tag: "Closing", exit }
208
+ return true
209
+ }
210
+ shutdown: Effect<boolean> = core.sync(() => {
211
+ if (this.state._tag === "Done") {
212
+ return true
213
+ }
214
+ this.messages = []
215
+ this.messagesChunk = empty
216
+ const offers = this.state.offers
217
+ this.finalize(this.state._tag === "Open" ? core.exitVoid : this.state.exit)
218
+ if (offers.size > 0) {
219
+ for (const entry of offers) {
220
+ if (entry._tag === "Single") {
221
+ entry.resume(exitFalse)
222
+ } else {
223
+ entry.resume(core.exitSucceed(Chunk.unsafeFromArray(entry.remaining.slice(entry.offset))))
224
+ }
225
+ }
226
+ offers.clear()
227
+ }
228
+ return true
229
+ })
230
+ done(exit: Exit<void, E>) {
231
+ return core.sync(() => this.unsafeDone(exit))
232
+ }
233
+ end = this.done(core.exitVoid)
234
+ clear: Effect<Chunk.Chunk<A>, E> = core.suspend(() => {
235
+ if (this.state._tag === "Done") {
236
+ return core.exitAs(this.state.exit, empty)
237
+ }
238
+ const messages = this.unsafeTakeAll()
239
+ this.releaseCapacity()
240
+ return core.succeed(messages)
241
+ })
242
+ takeAll: Effect<readonly [messages: Chunk.Chunk<A>, done: boolean], E> = core.suspend(() => {
243
+ if (this.state._tag === "Done") {
244
+ return core.exitAs(this.state.exit, constDone)
245
+ }
246
+ const messages = this.unsafeTakeAll()
247
+ if (messages.length === 0) {
248
+ return core.zipRight(this.awaitTake, this.takeAll)
249
+ }
250
+ return core.succeed([messages, this.releaseCapacity()])
251
+ })
252
+ takeN(n: number): Effect<readonly [messages: Chunk.Chunk<A>, done: boolean], E> {
253
+ return core.suspend(() => {
254
+ if (this.state._tag === "Done") {
255
+ return core.exitAs(this.state.exit, constDone)
256
+ } else if (n <= 0) {
257
+ return core.succeed([empty, false])
258
+ }
259
+ n = Math.min(n, this.capacity)
260
+ let messages: Chunk.Chunk<A>
261
+ if (n <= this.messagesChunk.length) {
262
+ messages = Chunk.take(this.messagesChunk, n)
263
+ this.messagesChunk = Chunk.drop(this.messagesChunk, n)
264
+ } else if (n <= this.messages.length + this.messagesChunk.length) {
265
+ this.messagesChunk = Chunk.appendAll(this.messagesChunk, Chunk.unsafeFromArray(this.messages))
266
+ this.messages = []
267
+ messages = Chunk.take(this.messagesChunk, n)
268
+ this.messagesChunk = Chunk.drop(this.messagesChunk, n)
269
+ } else {
270
+ return core.zipRight(this.awaitTake, this.takeN(n))
271
+ }
272
+ return core.succeed([messages, this.releaseCapacity()])
273
+ })
274
+ }
275
+ unsafeTake(): Exit<A, E | NoSuchElementException> | undefined {
276
+ if (this.state._tag === "Done") {
277
+ return core.exitZipRight(this.state.exit, core.exitFail(new NoSuchElementException()))
278
+ }
279
+ let message: A
280
+ if (this.messagesChunk.length > 0) {
281
+ message = Chunk.unsafeHead(this.messagesChunk)
282
+ this.messagesChunk = Chunk.drop(this.messagesChunk, 1)
283
+ } else if (this.messages.length > 0) {
284
+ message = this.messages[0]
285
+ this.messagesChunk = Chunk.drop(Chunk.unsafeFromArray(this.messages), 1)
286
+ this.messages = []
287
+ } else if (this.capacity <= 0 && this.state.offers.size > 0) {
288
+ this.capacity = 1
289
+ this.releaseCapacity()
290
+ this.capacity = 0
291
+ return this.messages.length > 0 ? core.exitSucceed(this.messages.pop()!) : undefined
292
+ } else {
293
+ return undefined
294
+ }
295
+ this.releaseCapacity()
296
+ return core.exitSucceed(message)
297
+ }
298
+ take: Effect<A, E | NoSuchElementException> = core.suspend(() =>
299
+ this.unsafeTake() ?? core.zipRight(this.awaitTake, this.take)
300
+ )
301
+ await: Effect<void, E> = core.asyncInterrupt<void, E>((resume) => {
302
+ if (this.state._tag === "Done") {
303
+ return resume(this.state.exit)
304
+ }
305
+ this.state.awaiters.add(resume)
306
+ return core.sync(() => {
307
+ if (this.state._tag !== "Done") {
308
+ this.state.awaiters.delete(resume)
309
+ }
310
+ })
311
+ })
312
+ unsafeSize(): Option.Option<number> {
313
+ const size = this.messages.length + this.messagesChunk.length
314
+ return this.state._tag === "Done" ? Option.none() : Option.some(size)
315
+ }
316
+ size = core.sync(() => this.unsafeSize())
317
+
318
+ commit() {
319
+ return this.takeAll
320
+ }
321
+ pipe() {
322
+ return pipeArguments(this, arguments)
323
+ }
324
+ toJSON() {
325
+ return {
326
+ _id: "effect/Mailbox",
327
+ state: this.state._tag,
328
+ size: this.unsafeSize().toJSON()
329
+ }
330
+ }
331
+ toString(): string {
332
+ return Inspectable.format(this)
333
+ }
334
+ [Inspectable.NodeInspectSymbol]() {
335
+ return Inspectable.format(this)
336
+ }
337
+
338
+ private offerRemainingSingle(message: A) {
339
+ return core.asyncInterrupt<boolean>((resume) => {
340
+ if (this.state._tag !== "Open") {
341
+ return resume(exitFalse)
342
+ }
343
+ const entry: OfferEntry<A> = { _tag: "Single", message, resume }
344
+ this.state.offers.add(entry)
345
+ return core.sync(() => {
346
+ if (this.state._tag === "Open") {
347
+ this.state.offers.delete(entry)
348
+ }
349
+ })
350
+ })
351
+ }
352
+ private offerRemainingArray(remaining: Array<A>) {
353
+ return core.asyncInterrupt<Chunk.Chunk<A>>((resume) => {
354
+ if (this.state._tag !== "Open") {
355
+ return resume(core.exitSucceed(Chunk.unsafeFromArray(remaining)))
356
+ }
357
+ const entry: OfferEntry<A> = { _tag: "Array", remaining, offset: 0, resume }
358
+ this.state.offers.add(entry)
359
+ return core.sync(() => {
360
+ if (this.state._tag === "Open") {
361
+ this.state.offers.delete(entry)
362
+ }
363
+ })
364
+ })
365
+ }
366
+ private releaseCapacity(): boolean {
367
+ if (this.state._tag === "Done") {
368
+ return this.state.exit._tag === "Success"
369
+ } else if (this.state.offers.size === 0) {
370
+ if (this.state._tag === "Closing" && this.messages.length === 0 && this.messagesChunk.length === 0) {
371
+ this.finalize(this.state.exit)
372
+ return this.state.exit._tag === "Success"
373
+ }
374
+ return false
375
+ }
376
+ let n = this.capacity - this.messages.length - this.messagesChunk.length
377
+ for (const entry of this.state.offers) {
378
+ if (n === 0) return false
379
+ else if (entry._tag === "Single") {
380
+ this.messages.push(entry.message)
381
+ n--
382
+ entry.resume(exitTrue)
383
+ this.state.offers.delete(entry)
384
+ } else {
385
+ for (; entry.offset < entry.remaining.length; entry.offset++) {
386
+ if (n === 0) return false
387
+ this.messages.push(entry.remaining[entry.offset])
388
+ n--
389
+ }
390
+ entry.resume(exitEmpty)
391
+ this.state.offers.delete(entry)
392
+ }
393
+ }
394
+ return false
395
+ }
396
+ private awaitTake = core.asyncInterrupt<void, E>((resume) => {
397
+ if (this.state._tag === "Done") {
398
+ return resume(this.state.exit)
399
+ }
400
+ this.state.takers.add(resume)
401
+ return core.sync(() => {
402
+ if (this.state._tag !== "Done") {
403
+ this.state.takers.delete(resume)
404
+ }
405
+ })
406
+ })
407
+
408
+ private scheduleRunning = false
409
+ private scheduleReleaseTaker() {
410
+ if (this.scheduleRunning) {
411
+ return
412
+ }
413
+ this.scheduleRunning = true
414
+ this.scheduler.scheduleTask(this.releaseTaker, 0)
415
+ }
416
+ private releaseTaker = () => {
417
+ this.scheduleRunning = false
418
+ if (this.state._tag === "Done") {
419
+ return
420
+ } else if (this.state.takers.size === 0) {
421
+ return
422
+ }
423
+ for (const taker of this.state.takers) {
424
+ this.state.takers.delete(taker)
425
+ taker(core.exitVoid)
426
+ if (this.messages.length + this.messagesChunk.length === 0) {
427
+ break
428
+ }
429
+ }
430
+ }
431
+
432
+ private unsafeTakeAll() {
433
+ if (this.messagesChunk.length > 0) {
434
+ const messages = this.messages.length > 0 ?
435
+ Chunk.appendAll(this.messagesChunk, Chunk.unsafeFromArray(this.messages)) :
436
+ this.messagesChunk
437
+ this.messagesChunk = empty
438
+ this.messages = []
439
+ return messages
440
+ } else if (this.messages.length > 0) {
441
+ const messages = Chunk.unsafeFromArray(this.messages)
442
+ this.messages = []
443
+ return messages
444
+ } else if (this.state._tag !== "Done" && this.state.offers.size > 0) {
445
+ this.capacity = 1
446
+ this.releaseCapacity()
447
+ this.capacity = 0
448
+ return Chunk.of(this.messages.pop()!)
449
+ }
450
+ return empty
451
+ }
452
+
453
+ private finalize(exit: Exit<void, E>) {
454
+ if (this.state._tag === "Done") {
455
+ return
456
+ }
457
+ const openState = this.state
458
+ this.state = { _tag: "Done", exit }
459
+ for (const taker of openState.takers) {
460
+ taker(exit)
461
+ }
462
+ openState.takers.clear()
463
+ for (const awaiter of openState.awaiters) {
464
+ awaiter(exit)
465
+ }
466
+ openState.awaiters.clear()
467
+ }
468
+ }
469
+
470
+ /** @internal */
471
+ export const make = <A, E = never>(
472
+ capacity?: number | {
473
+ readonly capacity?: number | undefined
474
+ readonly strategy?: "suspend" | "dropping" | "sliding" | undefined
475
+ } | undefined
476
+ ): Effect<Api.Mailbox<A, E>> =>
477
+ core.withFiberRuntime((fiber) =>
478
+ core.succeed(
479
+ new MailboxImpl<A, E>(
480
+ fiber.currentScheduler,
481
+ typeof capacity === "number" ? capacity : capacity?.capacity ?? Number.POSITIVE_INFINITY,
482
+ typeof capacity === "number" ? "suspend" : capacity?.strategy ?? "suspend"
483
+ )
484
+ )
485
+ )
486
+
487
+ /** @internal */
488
+ export const into: {
489
+ <A, E>(
490
+ self: Api.Mailbox<A, E>
491
+ ): <AX, EX extends E, RX>(effect: Effect<AX, EX, RX>) => Effect<boolean, never, RX>
492
+ <AX, E, EX extends E, RX, A>(
493
+ effect: Effect<AX, EX, RX>,
494
+ self: Api.Mailbox<A, E>
495
+ ): Effect<boolean, never, RX>
496
+ } = dual(
497
+ 2,
498
+ <AX, E, EX extends E, RX, A>(
499
+ effect: Effect<AX, EX, RX>,
500
+ self: Api.Mailbox<A, E>
501
+ ): Effect<boolean, never, RX> =>
502
+ core.uninterruptibleMask((restore) =>
503
+ core.matchCauseEffect(restore(effect), {
504
+ onFailure: (cause) => self.failCause(cause),
505
+ onSuccess: (_) => self.end
506
+ })
507
+ )
508
+ )
509
+
510
+ /** @internal */
511
+ export const toChannel = <A, E>(self: Api.ReadonlyMailbox<A, E>): Channel<Chunk.Chunk<A>, unknown, E> => {
512
+ const loop: Channel<Chunk.Chunk<A>, unknown, E> = coreChannel.flatMap(self.takeAll, ([messages, done]) =>
513
+ done
514
+ ? messages.length === 0 ? coreChannel.void : coreChannel.write(messages)
515
+ : channel.zipRight(coreChannel.write(messages), loop))
516
+ return loop
517
+ }
518
+
519
+ /** @internal */
520
+ export const toStream = <A, E>(self: Api.ReadonlyMailbox<A, E>): Stream<A, E> => stream.fromChannel(toChannel(self))
521
+
522
+ /** @internal */
523
+ export const fromStream: {
524
+ (options?: {
525
+ readonly capacity?: number | undefined
526
+ readonly strategy?: "suspend" | "dropping" | "sliding" | undefined
527
+ }): <A, E, R>(self: Stream<A, E, R>) => Effect<Api.ReadonlyMailbox<A, E>, never, R | Scope>
528
+ <A, E, R>(
529
+ self: Stream<A, E, R>,
530
+ options?: {
531
+ readonly capacity?: number | undefined
532
+ readonly strategy?: "suspend" | "dropping" | "sliding" | undefined
533
+ }
534
+ ): Effect<Api.ReadonlyMailbox<A, E>, never, R | Scope>
535
+ } = dual((args) => stream.isStream(args[0]), <A, E, R>(
536
+ self: Stream<A, E, R>,
537
+ options?: {
538
+ readonly capacity?: number | undefined
539
+ readonly strategy?: "suspend" | "dropping" | "sliding" | undefined
540
+ }
541
+ ): Effect<Api.ReadonlyMailbox<A, E>, never, R | Scope> =>
542
+ core.tap(
543
+ fiberRuntime.acquireRelease(
544
+ make<A, E>(options),
545
+ (mailbox) => mailbox.shutdown
546
+ ),
547
+ (mailbox) => {
548
+ const writer: Channel<never, Chunk.Chunk<A>, never, E> = coreChannel.readWithCause({
549
+ onInput: (input: Chunk.Chunk<A>) => coreChannel.flatMap(mailbox.offerAll(input), () => writer),
550
+ onFailure: (cause: Cause<E>) => mailbox.failCause(cause),
551
+ onDone: () => mailbox.end
552
+ })
553
+ return fiberRuntime.scopeWith((scope) =>
554
+ stream.toChannel(self).pipe(
555
+ coreChannel.pipeTo(writer),
556
+ channelExecutor.runIn(scope),
557
+ circular.forkIn(scope)
558
+ )
559
+ )
560
+ }
561
+ ))
@@ -0,0 +1,6 @@
1
+ import type * as M from "../../ManagedRuntime.js"
2
+
3
+ // circular with Layer
4
+
5
+ /** @internal */
6
+ export const TypeId: M.TypeId = Symbol.for("effect/ManagedRuntime") as M.TypeId
@@ -0,0 +1,134 @@
1
+ import type * as Effect from "../Effect.js"
2
+ import * as Effectable from "../Effectable.js"
3
+ import type { Exit } from "../Exit.js"
4
+ import type * as Fiber from "../Fiber.js"
5
+ import type * as Layer from "../Layer.js"
6
+ import type * as M from "../ManagedRuntime.js"
7
+ import { pipeArguments } from "../Pipeable.js"
8
+ import { hasProperty } from "../Predicate.js"
9
+ import type * as Runtime from "../Runtime.js"
10
+ import * as Scope from "../Scope.js"
11
+ import type { Mutable } from "../Types.js"
12
+ import * as core from "./core.js"
13
+ import * as fiberRuntime from "./fiberRuntime.js"
14
+ import * as internalLayer from "./layer.js"
15
+ import * as circular from "./managedRuntime/circular.js"
16
+ import * as internalRuntime from "./runtime.js"
17
+
18
+ interface ManagedRuntimeImpl<R, E> extends M.ManagedRuntime<R, E> {
19
+ readonly scope: Scope.CloseableScope
20
+ cachedRuntime: Runtime.Runtime<R> | undefined
21
+ }
22
+
23
+ /** @internal */
24
+ export const isManagedRuntime = (u: unknown): u is M.ManagedRuntime<unknown, unknown> => hasProperty(u, circular.TypeId)
25
+
26
+ function provide<R, ER, A, E>(
27
+ managed: ManagedRuntimeImpl<R, ER>,
28
+ effect: Effect.Effect<A, E, R>
29
+ ): Effect.Effect<A, E | ER> {
30
+ return core.flatMap(
31
+ managed.runtimeEffect,
32
+ (rt) =>
33
+ core.withFiberRuntime((fiber) => {
34
+ fiber.setFiberRefs(rt.fiberRefs)
35
+ fiber.currentRuntimeFlags = rt.runtimeFlags
36
+ return core.provideContext(effect, rt.context)
37
+ })
38
+ )
39
+ }
40
+
41
+ const ManagedRuntimeProto = {
42
+ ...Effectable.CommitPrototype,
43
+ [circular.TypeId]: circular.TypeId,
44
+ pipe() {
45
+ return pipeArguments(this, arguments)
46
+ },
47
+ commit(this: ManagedRuntimeImpl<unknown, unknown>) {
48
+ return this.runtimeEffect
49
+ }
50
+ }
51
+
52
+ /** @internal */
53
+ export const make = <R, ER>(
54
+ layer: Layer.Layer<R, ER, never>,
55
+ memoMap?: Layer.MemoMap
56
+ ): M.ManagedRuntime<R, ER> => {
57
+ memoMap = memoMap ?? internalLayer.unsafeMakeMemoMap()
58
+ const scope = internalRuntime.unsafeRunSyncEffect(fiberRuntime.scopeMake())
59
+ let buildFiber: Fiber.RuntimeFiber<Runtime.Runtime<R>, ER> | undefined
60
+ const runtimeEffect = core.withFiberRuntime<Runtime.Runtime<R>, ER>((fiber) => {
61
+ if (!buildFiber) {
62
+ buildFiber = internalRuntime.unsafeForkEffect(
63
+ core.tap(
64
+ Scope.extend(
65
+ internalLayer.toRuntimeWithMemoMap(layer, memoMap),
66
+ scope
67
+ ),
68
+ (rt) => {
69
+ self.cachedRuntime = rt
70
+ }
71
+ ),
72
+ { scope, scheduler: fiber.currentScheduler }
73
+ )
74
+ }
75
+ return core.flatten(buildFiber.await)
76
+ })
77
+ const self: ManagedRuntimeImpl<R, ER> = Object.assign(Object.create(ManagedRuntimeProto), {
78
+ memoMap,
79
+ scope,
80
+ runtimeEffect,
81
+ cachedRuntime: undefined,
82
+ runtime() {
83
+ return self.cachedRuntime === undefined ?
84
+ internalRuntime.unsafeRunPromiseEffect(self.runtimeEffect) :
85
+ Promise.resolve(self.cachedRuntime)
86
+ },
87
+ dispose(): Promise<void> {
88
+ return internalRuntime.unsafeRunPromiseEffect(self.disposeEffect)
89
+ },
90
+ disposeEffect: core.suspend(() => {
91
+ ;(self as Mutable<ManagedRuntimeImpl<R, ER>>).runtimeEffect = core.die("ManagedRuntime disposed")
92
+ self.cachedRuntime = undefined
93
+ return Scope.close(self.scope, core.exitVoid)
94
+ }),
95
+ runFork<A, E>(effect: Effect.Effect<A, E, R>, options?: Runtime.RunForkOptions): Fiber.RuntimeFiber<A, E | ER> {
96
+ return self.cachedRuntime === undefined ?
97
+ internalRuntime.unsafeForkEffect(provide(self, effect), options) :
98
+ internalRuntime.unsafeFork(self.cachedRuntime)(effect, options)
99
+ },
100
+ runSyncExit<A, E>(effect: Effect.Effect<A, E, R>): Exit<A, E | ER> {
101
+ return self.cachedRuntime === undefined ?
102
+ internalRuntime.unsafeRunSyncExitEffect(provide(self, effect)) :
103
+ internalRuntime.unsafeRunSyncExit(self.cachedRuntime)(effect)
104
+ },
105
+ runSync<A, E>(effect: Effect.Effect<A, E, R>): A {
106
+ return self.cachedRuntime === undefined ?
107
+ internalRuntime.unsafeRunSyncEffect(provide(self, effect)) :
108
+ internalRuntime.unsafeRunSync(self.cachedRuntime)(effect)
109
+ },
110
+ runPromiseExit<A, E>(effect: Effect.Effect<A, E, R>, options?: {
111
+ readonly signal?: AbortSignal | undefined
112
+ }): Promise<Exit<A, E | ER>> {
113
+ return self.cachedRuntime === undefined ?
114
+ internalRuntime.unsafeRunPromiseExitEffect(provide(self, effect), options) :
115
+ internalRuntime.unsafeRunPromiseExit(self.cachedRuntime)(effect, options)
116
+ },
117
+ runCallback<A, E>(
118
+ effect: Effect.Effect<A, E, R>,
119
+ options?: Runtime.RunCallbackOptions<A, E | ER> | undefined
120
+ ): Runtime.Cancel<A, E | ER> {
121
+ return self.cachedRuntime === undefined ?
122
+ internalRuntime.unsafeRunCallback(internalRuntime.defaultRuntime)(provide(self, effect), options) :
123
+ internalRuntime.unsafeRunCallback(self.cachedRuntime)(effect, options)
124
+ },
125
+ runPromise<A, E>(effect: Effect.Effect<A, E, R>, options?: {
126
+ readonly signal?: AbortSignal | undefined
127
+ }): Promise<A> {
128
+ return self.cachedRuntime === undefined ?
129
+ internalRuntime.unsafeRunPromiseEffect(provide(self, effect), options) :
130
+ internalRuntime.unsafeRunPromise(self.cachedRuntime)(effect, options)
131
+ }
132
+ })
133
+ return self
134
+ }