@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,766 @@
1
+ import * as Arr from "../Array.js"
2
+ import * as Chunk from "../Chunk.js"
3
+ import type * as Deferred from "../Deferred.js"
4
+ import type * as Effect from "../Effect.js"
5
+ import * as Effectable from "../Effectable.js"
6
+ import { dual, pipe } from "../Function.js"
7
+ import * as MutableQueue from "../MutableQueue.js"
8
+ import * as MutableRef from "../MutableRef.js"
9
+ import * as Option from "../Option.js"
10
+ import { pipeArguments } from "../Pipeable.js"
11
+ import { hasProperty } from "../Predicate.js"
12
+ import type * as Queue from "../Queue.js"
13
+ import * as core from "./core.js"
14
+ import * as fiberRuntime from "./fiberRuntime.js"
15
+
16
+ /** @internal */
17
+ const EnqueueSymbolKey = "effect/QueueEnqueue"
18
+
19
+ /** @internal */
20
+ export const EnqueueTypeId: Queue.EnqueueTypeId = Symbol.for(EnqueueSymbolKey) as Queue.EnqueueTypeId
21
+
22
+ /** @internal */
23
+ const DequeueSymbolKey = "effect/QueueDequeue"
24
+
25
+ /** @internal */
26
+ export const DequeueTypeId: Queue.DequeueTypeId = Symbol.for(DequeueSymbolKey) as Queue.DequeueTypeId
27
+
28
+ /** @internal */
29
+ const QueueStrategySymbolKey = "effect/QueueStrategy"
30
+
31
+ /** @internal */
32
+ export const QueueStrategyTypeId: Queue.QueueStrategyTypeId = Symbol.for(
33
+ QueueStrategySymbolKey
34
+ ) as Queue.QueueStrategyTypeId
35
+
36
+ /** @internal */
37
+ const BackingQueueSymbolKey = "effect/BackingQueue"
38
+
39
+ /** @internal */
40
+ export const BackingQueueTypeId: Queue.BackingQueueTypeId = Symbol.for(
41
+ BackingQueueSymbolKey
42
+ ) as Queue.BackingQueueTypeId
43
+
44
+ const queueStrategyVariance = {
45
+ /* c8 ignore next */
46
+ _A: (_: any) => _
47
+ }
48
+
49
+ const backingQueueVariance = {
50
+ /* c8 ignore next */
51
+ _A: (_: any) => _
52
+ }
53
+
54
+ /** @internal */
55
+ export const enqueueVariance = {
56
+ /* c8 ignore next */
57
+ _In: (_: unknown) => _
58
+ }
59
+
60
+ /** @internal */
61
+ export const dequeueVariance = {
62
+ /* c8 ignore next */
63
+ _Out: (_: never) => _
64
+ }
65
+
66
+ /** @internal */
67
+ class QueueImpl<in out A> extends Effectable.Class<A> implements Queue.Queue<A> {
68
+ readonly [EnqueueTypeId] = enqueueVariance
69
+ readonly [DequeueTypeId] = dequeueVariance
70
+
71
+ constructor(
72
+ /** @internal */
73
+ readonly queue: Queue.BackingQueue<A>,
74
+ /** @internal */
75
+ readonly takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>,
76
+ /** @internal */
77
+ readonly shutdownHook: Deferred.Deferred<void>,
78
+ /** @internal */
79
+ readonly shutdownFlag: MutableRef.MutableRef<boolean>,
80
+ /** @internal */
81
+ readonly strategy: Queue.Strategy<A>
82
+ ) {
83
+ super()
84
+ }
85
+
86
+ pipe() {
87
+ return pipeArguments(this, arguments)
88
+ }
89
+
90
+ commit() {
91
+ return this.take
92
+ }
93
+
94
+ capacity(): number {
95
+ return this.queue.capacity()
96
+ }
97
+
98
+ get size(): Effect.Effect<number> {
99
+ return core.suspend(() => core.catchAll(this.unsafeSize(), () => core.interrupt))
100
+ }
101
+
102
+ unsafeSize() {
103
+ if (MutableRef.get(this.shutdownFlag)) {
104
+ return Option.none<number>()
105
+ }
106
+ return Option.some(
107
+ this.queue.length() -
108
+ MutableQueue.length(this.takers) +
109
+ this.strategy.surplusSize()
110
+ )
111
+ }
112
+
113
+ get isEmpty(): Effect.Effect<boolean> {
114
+ return core.map(this.size, (size) => size <= 0)
115
+ }
116
+
117
+ get isFull(): Effect.Effect<boolean> {
118
+ return core.map(this.size, (size) => size >= this.capacity())
119
+ }
120
+
121
+ get shutdown(): Effect.Effect<void> {
122
+ return core.uninterruptible(
123
+ core.withFiberRuntime((state) => {
124
+ pipe(this.shutdownFlag, MutableRef.set(true))
125
+ return pipe(
126
+ fiberRuntime.forEachConcurrentDiscard(
127
+ unsafePollAll(this.takers),
128
+ (d) => core.deferredInterruptWith(d, state.id()),
129
+ false,
130
+ false
131
+ ),
132
+ core.zipRight(this.strategy.shutdown),
133
+ core.whenEffect(core.deferredSucceed(this.shutdownHook, void 0)),
134
+ core.asVoid
135
+ )
136
+ })
137
+ )
138
+ }
139
+
140
+ get isShutdown(): Effect.Effect<boolean> {
141
+ return core.sync(() => MutableRef.get(this.shutdownFlag))
142
+ }
143
+
144
+ get awaitShutdown(): Effect.Effect<void> {
145
+ return core.deferredAwait(this.shutdownHook)
146
+ }
147
+
148
+ isActive() {
149
+ return !MutableRef.get(this.shutdownFlag)
150
+ }
151
+
152
+ unsafeOffer(value: A): boolean {
153
+ if (MutableRef.get(this.shutdownFlag)) {
154
+ return false
155
+ }
156
+ let noRemaining: boolean
157
+ if (this.queue.length() === 0) {
158
+ const taker = pipe(
159
+ this.takers,
160
+ MutableQueue.poll(MutableQueue.EmptyMutableQueue)
161
+ )
162
+ if (taker !== MutableQueue.EmptyMutableQueue) {
163
+ unsafeCompleteDeferred(taker, value)
164
+ noRemaining = true
165
+ } else {
166
+ noRemaining = false
167
+ }
168
+ } else {
169
+ noRemaining = false
170
+ }
171
+ if (noRemaining) {
172
+ return true
173
+ }
174
+ // Not enough takers, offer to the queue
175
+ const succeeded = this.queue.offer(value)
176
+ unsafeCompleteTakers(this.strategy, this.queue, this.takers)
177
+ return succeeded
178
+ }
179
+
180
+ offer(value: A): Effect.Effect<boolean> {
181
+ return core.suspend(() => {
182
+ if (MutableRef.get(this.shutdownFlag)) {
183
+ return core.interrupt
184
+ }
185
+ let noRemaining: boolean
186
+ if (this.queue.length() === 0) {
187
+ const taker = pipe(
188
+ this.takers,
189
+ MutableQueue.poll(MutableQueue.EmptyMutableQueue)
190
+ )
191
+ if (taker !== MutableQueue.EmptyMutableQueue) {
192
+ unsafeCompleteDeferred(taker, value)
193
+ noRemaining = true
194
+ } else {
195
+ noRemaining = false
196
+ }
197
+ } else {
198
+ noRemaining = false
199
+ }
200
+ if (noRemaining) {
201
+ return core.succeed(true)
202
+ }
203
+ // Not enough takers, offer to the queue
204
+ const succeeded = this.queue.offer(value)
205
+ unsafeCompleteTakers(this.strategy, this.queue, this.takers)
206
+ return succeeded
207
+ ? core.succeed(true)
208
+ : this.strategy.handleSurplus([value], this.queue, this.takers, this.shutdownFlag)
209
+ })
210
+ }
211
+
212
+ offerAll(iterable: Iterable<A>): Effect.Effect<boolean> {
213
+ return core.suspend(() => {
214
+ if (MutableRef.get(this.shutdownFlag)) {
215
+ return core.interrupt
216
+ }
217
+ const values = Arr.fromIterable(iterable)
218
+ const pTakers = this.queue.length() === 0
219
+ ? Arr.fromIterable(unsafePollN(this.takers, values.length))
220
+ : Arr.empty
221
+ const [forTakers, remaining] = pipe(values, Arr.splitAt(pTakers.length))
222
+ for (let i = 0; i < pTakers.length; i++) {
223
+ const taker = (pTakers as any)[i]
224
+ const item = forTakers[i]
225
+ unsafeCompleteDeferred(taker, item)
226
+ }
227
+ if (remaining.length === 0) {
228
+ return core.succeed(true)
229
+ }
230
+ // Not enough takers, offer to the queue
231
+ const surplus = this.queue.offerAll(remaining)
232
+ unsafeCompleteTakers(this.strategy, this.queue, this.takers)
233
+ return Chunk.isEmpty(surplus)
234
+ ? core.succeed(true)
235
+ : this.strategy.handleSurplus(surplus, this.queue, this.takers, this.shutdownFlag)
236
+ })
237
+ }
238
+
239
+ get take(): Effect.Effect<A> {
240
+ return core.withFiberRuntime((state) => {
241
+ if (MutableRef.get(this.shutdownFlag)) {
242
+ return core.interrupt
243
+ }
244
+ const item = this.queue.poll(MutableQueue.EmptyMutableQueue)
245
+ if (item !== MutableQueue.EmptyMutableQueue) {
246
+ this.strategy.unsafeOnQueueEmptySpace(this.queue, this.takers)
247
+ return core.succeed(item)
248
+ } else {
249
+ // Add the deferred to takers, then:
250
+ // - Try to take again in case a value was added since
251
+ // - Wait for the deferred to be completed
252
+ // - Clean up resources in case of interruption
253
+ const deferred = core.deferredUnsafeMake<A>(state.id())
254
+ return pipe(
255
+ core.suspend(() => {
256
+ pipe(this.takers, MutableQueue.offer(deferred))
257
+ unsafeCompleteTakers(this.strategy, this.queue, this.takers)
258
+ return MutableRef.get(this.shutdownFlag) ?
259
+ core.interrupt :
260
+ core.deferredAwait(deferred)
261
+ }),
262
+ core.onInterrupt(() => {
263
+ return core.sync(() => unsafeRemove(this.takers, deferred))
264
+ })
265
+ )
266
+ }
267
+ })
268
+ }
269
+
270
+ get takeAll(): Effect.Effect<Chunk.Chunk<A>> {
271
+ return core.suspend(() => {
272
+ return MutableRef.get(this.shutdownFlag)
273
+ ? core.interrupt
274
+ : core.sync(() => {
275
+ const values = this.queue.pollUpTo(Number.POSITIVE_INFINITY)
276
+ this.strategy.unsafeOnQueueEmptySpace(this.queue, this.takers)
277
+ return Chunk.fromIterable(values)
278
+ })
279
+ })
280
+ }
281
+
282
+ takeUpTo(max: number): Effect.Effect<Chunk.Chunk<A>> {
283
+ return core.suspend(() =>
284
+ MutableRef.get(this.shutdownFlag)
285
+ ? core.interrupt
286
+ : core.sync(() => {
287
+ const values = this.queue.pollUpTo(max)
288
+ this.strategy.unsafeOnQueueEmptySpace(this.queue, this.takers)
289
+ return Chunk.fromIterable(values)
290
+ })
291
+ )
292
+ }
293
+
294
+ takeBetween(min: number, max: number): Effect.Effect<Chunk.Chunk<A>> {
295
+ return core.suspend(() =>
296
+ takeRemainderLoop(
297
+ this,
298
+ min,
299
+ max,
300
+ Chunk.empty()
301
+ )
302
+ )
303
+ }
304
+ }
305
+
306
+ /** @internal */
307
+ const takeRemainderLoop = <A>(
308
+ self: Queue.Dequeue<A>,
309
+ min: number,
310
+ max: number,
311
+ acc: Chunk.Chunk<A>
312
+ ): Effect.Effect<Chunk.Chunk<A>> => {
313
+ if (max < min) {
314
+ return core.succeed(acc)
315
+ }
316
+ return pipe(
317
+ takeUpTo(self, max),
318
+ core.flatMap((bs) => {
319
+ const remaining = min - bs.length
320
+ if (remaining === 1) {
321
+ return pipe(
322
+ take(self),
323
+ core.map((b) => pipe(acc, Chunk.appendAll(bs), Chunk.append(b)))
324
+ )
325
+ }
326
+ if (remaining > 1) {
327
+ return pipe(
328
+ take(self),
329
+ core.flatMap((b) =>
330
+ takeRemainderLoop(
331
+ self,
332
+ remaining - 1,
333
+ max - bs.length - 1,
334
+ pipe(acc, Chunk.appendAll(bs), Chunk.append(b))
335
+ )
336
+ )
337
+ )
338
+ }
339
+ return core.succeed(pipe(acc, Chunk.appendAll(bs)))
340
+ })
341
+ )
342
+ }
343
+
344
+ /** @internal */
345
+ export const isQueue = (u: unknown): u is Queue.Queue<unknown> => isEnqueue(u) && isDequeue(u)
346
+
347
+ /** @internal */
348
+ export const isEnqueue = (u: unknown): u is Queue.Enqueue<unknown> => hasProperty(u, EnqueueTypeId)
349
+
350
+ /** @internal */
351
+ export const isDequeue = (u: unknown): u is Queue.Dequeue<unknown> => hasProperty(u, DequeueTypeId)
352
+
353
+ /** @internal */
354
+ export const bounded = <A>(requestedCapacity: number): Effect.Effect<Queue.Queue<A>> =>
355
+ pipe(
356
+ core.sync(() => MutableQueue.bounded<A>(requestedCapacity)),
357
+ core.flatMap((queue) => make(backingQueueFromMutableQueue(queue), backPressureStrategy()))
358
+ )
359
+
360
+ /** @internal */
361
+ export const dropping = <A>(requestedCapacity: number): Effect.Effect<Queue.Queue<A>> =>
362
+ pipe(
363
+ core.sync(() => MutableQueue.bounded<A>(requestedCapacity)),
364
+ core.flatMap((queue) => make(backingQueueFromMutableQueue(queue), droppingStrategy()))
365
+ )
366
+
367
+ /** @internal */
368
+ export const sliding = <A>(requestedCapacity: number): Effect.Effect<Queue.Queue<A>> =>
369
+ pipe(
370
+ core.sync(() => MutableQueue.bounded<A>(requestedCapacity)),
371
+ core.flatMap((queue) => make(backingQueueFromMutableQueue(queue), slidingStrategy()))
372
+ )
373
+
374
+ /** @internal */
375
+ export const unbounded = <A>(): Effect.Effect<Queue.Queue<A>> =>
376
+ pipe(
377
+ core.sync(() => MutableQueue.unbounded<A>()),
378
+ core.flatMap((queue) => make(backingQueueFromMutableQueue(queue), droppingStrategy()))
379
+ )
380
+
381
+ /** @internal */
382
+ const unsafeMake = <A>(
383
+ queue: Queue.BackingQueue<A>,
384
+ takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>,
385
+ shutdownHook: Deferred.Deferred<void>,
386
+ shutdownFlag: MutableRef.MutableRef<boolean>,
387
+ strategy: Queue.Strategy<A>
388
+ ): Queue.Queue<A> => {
389
+ return new QueueImpl(queue, takers, shutdownHook, shutdownFlag, strategy)
390
+ }
391
+
392
+ /** @internal */
393
+ export const make = <A>(
394
+ queue: Queue.BackingQueue<A>,
395
+ strategy: Queue.Strategy<A>
396
+ ): Effect.Effect<Queue.Queue<A>> =>
397
+ pipe(
398
+ core.deferredMake<void>(),
399
+ core.map((deferred) =>
400
+ unsafeMake(
401
+ queue,
402
+ MutableQueue.unbounded(),
403
+ deferred,
404
+ MutableRef.make(false),
405
+ strategy
406
+ )
407
+ )
408
+ )
409
+
410
+ /** @internal */
411
+ export class BackingQueueFromMutableQueue<in out A> implements Queue.BackingQueue<A> {
412
+ readonly [BackingQueueTypeId] = backingQueueVariance
413
+ constructor(readonly mutable: MutableQueue.MutableQueue<A>) {}
414
+ poll<Def>(def: Def): A | Def {
415
+ return MutableQueue.poll(this.mutable, def)
416
+ }
417
+ pollUpTo(limit: number): Chunk.Chunk<A> {
418
+ return MutableQueue.pollUpTo(this.mutable, limit)
419
+ }
420
+ offerAll(elements: Iterable<A>): Chunk.Chunk<A> {
421
+ return MutableQueue.offerAll(this.mutable, elements)
422
+ }
423
+ offer(element: A): boolean {
424
+ return MutableQueue.offer(this.mutable, element)
425
+ }
426
+ capacity(): number {
427
+ return MutableQueue.capacity(this.mutable)
428
+ }
429
+ length(): number {
430
+ return MutableQueue.length(this.mutable)
431
+ }
432
+ }
433
+
434
+ /** @internal */
435
+ export const backingQueueFromMutableQueue = <A>(mutable: MutableQueue.MutableQueue<A>): Queue.BackingQueue<A> =>
436
+ new BackingQueueFromMutableQueue(mutable)
437
+
438
+ /** @internal */
439
+ export const capacity = <A>(self: Queue.Dequeue<A> | Queue.Enqueue<A>): number => self.capacity()
440
+
441
+ /** @internal */
442
+ export const size = <A>(self: Queue.Dequeue<A> | Queue.Enqueue<A>): Effect.Effect<number> => self.size
443
+
444
+ /** @internal */
445
+ export const isFull = <A>(self: Queue.Dequeue<A> | Queue.Enqueue<A>): Effect.Effect<boolean> => self.isFull
446
+
447
+ /** @internal */
448
+ export const isEmpty = <A>(self: Queue.Dequeue<A> | Queue.Enqueue<A>): Effect.Effect<boolean> => self.isEmpty
449
+
450
+ /** @internal */
451
+ export const isShutdown = <A>(self: Queue.Dequeue<A> | Queue.Enqueue<A>): Effect.Effect<boolean> => self.isShutdown
452
+
453
+ /** @internal */
454
+ export const awaitShutdown = <A>(self: Queue.Dequeue<A> | Queue.Enqueue<A>): Effect.Effect<void> => self.awaitShutdown
455
+
456
+ /** @internal */
457
+ export const shutdown = <A>(self: Queue.Dequeue<A> | Queue.Enqueue<A>): Effect.Effect<void> => self.shutdown
458
+
459
+ /** @internal */
460
+ export const offer = dual<
461
+ <A>(value: A) => (self: Queue.Enqueue<A>) => Effect.Effect<boolean>,
462
+ <A>(self: Queue.Enqueue<A>, value: A) => Effect.Effect<boolean>
463
+ >(2, (self, value) => self.offer(value))
464
+
465
+ /** @internal */
466
+ export const unsafeOffer = dual<
467
+ <A>(value: A) => (self: Queue.Enqueue<A>) => boolean,
468
+ <A>(self: Queue.Enqueue<A>, value: A) => boolean
469
+ >(2, (self, value) => self.unsafeOffer(value))
470
+
471
+ /** @internal */
472
+ export const offerAll = dual<
473
+ <A>(
474
+ iterable: Iterable<A>
475
+ ) => (self: Queue.Enqueue<A>) => Effect.Effect<boolean>,
476
+ <A>(
477
+ self: Queue.Enqueue<A>,
478
+ iterable: Iterable<A>
479
+ ) => Effect.Effect<boolean>
480
+ >(2, (self, iterable) => self.offerAll(iterable))
481
+
482
+ /** @internal */
483
+ export const poll = <A>(self: Queue.Dequeue<A>): Effect.Effect<Option.Option<A>> =>
484
+ core.map(self.takeUpTo(1), Chunk.head)
485
+
486
+ /** @internal */
487
+ export const take = <A>(self: Queue.Dequeue<A>): Effect.Effect<A> => self.take
488
+
489
+ /** @internal */
490
+ export const takeAll = <A>(self: Queue.Dequeue<A>): Effect.Effect<Chunk.Chunk<A>> => self.takeAll
491
+
492
+ /** @internal */
493
+ export const takeUpTo = dual<
494
+ (max: number) => <A>(self: Queue.Dequeue<A>) => Effect.Effect<Chunk.Chunk<A>>,
495
+ <A>(self: Queue.Dequeue<A>, max: number) => Effect.Effect<Chunk.Chunk<A>>
496
+ >(2, (self, max) => self.takeUpTo(max))
497
+
498
+ /** @internal */
499
+ export const takeBetween = dual<
500
+ (min: number, max: number) => <A>(self: Queue.Dequeue<A>) => Effect.Effect<Chunk.Chunk<A>>,
501
+ <A>(self: Queue.Dequeue<A>, min: number, max: number) => Effect.Effect<Chunk.Chunk<A>>
502
+ >(3, (self, min, max) => self.takeBetween(min, max))
503
+
504
+ /** @internal */
505
+ export const takeN = dual<
506
+ (n: number) => <A>(self: Queue.Dequeue<A>) => Effect.Effect<Chunk.Chunk<A>>,
507
+ <A>(self: Queue.Dequeue<A>, n: number) => Effect.Effect<Chunk.Chunk<A>>
508
+ >(2, (self, n) => self.takeBetween(n, n))
509
+
510
+ // -----------------------------------------------------------------------------
511
+ // Strategy
512
+ // -----------------------------------------------------------------------------
513
+
514
+ /** @internal */
515
+ export const backPressureStrategy = <A>(): Queue.Strategy<A> => new BackPressureStrategy()
516
+
517
+ /** @internal */
518
+ export const droppingStrategy = <A>(): Queue.Strategy<A> => new DroppingStrategy()
519
+
520
+ /** @internal */
521
+ export const slidingStrategy = <A>(): Queue.Strategy<A> => new SlidingStrategy()
522
+
523
+ /** @internal */
524
+ class BackPressureStrategy<in out A> implements Queue.Strategy<A> {
525
+ readonly [QueueStrategyTypeId] = queueStrategyVariance
526
+
527
+ readonly putters = MutableQueue.unbounded<readonly [A, Deferred.Deferred<boolean>, boolean]>()
528
+
529
+ surplusSize(): number {
530
+ return MutableQueue.length(this.putters)
531
+ }
532
+
533
+ onCompleteTakersWithEmptyQueue(takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>): void {
534
+ while (!MutableQueue.isEmpty(this.putters) && !MutableQueue.isEmpty(takers)) {
535
+ const taker = MutableQueue.poll(takers, void 0)!
536
+ const putter = MutableQueue.poll(this.putters, void 0)!
537
+ if (putter[2]) {
538
+ unsafeCompleteDeferred(putter[1], true)
539
+ }
540
+ unsafeCompleteDeferred(taker, putter[0])
541
+ }
542
+ }
543
+
544
+ get shutdown(): Effect.Effect<void> {
545
+ return pipe(
546
+ core.fiberId,
547
+ core.flatMap((fiberId) =>
548
+ pipe(
549
+ core.sync(() => unsafePollAll(this.putters)),
550
+ core.flatMap((putters) =>
551
+ fiberRuntime.forEachConcurrentDiscard(
552
+ putters,
553
+ ([_, deferred, isLastItem]) =>
554
+ isLastItem ?
555
+ pipe(
556
+ core.deferredInterruptWith(deferred, fiberId),
557
+ core.asVoid
558
+ ) :
559
+ core.void,
560
+ false,
561
+ false
562
+ )
563
+ )
564
+ )
565
+ )
566
+ )
567
+ }
568
+
569
+ handleSurplus(
570
+ iterable: Iterable<A>,
571
+ queue: Queue.BackingQueue<A>,
572
+ takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>,
573
+ isShutdown: MutableRef.MutableRef<boolean>
574
+ ): Effect.Effect<boolean> {
575
+ return core.withFiberRuntime((state) => {
576
+ const deferred = core.deferredUnsafeMake<boolean>(state.id())
577
+ return pipe(
578
+ core.suspend(() => {
579
+ this.unsafeOffer(iterable, deferred)
580
+ this.unsafeOnQueueEmptySpace(queue, takers)
581
+ unsafeCompleteTakers(this, queue, takers)
582
+ return MutableRef.get(isShutdown) ? core.interrupt : core.deferredAwait(deferred)
583
+ }),
584
+ core.onInterrupt(() => core.sync(() => this.unsafeRemove(deferred)))
585
+ )
586
+ })
587
+ }
588
+
589
+ unsafeOnQueueEmptySpace(
590
+ queue: Queue.BackingQueue<A>,
591
+ takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>
592
+ ): void {
593
+ let keepPolling = true
594
+ while (keepPolling && (queue.capacity() === Number.POSITIVE_INFINITY || queue.length() < queue.capacity())) {
595
+ const putter = pipe(this.putters, MutableQueue.poll(MutableQueue.EmptyMutableQueue))
596
+ if (putter === MutableQueue.EmptyMutableQueue) {
597
+ keepPolling = false
598
+ } else {
599
+ const offered = queue.offer(putter[0])
600
+ if (offered && putter[2]) {
601
+ unsafeCompleteDeferred(putter[1], true)
602
+ } else if (!offered) {
603
+ unsafeOfferAll(this.putters, pipe(unsafePollAll(this.putters), Chunk.prepend(putter)))
604
+ }
605
+ unsafeCompleteTakers(this, queue, takers)
606
+ }
607
+ }
608
+ }
609
+
610
+ unsafeOffer(iterable: Iterable<A>, deferred: Deferred.Deferred<boolean>): void {
611
+ const stuff = Arr.fromIterable(iterable)
612
+ for (let i = 0; i < stuff.length; i++) {
613
+ const value = stuff[i]
614
+ if (i === stuff.length - 1) {
615
+ pipe(this.putters, MutableQueue.offer([value, deferred, true as boolean] as const))
616
+ } else {
617
+ pipe(this.putters, MutableQueue.offer([value, deferred, false as boolean] as const))
618
+ }
619
+ }
620
+ }
621
+
622
+ unsafeRemove(deferred: Deferred.Deferred<boolean>): void {
623
+ unsafeOfferAll(
624
+ this.putters,
625
+ pipe(unsafePollAll(this.putters), Chunk.filter(([, _]) => _ !== deferred))
626
+ )
627
+ }
628
+ }
629
+
630
+ /** @internal */
631
+ class DroppingStrategy<in out A> implements Queue.Strategy<A> {
632
+ readonly [QueueStrategyTypeId] = queueStrategyVariance
633
+
634
+ surplusSize(): number {
635
+ return 0
636
+ }
637
+
638
+ get shutdown(): Effect.Effect<void> {
639
+ return core.void
640
+ }
641
+
642
+ onCompleteTakersWithEmptyQueue(): void {
643
+ }
644
+
645
+ handleSurplus(
646
+ _iterable: Iterable<A>,
647
+ _queue: Queue.BackingQueue<A>,
648
+ _takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>,
649
+ _isShutdown: MutableRef.MutableRef<boolean>
650
+ ): Effect.Effect<boolean> {
651
+ return core.succeed(false)
652
+ }
653
+
654
+ unsafeOnQueueEmptySpace(
655
+ _queue: Queue.BackingQueue<A>,
656
+ _takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>
657
+ ): void {
658
+ //
659
+ }
660
+ }
661
+
662
+ /** @internal */
663
+ class SlidingStrategy<in out A> implements Queue.Strategy<A> {
664
+ readonly [QueueStrategyTypeId] = queueStrategyVariance
665
+
666
+ surplusSize(): number {
667
+ return 0
668
+ }
669
+
670
+ get shutdown(): Effect.Effect<void> {
671
+ return core.void
672
+ }
673
+
674
+ onCompleteTakersWithEmptyQueue(): void {
675
+ }
676
+
677
+ handleSurplus(
678
+ iterable: Iterable<A>,
679
+ queue: Queue.BackingQueue<A>,
680
+ takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>,
681
+ _isShutdown: MutableRef.MutableRef<boolean>
682
+ ): Effect.Effect<boolean> {
683
+ return core.sync(() => {
684
+ this.unsafeOffer(queue, iterable)
685
+ unsafeCompleteTakers(this, queue, takers)
686
+ return true
687
+ })
688
+ }
689
+
690
+ unsafeOnQueueEmptySpace(
691
+ _queue: Queue.BackingQueue<A>,
692
+ _takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>
693
+ ): void {
694
+ //
695
+ }
696
+
697
+ unsafeOffer(queue: Queue.BackingQueue<A>, iterable: Iterable<A>): void {
698
+ const iterator = iterable[Symbol.iterator]()
699
+ let next: IteratorResult<A>
700
+ let offering = true
701
+ while (!(next = iterator.next()).done && offering) {
702
+ if (queue.capacity() === 0) {
703
+ return
704
+ }
705
+ // Poll 1 and retry
706
+ queue.poll(MutableQueue.EmptyMutableQueue)
707
+ offering = queue.offer(next.value)
708
+ }
709
+ }
710
+ }
711
+
712
+ /** @internal */
713
+ const unsafeCompleteDeferred = <A>(deferred: Deferred.Deferred<A>, a: A): void => {
714
+ return core.deferredUnsafeDone(deferred, core.succeed(a))
715
+ }
716
+
717
+ /** @internal */
718
+ const unsafeOfferAll = <A>(queue: MutableQueue.MutableQueue<A>, as: Iterable<A>): Chunk.Chunk<A> => {
719
+ return pipe(queue, MutableQueue.offerAll(as))
720
+ }
721
+
722
+ /** @internal */
723
+ const unsafePollAll = <A>(queue: MutableQueue.MutableQueue<A>): Chunk.Chunk<A> => {
724
+ return pipe(queue, MutableQueue.pollUpTo(Number.POSITIVE_INFINITY))
725
+ }
726
+
727
+ /** @internal */
728
+ const unsafePollN = <A>(queue: MutableQueue.MutableQueue<A>, max: number): Chunk.Chunk<A> => {
729
+ return pipe(queue, MutableQueue.pollUpTo(max))
730
+ }
731
+
732
+ /** @internal */
733
+ export const unsafeRemove = <A>(queue: MutableQueue.MutableQueue<A>, a: A): void => {
734
+ unsafeOfferAll(
735
+ queue,
736
+ pipe(unsafePollAll(queue), Chunk.filter((b) => a !== b))
737
+ )
738
+ }
739
+
740
+ /** @internal */
741
+ export const unsafeCompleteTakers = <A>(
742
+ strategy: Queue.Strategy<A>,
743
+ queue: Queue.BackingQueue<A>,
744
+ takers: MutableQueue.MutableQueue<Deferred.Deferred<A>>
745
+ ): void => {
746
+ // Check both a taker and an item are in the queue, starting with the taker
747
+ let keepPolling = true
748
+ while (keepPolling && queue.length() !== 0) {
749
+ const taker = pipe(takers, MutableQueue.poll(MutableQueue.EmptyMutableQueue))
750
+ if (taker !== MutableQueue.EmptyMutableQueue) {
751
+ const element = queue.poll(MutableQueue.EmptyMutableQueue)
752
+ if (element !== MutableQueue.EmptyMutableQueue) {
753
+ unsafeCompleteDeferred(taker, element)
754
+ strategy.unsafeOnQueueEmptySpace(queue, takers)
755
+ } else {
756
+ unsafeOfferAll(takers, pipe(unsafePollAll(takers), Chunk.prepend(taker)))
757
+ }
758
+ keepPolling = true
759
+ } else {
760
+ keepPolling = false
761
+ }
762
+ }
763
+ if (keepPolling && queue.length() === 0 && !MutableQueue.isEmpty(takers)) {
764
+ strategy.onCompleteTakersWithEmptyQueue(takers)
765
+ }
766
+ }