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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,2293 @@
1
+ import * as Arr from "../Array.js"
2
+ import type * as Cause from "../Cause.js"
3
+ import * as Chunk from "../Chunk.js"
4
+ import * as Clock from "../Clock.js"
5
+ import * as Context from "../Context.js"
6
+ import * as Duration from "../Duration.js"
7
+ import type * as Effect from "../Effect.js"
8
+ import type { Exit } from "../Exit.js"
9
+ import type * as Fiber from "../Fiber.js"
10
+ import type * as FiberId from "../FiberId.js"
11
+ import type * as FiberRef from "../FiberRef.js"
12
+ import * as FiberRefs from "../FiberRefs.js"
13
+ import type * as FiberRefsPatch from "../FiberRefsPatch.js"
14
+ import type { LazyArg } from "../Function.js"
15
+ import { constFalse, constTrue, constVoid, dual, identity, pipe } from "../Function.js"
16
+ import * as HashMap from "../HashMap.js"
17
+ import * as HashSet from "../HashSet.js"
18
+ import * as List from "../List.js"
19
+ import * as LogLevel from "../LogLevel.js"
20
+ import * as LogSpan from "../LogSpan.js"
21
+ import type * as Metric from "../Metric.js"
22
+ import type * as MetricLabel from "../MetricLabel.js"
23
+ import * as Option from "../Option.js"
24
+ import * as Predicate from "../Predicate.js"
25
+ import type * as Random from "../Random.js"
26
+ import * as Ref from "../Ref.js"
27
+ import type * as runtimeFlagsPatch from "../RuntimeFlagsPatch.js"
28
+ import * as Tracer from "../Tracer.js"
29
+ import type * as Types from "../Types.js"
30
+ import type { Unify } from "../Unify.js"
31
+ import { internalCall } from "../Utils.js"
32
+ import * as internalCause from "./cause.js"
33
+ import { clockTag } from "./clock.js"
34
+ import * as core from "./core.js"
35
+ import * as defaultServices from "./defaultServices.js"
36
+ import * as doNotation from "./doNotation.js"
37
+ import * as fiberRefsPatch from "./fiberRefs/patch.js"
38
+ import type { FiberRuntime } from "./fiberRuntime.js"
39
+ import * as metricLabel from "./metric/label.js"
40
+ import * as runtimeFlags from "./runtimeFlags.js"
41
+ import * as internalTracer from "./tracer.js"
42
+
43
+ /* @internal */
44
+ export const annotateLogs = dual<
45
+ {
46
+ (key: string, value: unknown): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
47
+ (
48
+ values: Record<string, unknown>
49
+ ): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
50
+ },
51
+ {
52
+ <A, E, R>(effect: Effect.Effect<A, E, R>, key: string, value: unknown): Effect.Effect<A, E, R>
53
+ <A, E, R>(effect: Effect.Effect<A, E, R>, values: Record<string, unknown>): Effect.Effect<A, E, R>
54
+ }
55
+ >(
56
+ (args) => core.isEffect(args[0]),
57
+ function<A, E, R>() {
58
+ const args = arguments
59
+ return core.fiberRefLocallyWith(
60
+ args[0] as Effect.Effect<A, E, R>,
61
+ core.currentLogAnnotations,
62
+ typeof args[1] === "string"
63
+ ? HashMap.set(args[1], args[2])
64
+ : (annotations) =>
65
+ Object.entries(args[1] as Record<string, unknown>).reduce(
66
+ (acc, [key, value]) => HashMap.set(acc, key, value),
67
+ annotations
68
+ )
69
+ )
70
+ }
71
+ )
72
+
73
+ /* @internal */
74
+ export const asSome = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R> =>
75
+ core.map(self, Option.some)
76
+
77
+ /* @internal */
78
+ export const asSomeError = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, Option.Option<E>, R> =>
79
+ core.mapError(self, Option.some)
80
+
81
+ /* @internal */
82
+ export const try_: {
83
+ <A, E>(options: {
84
+ readonly try: LazyArg<A>
85
+ readonly catch: (error: unknown) => E
86
+ }): Effect.Effect<A, E>
87
+ <A>(thunk: LazyArg<A>): Effect.Effect<A, Cause.UnknownException>
88
+ } = <A, E>(
89
+ arg: LazyArg<A> | {
90
+ readonly try: LazyArg<A>
91
+ readonly catch: (error: unknown) => E
92
+ }
93
+ ) => {
94
+ let evaluate: LazyArg<A>
95
+ let onFailure: ((error: unknown) => E) | undefined = undefined
96
+ if (typeof arg === "function") {
97
+ evaluate = arg
98
+ } else {
99
+ evaluate = arg.try
100
+ onFailure = arg.catch
101
+ }
102
+ return core.suspend(() => {
103
+ try {
104
+ return core.succeed(internalCall(evaluate))
105
+ } catch (error) {
106
+ return core.fail(
107
+ onFailure
108
+ ? internalCall(() => onFailure(error))
109
+ : new core.UnknownException(error, "An unknown error occurred in Effect.try")
110
+ )
111
+ }
112
+ })
113
+ }
114
+
115
+ /* @internal */
116
+ export const _catch: {
117
+ <N extends keyof E, K extends E[N] & string, E, A1, E1, R1>(
118
+ discriminator: N,
119
+ options: {
120
+ readonly failure: K
121
+ readonly onFailure: (error: Extract<E, { [n in N]: K }>) => Effect.Effect<A1, E1, R1>
122
+ }
123
+ ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<
124
+ A | A1,
125
+ Exclude<E, { [n in N]: K }> | E1,
126
+ R | R1
127
+ >
128
+ <A, E, R, N extends keyof E, K extends E[N] & string, A1, E1, R1>(
129
+ self: Effect.Effect<A, E, R>,
130
+ discriminator: N,
131
+ options: {
132
+ readonly failure: K
133
+ readonly onFailure: (error: Extract<E, { [n in N]: K }>) => Effect.Effect<A1, E1, R1>
134
+ }
135
+ ): Effect.Effect<A | A1, Exclude<E, { [n in N]: K }> | E1, R | R1>
136
+ } = dual(
137
+ 3,
138
+ (self, tag, options) =>
139
+ core.catchAll(self, (e) => {
140
+ if (Predicate.hasProperty(e, tag) && e[tag] === options.failure) {
141
+ return options.onFailure(e)
142
+ }
143
+ return core.fail(e)
144
+ })
145
+ )
146
+
147
+ /* @internal */
148
+ export const catchAllDefect = dual<
149
+ <A2, E2, R2>(
150
+ f: (defect: unknown) => Effect.Effect<A2, E2, R2>
151
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A | A2, E | E2, R | R2>,
152
+ <A, E, R, A2, E2, R2>(
153
+ self: Effect.Effect<A, E, R>,
154
+ f: (defect: unknown) => Effect.Effect<A2, E2, R2>
155
+ ) => Effect.Effect<A | A2, E | E2, R | R2>
156
+ >(2, <A, E, R, A2, E2, R2>(
157
+ self: Effect.Effect<A, E, R>,
158
+ f: (defect: unknown) => Effect.Effect<A2, E2, R2>
159
+ ): Effect.Effect<A | A2, E | E2, R | R2> =>
160
+ core.catchAllCause(
161
+ self,
162
+ (cause): Effect.Effect<A | A2, E | E2, R | R2> => {
163
+ const option = internalCause.find(cause, (_) => internalCause.isDieType(_) ? Option.some(_) : Option.none())
164
+ switch (option._tag) {
165
+ case "None": {
166
+ return core.failCause(cause)
167
+ }
168
+ case "Some": {
169
+ return f(option.value.defect)
170
+ }
171
+ }
172
+ }
173
+ ))
174
+
175
+ /* @internal */
176
+ export const catchSomeCause: {
177
+ <E, A2, E2, R2>(
178
+ f: (cause: Cause.Cause<Types.NoInfer<E>>) => Option.Option<Effect.Effect<A2, E2, R2>>
179
+ ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A2 | A, E | E2, R2 | R>
180
+ <A, E, R, A2, E2, R2>(
181
+ self: Effect.Effect<A, E, R>,
182
+ f: (cause: Cause.Cause<Types.NoInfer<E>>) => Option.Option<Effect.Effect<A2, E2, R2>>
183
+ ): Effect.Effect<A2 | A, E | E2, R2 | R>
184
+ } = dual(
185
+ 2,
186
+ <A, E, R, A2, E2, R2>(
187
+ self: Effect.Effect<A, E, R>,
188
+ f: (cause: Cause.Cause<Types.NoInfer<E>>) => Option.Option<Effect.Effect<A2, E2, R2>>
189
+ ): Effect.Effect<A2 | A, E | E2, R2 | R> =>
190
+ core.matchCauseEffect(self, {
191
+ onFailure: (cause): Effect.Effect<A2, E | E2, R2> => {
192
+ const option = f(cause)
193
+ switch (option._tag) {
194
+ case "None": {
195
+ return core.failCause(cause)
196
+ }
197
+ case "Some": {
198
+ return option.value
199
+ }
200
+ }
201
+ },
202
+ onSuccess: core.succeed
203
+ })
204
+ )
205
+
206
+ /* @internal */
207
+ export const catchSomeDefect = dual<
208
+ <A2, E2, R2>(
209
+ pf: (defect: unknown) => Option.Option<Effect.Effect<A2, E2, R2>>
210
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A | A2, E | E2, R | R2>,
211
+ <A, E, R, A2, E2, R2>(
212
+ self: Effect.Effect<A, E, R>,
213
+ pf: (defect: unknown) => Option.Option<Effect.Effect<A2, E2, R2>>
214
+ ) => Effect.Effect<A | A2, E | E2, R | R2>
215
+ >(
216
+ 2,
217
+ <A, E, R, A2, E2, R2>(
218
+ self: Effect.Effect<A, E, R>,
219
+ pf: (defect: unknown) => Option.Option<Effect.Effect<A2, E2, R2>>
220
+ ): Effect.Effect<A | A2, E | E2, R | R2> =>
221
+ core.catchAllCause(
222
+ self,
223
+ (cause): Effect.Effect<A | A2, E | E2, R | R2> => {
224
+ const option = internalCause.find(cause, (_) => internalCause.isDieType(_) ? Option.some(_) : Option.none())
225
+ switch (option._tag) {
226
+ case "None": {
227
+ return core.failCause(cause)
228
+ }
229
+ case "Some": {
230
+ const optionEffect = pf(option.value.defect)
231
+ return optionEffect._tag === "Some" ? optionEffect.value : core.failCause(cause)
232
+ }
233
+ }
234
+ }
235
+ )
236
+ )
237
+
238
+ /* @internal */
239
+ export const catchTag: {
240
+ <
241
+ E,
242
+ const K extends Arr.NonEmptyReadonlyArray<E extends { _tag: string } ? E["_tag"] : never>,
243
+ A1,
244
+ E1,
245
+ R1
246
+ >(
247
+ ...args: [
248
+ ...tags: K,
249
+ f: (e: Extract<Types.NoInfer<E>, { _tag: K[number] }>) => Effect.Effect<A1, E1, R1>
250
+ ]
251
+ ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A | A1, Exclude<E, { _tag: K[number] }> | E1, R | R1>
252
+ <
253
+ A,
254
+ E,
255
+ R,
256
+ const K extends Arr.NonEmptyReadonlyArray<E extends { _tag: string } ? E["_tag"] : never>,
257
+ A1,
258
+ E1,
259
+ R1
260
+ >(
261
+ self: Effect.Effect<A, E, R>,
262
+ ...args: [
263
+ ...tags: K,
264
+ f: (e: Extract<Types.NoInfer<E>, { _tag: K[number] }>) => Effect.Effect<A1, E1, R1>
265
+ ]
266
+ ): Effect.Effect<A | A1, Exclude<E, { _tag: K[number] }> | E1, R | R1>
267
+ } = dual(
268
+ (args: any) => core.isEffect(args[0]),
269
+ <A, E, R, const K extends Arr.NonEmptyReadonlyArray<E extends { _tag: string } ? E["_tag"] : never>, R1, E1, A1>(
270
+ self: Effect.Effect<A, E, R>,
271
+ ...args: [
272
+ ...tags: K & { [I in keyof K]: E extends { _tag: string } ? E["_tag"] : never },
273
+ f: (e: Extract<Types.NoInfer<E>, { _tag: K[number] }>) => Effect.Effect<A1, E1, R1>
274
+ ]
275
+ ): Effect.Effect<A | A1, Exclude<E, { _tag: K[number] }> | E1, R | R1> => {
276
+ const f = args[args.length - 1] as any
277
+ let predicate: Predicate.Predicate<E>
278
+ if (args.length === 2) {
279
+ predicate = Predicate.isTagged(args[0] as string)
280
+ } else {
281
+ predicate = (e) => {
282
+ const tag = Predicate.hasProperty(e, "_tag") ? e["_tag"] : undefined
283
+ if (!tag) return false
284
+ for (let i = 0; i < args.length - 1; i++) {
285
+ if (args[i] === tag) return true
286
+ }
287
+ return false
288
+ }
289
+ }
290
+ return core.catchIf(self, predicate as Predicate.Refinement<E, Extract<E, { _tag: K[number] }>>, f) as any
291
+ }
292
+ ) as any
293
+
294
+ /** @internal */
295
+ export const catchTags: {
296
+ <
297
+ E,
298
+ Cases extends (E extends { _tag: string } ? {
299
+ [K in E["_tag"]]+?: (error: Extract<E, { _tag: K }>) => Effect.Effect<any, any, any>
300
+ } :
301
+ {})
302
+ >(
303
+ cases: Cases
304
+ ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<
305
+ | A
306
+ | {
307
+ [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<infer A, any, any>) ? A : never
308
+ }[keyof Cases],
309
+ | Exclude<E, { _tag: keyof Cases }>
310
+ | {
311
+ [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, infer E, any>) ? E : never
312
+ }[keyof Cases],
313
+ | R
314
+ | {
315
+ [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, any, infer R>) ? R : never
316
+ }[keyof Cases]
317
+ >
318
+ <
319
+ R,
320
+ E,
321
+ A,
322
+ Cases extends (E extends { _tag: string } ? {
323
+ [K in E["_tag"]]+?: (error: Extract<E, { _tag: K }>) => Effect.Effect<any, any, any>
324
+ } :
325
+ {})
326
+ >(
327
+ self: Effect.Effect<A, E, R>,
328
+ cases: Cases
329
+ ): Effect.Effect<
330
+ | A
331
+ | {
332
+ [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<infer A, any, any>) ? A : never
333
+ }[keyof Cases],
334
+ | Exclude<E, { _tag: keyof Cases }>
335
+ | {
336
+ [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, infer E, any>) ? E : never
337
+ }[keyof Cases],
338
+ | R
339
+ | {
340
+ [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, any, infer R>) ? R : never
341
+ }[keyof Cases]
342
+ >
343
+ } = dual(2, (self, cases) => {
344
+ let keys: Array<string>
345
+ return core.catchIf(
346
+ self,
347
+ (e): e is { readonly _tag: string } => {
348
+ keys ??= Object.keys(cases)
349
+ return Predicate.hasProperty(e, "_tag") && Predicate.isString(e["_tag"]) && keys.includes(e["_tag"])
350
+ },
351
+ (e) => cases[e["_tag"]](e)
352
+ )
353
+ })
354
+
355
+ /* @internal */
356
+ export const cause = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<Cause.Cause<E>, never, R> =>
357
+ core.matchCause(self, { onFailure: identity, onSuccess: () => internalCause.empty })
358
+
359
+ /* @internal */
360
+ export const clockWith: <A, E, R>(f: (clock: Clock.Clock) => Effect.Effect<A, E, R>) => Effect.Effect<A, E, R> =
361
+ Clock.clockWith
362
+
363
+ /* @internal */
364
+ export const clock: Effect.Effect<Clock.Clock> = clockWith(core.succeed)
365
+
366
+ /* @internal */
367
+ export const delay = dual<
368
+ (duration: Duration.DurationInput) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>,
369
+ <A, E, R>(self: Effect.Effect<A, E, R>, duration: Duration.DurationInput) => Effect.Effect<A, E, R>
370
+ >(2, (self, duration) => core.zipRight(Clock.sleep(duration), self))
371
+
372
+ /* @internal */
373
+ export const descriptorWith = <A, E, R>(
374
+ f: (descriptor: Fiber.Fiber.Descriptor) => Effect.Effect<A, E, R>
375
+ ): Effect.Effect<A, E, R> =>
376
+ core.withFiberRuntime((state, status) =>
377
+ f({
378
+ id: state.id(),
379
+ status,
380
+ interruptors: internalCause.interruptors(state.getFiberRef(core.currentInterruptedCause))
381
+ })
382
+ ) as Effect.Effect<A, E, R>
383
+
384
+ /* @internal */
385
+ export const allowInterrupt: Effect.Effect<void> = descriptorWith(
386
+ (descriptor) =>
387
+ HashSet.size(descriptor.interruptors) > 0
388
+ ? core.interrupt
389
+ : core.void
390
+ )
391
+
392
+ /* @internal */
393
+ export const descriptor: Effect.Effect<Fiber.Fiber.Descriptor> = descriptorWith(core.succeed)
394
+
395
+ /* @internal */
396
+ export const diffFiberRefs = <A, E, R>(
397
+ self: Effect.Effect<A, E, R>
398
+ ): Effect.Effect<[FiberRefsPatch.FiberRefsPatch, A], E, R> => summarized(self, fiberRefs, fiberRefsPatch.diff)
399
+
400
+ /* @internal */
401
+ export const diffFiberRefsAndRuntimeFlags = <A, E, R>(
402
+ self: Effect.Effect<A, E, R>
403
+ ): Effect.Effect<[[FiberRefsPatch.FiberRefsPatch, runtimeFlagsPatch.RuntimeFlagsPatch], A], E, R> =>
404
+ summarized(
405
+ self,
406
+ core.zip(fiberRefs, core.runtimeFlags),
407
+ ([refs, flags], [refsNew, flagsNew]) => [fiberRefsPatch.diff(refs, refsNew), runtimeFlags.diff(flags, flagsNew)]
408
+ )
409
+
410
+ /* @internal */
411
+ export const Do: Effect.Effect<{}> = core.succeed({})
412
+
413
+ /* @internal */
414
+ export const bind: {
415
+ <N extends string, A extends object, B, E2, R2>(
416
+ name: Exclude<N, keyof A>,
417
+ f: (a: Types.NoInfer<A>) => Effect.Effect<B, E2, R2>
418
+ ): <E1, R1>(
419
+ self: Effect.Effect<A, E1, R1>
420
+ ) => Effect.Effect<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }, E2 | E1, R2 | R1>
421
+ <A extends object, N extends string, E1, R1, B, E2, R2>(
422
+ self: Effect.Effect<A, E1, R1>,
423
+ name: Exclude<N, keyof A>,
424
+ f: (a: Types.NoInfer<A>) => Effect.Effect<B, E2, R2>
425
+ ): Effect.Effect<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }, E1 | E2, R1 | R2>
426
+ } = doNotation.bind<Effect.EffectTypeLambda>(core.map, core.flatMap)
427
+
428
+ /* @internal */
429
+ export const bindTo: {
430
+ <N extends string>(name: N): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<{ [K in N]: A }, E, R>
431
+ <A, E, R, N extends string>(self: Effect.Effect<A, E, R>, name: N): Effect.Effect<{ [K in N]: A }, E, R>
432
+ } = doNotation.bindTo<Effect.EffectTypeLambda>(core.map)
433
+
434
+ /* @internal */
435
+ export const let_: {
436
+ <N extends string, A extends object, B>(
437
+ name: Exclude<N, keyof A>,
438
+ f: (a: Types.NoInfer<A>) => B
439
+ ): <E, R>(
440
+ self: Effect.Effect<A, E, R>
441
+ ) => Effect.Effect<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }, E, R>
442
+ <A extends object, N extends string, E, R, B>(
443
+ self: Effect.Effect<A, E, R>,
444
+ name: Exclude<N, keyof A>,
445
+ f: (a: Types.NoInfer<A>) => B
446
+ ): Effect.Effect<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }, E, R>
447
+ } = doNotation.let_<Effect.EffectTypeLambda>(core.map)
448
+
449
+ /* @internal */
450
+ export const dropUntil: {
451
+ <A, E, R>(
452
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
453
+ ): (elements: Iterable<A>) => Effect.Effect<Array<A>, E, R>
454
+ <A, E, R>(
455
+ elements: Iterable<A>,
456
+ predicate: (a: A, i: number) => Effect.Effect<boolean, E, R>
457
+ ): Effect.Effect<Array<A>, E, R>
458
+ } = dual(
459
+ 2,
460
+ <A, E, R>(
461
+ elements: Iterable<A>,
462
+ predicate: (a: A, i: number) => Effect.Effect<boolean, E, R>
463
+ ): Effect.Effect<Array<A>, E, R> =>
464
+ core.suspend(() => {
465
+ const iterator = elements[Symbol.iterator]()
466
+ const builder: Array<A> = []
467
+ let next: IteratorResult<A, any>
468
+ let dropping: Effect.Effect<boolean, E, R> = core.succeed(false)
469
+ let i = 0
470
+ while ((next = iterator.next()) && !next.done) {
471
+ const a = next.value
472
+ const index = i++
473
+ dropping = core.flatMap(dropping, (bool) => {
474
+ if (bool) {
475
+ builder.push(a)
476
+ return core.succeed(true)
477
+ }
478
+ return predicate(a, index)
479
+ })
480
+ }
481
+ return core.map(dropping, () => builder)
482
+ })
483
+ )
484
+
485
+ /* @internal */
486
+ export const dropWhile: {
487
+ <A, E, R>(
488
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
489
+ ): (elements: Iterable<A>) => Effect.Effect<Array<A>, E, R>
490
+ <A, E, R>(
491
+ elements: Iterable<A>,
492
+ predicate: (a: A, i: number) => Effect.Effect<boolean, E, R>
493
+ ): Effect.Effect<Array<A>, E, R>
494
+ } = dual(
495
+ 2,
496
+ <A, E, R>(
497
+ elements: Iterable<A>,
498
+ predicate: (a: A, i: number) => Effect.Effect<boolean, E, R>
499
+ ): Effect.Effect<Array<A>, E, R> =>
500
+ core.suspend(() => {
501
+ const iterator = elements[Symbol.iterator]()
502
+ const builder: Array<A> = []
503
+ let next
504
+ let dropping: Effect.Effect<boolean, E, R> = core.succeed(true)
505
+ let i = 0
506
+ while ((next = iterator.next()) && !next.done) {
507
+ const a = next.value
508
+ const index = i++
509
+ dropping = core.flatMap(dropping, (d) =>
510
+ core.map(d ? predicate(a, index) : core.succeed(false), (b) => {
511
+ if (!b) {
512
+ builder.push(a)
513
+ }
514
+ return b
515
+ }))
516
+ }
517
+ return core.map(dropping, () => builder)
518
+ })
519
+ )
520
+
521
+ /* @internal */
522
+ export const contextWith = <R, A>(f: (context: Context.Context<R>) => A): Effect.Effect<A, never, R> =>
523
+ core.map(core.context<R>(), f)
524
+
525
+ /* @internal */
526
+ export const eventually = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, never, R> =>
527
+ core.orElse(self, () => core.flatMap(core.yieldNow(), () => eventually(self)))
528
+
529
+ /* @internal */
530
+ export const filterMap = dual<
531
+ <Eff extends Effect.Effect<any, any, any>, B>(
532
+ pf: (a: Effect.Effect.Success<Eff>) => Option.Option<B>
533
+ ) => (elements: Iterable<Eff>) => Effect.Effect<Array<B>, Effect.Effect.Error<Eff>, Effect.Effect.Context<Eff>>,
534
+ <Eff extends Effect.Effect<any, any, any>, B>(
535
+ elements: Iterable<Eff>,
536
+ pf: (a: Effect.Effect.Success<Eff>) => Option.Option<B>
537
+ ) => Effect.Effect<Array<B>, Effect.Effect.Error<Eff>, Effect.Effect.Context<Eff>>
538
+ >(2, (elements, pf) =>
539
+ core.map(
540
+ core.forEachSequential(elements, identity),
541
+ Arr.filterMap(pf)
542
+ ))
543
+
544
+ /* @internal */
545
+ export const filterOrDie: {
546
+ <A, B extends A>(
547
+ refinement: Predicate.Refinement<Types.NoInfer<A>, B>,
548
+ orDieWith: (a: Types.EqualsWith<A, B, A, Exclude<A, B>>) => unknown
549
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, E, R>
550
+ <A>(
551
+ predicate: Predicate.Predicate<Types.NoInfer<A>>,
552
+ orDieWith: (a: Types.NoInfer<A>) => unknown
553
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
554
+ <A, E, R, B extends A>(
555
+ self: Effect.Effect<A, E, R>,
556
+ refinement: Predicate.Refinement<A, B>,
557
+ orDieWith: (a: Types.EqualsWith<A, B, A, Exclude<A, B>>) => unknown
558
+ ): Effect.Effect<B, E, R>
559
+ <A, E, R>(
560
+ self: Effect.Effect<A, E, R>,
561
+ predicate: Predicate.Predicate<A>,
562
+ orDieWith: (a: A) => unknown
563
+ ): Effect.Effect<A, E, R>
564
+ } = dual(
565
+ 3,
566
+ <A, E, R>(
567
+ self: Effect.Effect<A, E, R>,
568
+ predicate: Predicate.Predicate<A>,
569
+ orDieWith: (a: A) => unknown
570
+ ): Effect.Effect<A, E, R> => filterOrElse(self, predicate, (a) => core.dieSync(() => orDieWith(a)))
571
+ )
572
+
573
+ /* @internal */
574
+ export const filterOrDieMessage: {
575
+ <A, B extends A>(
576
+ refinement: Predicate.Refinement<Types.NoInfer<A>, B>,
577
+ message: string
578
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, E, R>
579
+ <A>(
580
+ predicate: Predicate.Predicate<Types.NoInfer<A>>,
581
+ message: string
582
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
583
+ <A, E, R, B extends A>(
584
+ self: Effect.Effect<A, E, R>,
585
+ refinement: Predicate.Refinement<A, B>,
586
+ message: string
587
+ ): Effect.Effect<B, E, R>
588
+ <A, E, R>(
589
+ self: Effect.Effect<A, E, R>,
590
+ predicate: Predicate.Predicate<A>,
591
+ message: string
592
+ ): Effect.Effect<A, E, R>
593
+ } = dual(
594
+ 3,
595
+ <A, E, R>(self: Effect.Effect<A, E, R>, predicate: Predicate.Predicate<A>, message: string): Effect.Effect<A, E, R> =>
596
+ filterOrElse(self, predicate, () => core.dieMessage(message))
597
+ )
598
+
599
+ /* @internal */
600
+ export const filterOrElse: {
601
+ <A, C, E2, R2, B extends A>(
602
+ refinement: Predicate.Refinement<Types.NoInfer<A>, B>,
603
+ orElse: (a: Types.EqualsWith<A, B, Types.NoInfer<A>, Exclude<Types.NoInfer<A>, B>>) => Effect.Effect<C, E2, R2>
604
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B | C, E2 | E, R2 | R>
605
+ <A, C, E2, R2>(
606
+ predicate: Predicate.Predicate<Types.NoInfer<A>>,
607
+ orElse: (a: Types.NoInfer<A>) => Effect.Effect<C, E2, R2>
608
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A | C, E2 | E, R2 | R>
609
+ <A, E, R, C, E2, R2, B extends A>(
610
+ self: Effect.Effect<A, E, R>,
611
+ refinement: Predicate.Refinement<A, B>,
612
+ orElse: (a: Types.EqualsWith<A, B, A, Exclude<A, B>>) => Effect.Effect<C, E2, R2>
613
+ ): Effect.Effect<B | C, E | E2, R | R2>
614
+ <A, E, R, C, E2, R2>(
615
+ self: Effect.Effect<A, E, R>,
616
+ predicate: Predicate.Predicate<A>,
617
+ orElse: (a: A) => Effect.Effect<C, E2, R2>
618
+ ): Effect.Effect<A | C, E | E2, R | R2>
619
+ } = dual(3, <A, E, R, B, E2, R2>(
620
+ self: Effect.Effect<A, E, R>,
621
+ predicate: Predicate.Predicate<A>,
622
+ orElse: (a: A) => Effect.Effect<B, E2, R2>
623
+ ): Effect.Effect<A | B, E | E2, R | R2> =>
624
+ core.flatMap(
625
+ self,
626
+ (a) => predicate(a) ? core.succeed<A | B>(a) : orElse(a)
627
+ ))
628
+
629
+ /** @internal */
630
+ export const liftPredicate = dual<
631
+ <T extends A, E, B extends T = T, A = T>(
632
+ predicate: Predicate.Refinement<T, B> | Predicate.Predicate<T>,
633
+ orFailWith: (a: Types.EqualsWith<T, B, A, Exclude<A, B>>) => E
634
+ ) => (a: A) => Effect.Effect<Types.EqualsWith<T, B, A, B>, E>,
635
+ <A, E, B extends A = A>(
636
+ self: A,
637
+ predicate: Predicate.Refinement<A, B> | Predicate.Predicate<A>,
638
+ orFailWith: (a: Types.EqualsWith<A, B, A, Exclude<A, B>>) => E
639
+ ) => Effect.Effect<B, E>
640
+ >(
641
+ 3,
642
+ <A, E, B extends A = A>(
643
+ self: A,
644
+ predicate: Predicate.Refinement<A, B> | Predicate.Predicate<A>,
645
+ orFailWith: (a: Types.EqualsWith<A, B, A, Exclude<A, B>>) => E
646
+ ): Effect.Effect<B, E> =>
647
+ core.suspend(() => predicate(self) ? core.succeed(self as B) : core.fail(orFailWith(self as any)))
648
+ )
649
+
650
+ /* @internal */
651
+ export const filterOrFail: {
652
+ <A, E2, B extends A>(
653
+ refinement: Predicate.Refinement<Types.NoInfer<A>, B>,
654
+ orFailWith: (a: Types.EqualsWith<A, B, Types.NoInfer<A>, Exclude<Types.NoInfer<A>, B>>) => E2
655
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<Types.NoInfer<B>, E2 | E, R>
656
+ <A, E2>(
657
+ predicate: Predicate.Predicate<Types.NoInfer<A>>,
658
+ orFailWith: (a: Types.NoInfer<A>) => E2
659
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E2 | E, R>
660
+ <A, E, R, E2, B extends A>(
661
+ self: Effect.Effect<A, E, R>,
662
+ refinement: Predicate.Refinement<A, B>,
663
+ orFailWith: (a: Types.EqualsWith<A, B, A, Exclude<A, B>>) => E2
664
+ ): Effect.Effect<Types.NoInfer<B>, E2 | E, R>
665
+ <A, E, R, E2>(
666
+ self: Effect.Effect<A, E, R>,
667
+ predicate: Predicate.Predicate<A>,
668
+ orFailWith: (a: A) => E2
669
+ ): Effect.Effect<A, E2 | E, R>
670
+ <A, B extends A>(
671
+ refinement: Predicate.Refinement<Types.NoInfer<A>, B>
672
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<Types.NoInfer<B>, Cause.NoSuchElementException | E, R>
673
+ <A>(
674
+ predicate: Predicate.Predicate<Types.NoInfer<A>>
675
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, Cause.NoSuchElementException | E, R>
676
+ <A, E, R, B extends A>(
677
+ self: Effect.Effect<A, E, R>,
678
+ refinement: Predicate.Refinement<A, B>
679
+ ): Effect.Effect<Types.NoInfer<B>, E | Cause.NoSuchElementException, R>
680
+ <A, E, R>(
681
+ self: Effect.Effect<A, E, R>,
682
+ predicate: Predicate.Predicate<A>
683
+ ): Effect.Effect<A, E | Cause.NoSuchElementException, R>
684
+ } = dual((args) => core.isEffect(args[0]), <A, E, R, E2>(
685
+ self: Effect.Effect<A, E, R>,
686
+ predicate: Predicate.Predicate<A>,
687
+ orFailWith?: (a: A) => E2
688
+ ): Effect.Effect<A, E | E2 | Cause.NoSuchElementException, R> =>
689
+ filterOrElse(
690
+ self,
691
+ predicate,
692
+ (a): Effect.Effect<never, E2 | Cause.NoSuchElementException, never> =>
693
+ orFailWith === undefined ? core.fail(new core.NoSuchElementException()) : core.failSync(() => orFailWith(a))
694
+ ))
695
+
696
+ /* @internal */
697
+ export const findFirst: {
698
+ <A, E, R>(
699
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
700
+ ): (elements: Iterable<A>) => Effect.Effect<Option.Option<A>, E, R>
701
+ <A, E, R>(
702
+ elements: Iterable<A>,
703
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
704
+ ): Effect.Effect<Option.Option<A>, E, R>
705
+ } = dual(
706
+ 2,
707
+ <A, E, R>(
708
+ elements: Iterable<A>,
709
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
710
+ ): Effect.Effect<Option.Option<A>, E, R> =>
711
+ core.suspend(() => {
712
+ const iterator = elements[Symbol.iterator]()
713
+ const next = iterator.next()
714
+ if (!next.done) {
715
+ return findLoop(iterator, 0, predicate, next.value)
716
+ }
717
+ return core.succeed(Option.none())
718
+ })
719
+ )
720
+
721
+ const findLoop = <A, E, R>(
722
+ iterator: Iterator<A>,
723
+ index: number,
724
+ f: (a: A, i: number) => Effect.Effect<boolean, E, R>,
725
+ value: A
726
+ ): Effect.Effect<Option.Option<A>, E, R> =>
727
+ core.flatMap(f(value, index), (result) => {
728
+ if (result) {
729
+ return core.succeed(Option.some(value))
730
+ }
731
+ const next = iterator.next()
732
+ if (!next.done) {
733
+ return findLoop(iterator, index + 1, f, next.value)
734
+ }
735
+ return core.succeed(Option.none())
736
+ })
737
+
738
+ /* @internal */
739
+ export const firstSuccessOf = <Eff extends Effect.Effect<any, any, any>>(
740
+ effects: Iterable<Eff>
741
+ ): Effect.Effect<Effect.Effect.Success<Eff>, Effect.Effect.Error<Eff>, Effect.Effect.Context<Eff>> =>
742
+ core.suspend(() => {
743
+ const list = Chunk.fromIterable(effects)
744
+ if (!Chunk.isNonEmpty(list)) {
745
+ return core.dieSync(() => new core.IllegalArgumentException(`Received an empty collection of effects`))
746
+ }
747
+ return pipe(
748
+ Chunk.tailNonEmpty(list),
749
+ Arr.reduce(Chunk.headNonEmpty(list), (left, right) => core.orElse(left, () => right) as Eff)
750
+ )
751
+ })
752
+
753
+ /* @internal */
754
+ export const flipWith: {
755
+ <E, A, R, E2, A2, R2>(
756
+ f: (effect: Effect.Effect<E, A, R>) => Effect.Effect<E2, A2, R2>
757
+ ): (self: Effect.Effect<A, E, R>) => Effect.Effect<A2, E2, R2>
758
+ <A, E, R, E2, A2, R2>(
759
+ self: Effect.Effect<A, E, R>,
760
+ f: (effect: Effect.Effect<E, A, R>) => Effect.Effect<E2, A2, R2>
761
+ ): Effect.Effect<A2, E2, R2>
762
+ } = dual(2, <A, E, R, E2, A2, R2>(
763
+ self: Effect.Effect<A, E, R>,
764
+ f: (effect: Effect.Effect<E, A, R>) => Effect.Effect<E2, A2, R2>
765
+ ): Effect.Effect<A2, E2, R2> => core.flip(f(core.flip(self))))
766
+
767
+ /* @internal */
768
+ export const match: {
769
+ <E, A2, A, A3>(
770
+ options: {
771
+ readonly onFailure: (error: E) => A2
772
+ readonly onSuccess: (value: A) => A3
773
+ }
774
+ ): <R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A2 | A3, never, R>
775
+ <A, E, R, A2, A3>(
776
+ self: Effect.Effect<A, E, R>,
777
+ options: {
778
+ readonly onFailure: (error: E) => A2
779
+ readonly onSuccess: (value: A) => A3
780
+ }
781
+ ): Effect.Effect<A2 | A3, never, R>
782
+ } = dual(2, <A, E, R, A2, A3>(
783
+ self: Effect.Effect<A, E, R>,
784
+ options: {
785
+ readonly onFailure: (error: E) => A2
786
+ readonly onSuccess: (value: A) => A3
787
+ }
788
+ ): Effect.Effect<A2 | A3, never, R> =>
789
+ core.matchEffect(self, {
790
+ onFailure: (e) => core.succeed(options.onFailure(e)),
791
+ onSuccess: (a) => core.succeed(options.onSuccess(a))
792
+ }))
793
+
794
+ /* @internal */
795
+ export const every: {
796
+ <A, E, R>(
797
+ predicate: (a: A, i: number) => Effect.Effect<boolean, E, R>
798
+ ): (elements: Iterable<A>) => Effect.Effect<boolean, E, R>
799
+ <A, E, R>(
800
+ elements: Iterable<A>,
801
+ predicate: (a: A, i: number) => Effect.Effect<boolean, E, R>
802
+ ): Effect.Effect<boolean, E, R>
803
+ } = dual(
804
+ 2,
805
+ <A, E, R>(
806
+ elements: Iterable<A>,
807
+ predicate: (a: A, i: number) => Effect.Effect<boolean, E, R>
808
+ ): Effect.Effect<boolean, E, R> => core.suspend(() => forAllLoop(elements[Symbol.iterator](), 0, predicate))
809
+ )
810
+
811
+ const forAllLoop = <A, E, R>(
812
+ iterator: Iterator<A>,
813
+ index: number,
814
+ f: (a: A, i: number) => Effect.Effect<boolean, E, R>
815
+ ): Effect.Effect<boolean, E, R> => {
816
+ const next = iterator.next()
817
+ return next.done
818
+ ? core.succeed(true)
819
+ : core.flatMap(
820
+ f(next.value, index),
821
+ (b) => b ? forAllLoop(iterator, index + 1, f) : core.succeed(b)
822
+ )
823
+ }
824
+
825
+ /* @internal */
826
+ export const forever = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<never, E, R> => {
827
+ const loop: Effect.Effect<never, E, R> = core.flatMap(core.flatMap(self, () => core.yieldNow()), () => loop)
828
+ return loop
829
+ }
830
+
831
+ /* @internal */
832
+ export const fiberRefs: Effect.Effect<FiberRefs.FiberRefs> = core.withFiberRuntime((state) =>
833
+ core.succeed(state.getFiberRefs())
834
+ )
835
+
836
+ /* @internal */
837
+ export const head = <A, E, R>(
838
+ self: Effect.Effect<Iterable<A>, E, R>
839
+ ): Effect.Effect<A, E | Cause.NoSuchElementException, R> =>
840
+ core.flatMap(self, (as) => {
841
+ const iterator = as[Symbol.iterator]()
842
+ const next = iterator.next()
843
+ if (next.done) {
844
+ return core.fail(new core.NoSuchElementException())
845
+ }
846
+ return core.succeed(next.value)
847
+ })
848
+
849
+ /* @internal */
850
+ export const ignore = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<void, never, R> =>
851
+ match(self, { onFailure: constVoid, onSuccess: constVoid })
852
+
853
+ /* @internal */
854
+ export const ignoreLogged = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<void, never, R> =>
855
+ core.matchCauseEffect(self, {
856
+ onFailure: (cause) => logDebug(cause, "An error was silently ignored because it is not anticipated to be useful"),
857
+ onSuccess: () => core.void
858
+ })
859
+
860
+ /* @internal */
861
+ export const inheritFiberRefs = (childFiberRefs: FiberRefs.FiberRefs) =>
862
+ updateFiberRefs((parentFiberId, parentFiberRefs) => FiberRefs.joinAs(parentFiberRefs, parentFiberId, childFiberRefs))
863
+
864
+ /* @internal */
865
+ export const isFailure = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<boolean, never, R> =>
866
+ match(self, { onFailure: constTrue, onSuccess: constFalse })
867
+
868
+ /* @internal */
869
+ export const isSuccess = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<boolean, never, R> =>
870
+ match(self, { onFailure: constFalse, onSuccess: constTrue })
871
+
872
+ /* @internal */
873
+ export const iterate: {
874
+ <A, B extends A, R, E>(
875
+ initial: A,
876
+ options: {
877
+ readonly while: Predicate.Refinement<A, B>
878
+ readonly body: (b: B) => Effect.Effect<A, E, R>
879
+ }
880
+ ): Effect.Effect<A, E, R>
881
+ <A, R, E>(
882
+ initial: A,
883
+ options: {
884
+ readonly while: Predicate.Predicate<A>
885
+ readonly body: (a: A) => Effect.Effect<A, E, R>
886
+ }
887
+ ): Effect.Effect<A, E, R>
888
+ } = <A, E, R>(
889
+ initial: A,
890
+ options: {
891
+ readonly while: Predicate.Predicate<A>
892
+ readonly body: (z: A) => Effect.Effect<A, E, R>
893
+ }
894
+ ): Effect.Effect<A, E, R> =>
895
+ core.suspend<A, E, R>(() => {
896
+ if (options.while(initial)) {
897
+ return core.flatMap(options.body(initial), (z2) => iterate(z2, options))
898
+ }
899
+ return core.succeed(initial)
900
+ })
901
+
902
+ /** @internal */
903
+ export const logWithLevel = (level?: LogLevel.LogLevel) =>
904
+ (
905
+ ...message: ReadonlyArray<any>
906
+ ): Effect.Effect<void> => {
907
+ const levelOption = Option.fromNullable(level)
908
+ let cause: Cause.Cause<unknown> | undefined = undefined
909
+ for (let i = 0, len = message.length; i < len; i++) {
910
+ const msg = message[i]
911
+ if (internalCause.isCause(msg)) {
912
+ if (cause !== undefined) {
913
+ cause = internalCause.sequential(cause, msg)
914
+ } else {
915
+ cause = msg
916
+ }
917
+ message = [...message.slice(0, i), ...message.slice(i + 1)]
918
+ i--
919
+ }
920
+ }
921
+ if (cause === undefined) {
922
+ cause = internalCause.empty
923
+ }
924
+ return core.withFiberRuntime((fiberState) => {
925
+ fiberState.log(message, cause, levelOption)
926
+ return core.void
927
+ })
928
+ }
929
+
930
+ /** @internal */
931
+ export const log: (...message: ReadonlyArray<any>) => Effect.Effect<void, never, never> = logWithLevel()
932
+
933
+ /** @internal */
934
+ export const logTrace: (...message: ReadonlyArray<any>) => Effect.Effect<void, never, never> = logWithLevel(
935
+ LogLevel.Trace
936
+ )
937
+
938
+ /** @internal */
939
+ export const logDebug: (...message: ReadonlyArray<any>) => Effect.Effect<void, never, never> = logWithLevel(
940
+ LogLevel.Debug
941
+ )
942
+
943
+ /** @internal */
944
+ export const logInfo: (...message: ReadonlyArray<any>) => Effect.Effect<void, never, never> = logWithLevel(
945
+ LogLevel.Info
946
+ )
947
+
948
+ /** @internal */
949
+ export const logWarning: (...message: ReadonlyArray<any>) => Effect.Effect<void, never, never> = logWithLevel(
950
+ LogLevel.Warning
951
+ )
952
+
953
+ /** @internal */
954
+ export const logError: (...message: ReadonlyArray<any>) => Effect.Effect<void, never, never> = logWithLevel(
955
+ LogLevel.Error
956
+ )
957
+
958
+ /** @internal */
959
+ export const logFatal: (...message: ReadonlyArray<any>) => Effect.Effect<void, never, never> = logWithLevel(
960
+ LogLevel.Fatal
961
+ )
962
+
963
+ /* @internal */
964
+ export const withLogSpan = dual<
965
+ (label: string) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>,
966
+ <A, E, R>(effect: Effect.Effect<A, E, R>, label: string) => Effect.Effect<A, E, R>
967
+ >(2, (effect, label) =>
968
+ core.flatMap(Clock.currentTimeMillis, (now) =>
969
+ core.fiberRefLocallyWith(
970
+ effect,
971
+ core.currentLogSpan,
972
+ List.prepend(LogSpan.make(label, now))
973
+ )))
974
+
975
+ /* @internal */
976
+ export const logAnnotations: Effect.Effect<HashMap.HashMap<string, unknown>> = core
977
+ .fiberRefGet(
978
+ core.currentLogAnnotations
979
+ )
980
+
981
+ /* @internal */
982
+ export const loop: {
983
+ <A, B extends A, C, E, R>(
984
+ initial: A,
985
+ options: {
986
+ readonly while: Predicate.Refinement<A, B>
987
+ readonly step: (b: B) => A
988
+ readonly body: (b: B) => Effect.Effect<C, E, R>
989
+ readonly discard?: false | undefined
990
+ }
991
+ ): Effect.Effect<Array<C>, E, R>
992
+ <A, C, E, R>(
993
+ initial: A,
994
+ options: {
995
+ readonly while: (a: A) => boolean
996
+ readonly step: (a: A) => A
997
+ readonly body: (a: A) => Effect.Effect<C, E, R>
998
+ readonly discard?: false | undefined
999
+ }
1000
+ ): Effect.Effect<Array<C>, E, R>
1001
+ <A, B extends A, C, E, R>(
1002
+ initial: A,
1003
+ options: {
1004
+ readonly while: Predicate.Refinement<A, B>
1005
+ readonly step: (b: B) => A
1006
+ readonly body: (b: B) => Effect.Effect<R, E, C>
1007
+ readonly discard: true
1008
+ }
1009
+ ): Effect.Effect<void, E, R>
1010
+ <A, C, E, R>(
1011
+ initial: A,
1012
+ options: {
1013
+ readonly while: (a: A) => boolean
1014
+ readonly step: (a: A) => A
1015
+ readonly body: (a: A) => Effect.Effect<C, E, R>
1016
+ readonly discard: true
1017
+ }
1018
+ ): Effect.Effect<void, E, R>
1019
+ } = <A, C, E, R>(
1020
+ initial: A,
1021
+ options: {
1022
+ readonly while: Predicate.Predicate<A>
1023
+ readonly step: (a: A) => A
1024
+ readonly body: (a: A) => Effect.Effect<C, E, R>
1025
+ readonly discard?: boolean | undefined
1026
+ }
1027
+ ): any =>
1028
+ options.discard
1029
+ ? loopDiscard(initial, options.while, options.step, options.body)
1030
+ : core.map(loopInternal(initial, options.while, options.step, options.body), Arr.fromIterable)
1031
+
1032
+ const loopInternal = <Z, A, E, R>(
1033
+ initial: Z,
1034
+ cont: Predicate.Predicate<Z>,
1035
+ inc: (z: Z) => Z,
1036
+ body: (z: Z) => Effect.Effect<A, E, R>
1037
+ ): Effect.Effect<List.List<A>, E, R> =>
1038
+ core.suspend(() =>
1039
+ cont(initial)
1040
+ ? core.flatMap(body(initial), (a) =>
1041
+ core.map(
1042
+ loopInternal(inc(initial), cont, inc, body),
1043
+ List.prepend(a)
1044
+ ))
1045
+ : core.sync(() => List.empty())
1046
+ )
1047
+
1048
+ const loopDiscard = <S, X, E, R>(
1049
+ initial: S,
1050
+ cont: Predicate.Predicate<S>,
1051
+ inc: (s: S) => S,
1052
+ body: (s: S) => Effect.Effect<X, E, R>
1053
+ ): Effect.Effect<void, E, R> =>
1054
+ core.suspend(() =>
1055
+ cont(initial)
1056
+ ? core.flatMap(
1057
+ body(initial),
1058
+ () => loopDiscard(inc(initial), cont, inc, body)
1059
+ )
1060
+ : core.void
1061
+ )
1062
+
1063
+ /* @internal */
1064
+ export const mapAccum: {
1065
+ <S, A, B, E, R, I extends Iterable<A> = Iterable<A>>(
1066
+ initial: S,
1067
+ f: (state: S, a: A, i: number) => Effect.Effect<readonly [S, B], E, R>
1068
+ ): (elements: I) => Effect.Effect<[S, Arr.ReadonlyArray.With<I, B>], E, R>
1069
+ <A, S, B, E, R, I extends Iterable<A> = Iterable<A>>(
1070
+ elements: I,
1071
+ initial: S,
1072
+ f: (state: S, a: A, i: number) => Effect.Effect<readonly [S, B], E, R>
1073
+ ): Effect.Effect<[S, Arr.ReadonlyArray.With<I, B>], E, R>
1074
+ } = dual(3, <A, S, B, E, R, I extends Iterable<A> = Iterable<A>>(
1075
+ elements: I,
1076
+ initial: S,
1077
+ f: (state: S, a: A, i: number) => Effect.Effect<readonly [S, B], E, R>
1078
+ ): Effect.Effect<[S, Array<B>], E, R> =>
1079
+ core.suspend(() => {
1080
+ const iterator = elements[Symbol.iterator]()
1081
+ const builder: Array<B> = []
1082
+ let result: Effect.Effect<S, E, R> = core.succeed(initial)
1083
+ let next: IteratorResult<A, any>
1084
+ let i = 0
1085
+ while (!(next = iterator.next()).done) {
1086
+ const index = i++
1087
+ const value = next.value
1088
+ result = core.flatMap(result, (state) =>
1089
+ core.map(f(state, value, index), ([z, b]) => {
1090
+ builder.push(b)
1091
+ return z
1092
+ }))
1093
+ }
1094
+ return core.map(result, (z) => [z, builder])
1095
+ }))
1096
+
1097
+ /* @internal */
1098
+ export const mapErrorCause: {
1099
+ <E, E2>(
1100
+ f: (cause: Cause.Cause<E>) => Cause.Cause<E2>
1101
+ ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E2, R>
1102
+ <A, E, R, E2>(self: Effect.Effect<A, E, R>, f: (cause: Cause.Cause<E>) => Cause.Cause<E2>): Effect.Effect<A, E2, R>
1103
+ } = dual(
1104
+ 2,
1105
+ <A, E, R, E2>(self: Effect.Effect<A, E, R>, f: (cause: Cause.Cause<E>) => Cause.Cause<E2>): Effect.Effect<A, E2, R> =>
1106
+ core.matchCauseEffect(self, {
1107
+ onFailure: (c) => core.failCauseSync(() => f(c)),
1108
+ onSuccess: core.succeed
1109
+ })
1110
+ )
1111
+
1112
+ /* @internal */
1113
+ export const memoize = <A, E, R>(
1114
+ self: Effect.Effect<A, E, R>
1115
+ ): Effect.Effect<Effect.Effect<A, E, R>> =>
1116
+ pipe(
1117
+ core.deferredMake<[[FiberRefsPatch.FiberRefsPatch, runtimeFlagsPatch.RuntimeFlagsPatch], A], E>(),
1118
+ core.flatMap((deferred) =>
1119
+ pipe(
1120
+ diffFiberRefsAndRuntimeFlags(self),
1121
+ core.intoDeferred(deferred),
1122
+ once,
1123
+ core.map((complete) =>
1124
+ core.zipRight(
1125
+ complete,
1126
+ pipe(
1127
+ core.deferredAwait(deferred),
1128
+ core.flatMap(([patch, a]) =>
1129
+ core.as(core.zip(patchFiberRefs(patch[0]), core.updateRuntimeFlags(patch[1])), a)
1130
+ )
1131
+ )
1132
+ )
1133
+ )
1134
+ )
1135
+ )
1136
+ )
1137
+
1138
+ /* @internal */
1139
+ export const merge = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<E | A, never, R> =>
1140
+ core.matchEffect(self, {
1141
+ onFailure: (e) => core.succeed(e),
1142
+ onSuccess: core.succeed
1143
+ })
1144
+
1145
+ /* @internal */
1146
+ export const negate = <E, R>(self: Effect.Effect<boolean, E, R>): Effect.Effect<boolean, E, R> =>
1147
+ core.map(self, (b) => !b)
1148
+
1149
+ /* @internal */
1150
+ export const none = <A, E, R>(
1151
+ self: Effect.Effect<Option.Option<A>, E, R>
1152
+ ): Effect.Effect<void, E | Cause.NoSuchElementException, R> =>
1153
+ core.flatMap(self, (option) => {
1154
+ switch (option._tag) {
1155
+ case "None":
1156
+ return core.void
1157
+ case "Some":
1158
+ return core.fail(new core.NoSuchElementException())
1159
+ }
1160
+ })
1161
+
1162
+ /* @internal */
1163
+ export const once = <A, E, R>(
1164
+ self: Effect.Effect<A, E, R>
1165
+ ): Effect.Effect<Effect.Effect<void, E, R>> =>
1166
+ core.map(
1167
+ Ref.make(true),
1168
+ (ref) => core.asVoid(core.whenEffect(self, Ref.getAndSet(ref, false)))
1169
+ )
1170
+
1171
+ /* @internal */
1172
+ export const option = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, never, R> =>
1173
+ core.matchEffect(self, {
1174
+ onFailure: () => core.succeed(Option.none()),
1175
+ onSuccess: (a) => core.succeed(Option.some(a))
1176
+ })
1177
+
1178
+ /* @internal */
1179
+ export const orElseFail = dual<
1180
+ <E2>(evaluate: LazyArg<E2>) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E2, R>,
1181
+ <A, E, R, E2>(self: Effect.Effect<A, E, R>, evaluate: LazyArg<E2>) => Effect.Effect<A, E2, R>
1182
+ >(2, (self, evaluate) => core.orElse(self, () => core.failSync(evaluate)))
1183
+
1184
+ /* @internal */
1185
+ export const orElseSucceed = dual<
1186
+ <A2>(evaluate: LazyArg<A2>) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A | A2, never, R>,
1187
+ <A, E, R, A2>(self: Effect.Effect<A, E, R>, evaluate: LazyArg<A2>) => Effect.Effect<A | A2, never, R>
1188
+ >(2, (self, evaluate) => core.orElse(self, () => core.sync(evaluate)))
1189
+
1190
+ /* @internal */
1191
+ export const parallelErrors = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, Array<E>, R> =>
1192
+ core.matchCauseEffect(self, {
1193
+ onFailure: (cause) => {
1194
+ const errors = Arr.fromIterable(internalCause.failures(cause))
1195
+ return errors.length === 0
1196
+ ? core.failCause(cause as Cause.Cause<never>)
1197
+ : core.fail(errors)
1198
+ },
1199
+ onSuccess: core.succeed
1200
+ })
1201
+
1202
+ /* @internal */
1203
+ export const patchFiberRefs = (patch: FiberRefsPatch.FiberRefsPatch): Effect.Effect<void> =>
1204
+ updateFiberRefs((fiberId, fiberRefs) => pipe(patch, fiberRefsPatch.patch(fiberId, fiberRefs)))
1205
+
1206
+ /* @internal */
1207
+ export const promise = <A>(evaluate: (signal: AbortSignal) => PromiseLike<A>): Effect.Effect<A> =>
1208
+ evaluate.length >= 1
1209
+ ? core.async((resolve, signal) => {
1210
+ try {
1211
+ evaluate(signal)
1212
+ .then((a) => resolve(core.succeed(a)), (e) => resolve(core.die(e)))
1213
+ } catch (e) {
1214
+ resolve(core.die(e))
1215
+ }
1216
+ })
1217
+ : core.async((resolve) => {
1218
+ try {
1219
+ ;(evaluate as LazyArg<PromiseLike<A>>)()
1220
+ .then((a) => resolve(core.succeed(a)), (e) => resolve(core.die(e)))
1221
+ } catch (e) {
1222
+ resolve(core.die(e))
1223
+ }
1224
+ })
1225
+
1226
+ /* @internal */
1227
+ export const provideService = dual<
1228
+ <I, S>(
1229
+ tag: Context.Tag<I, S>,
1230
+ service: Types.NoInfer<S>
1231
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, I>>,
1232
+ <A, E, R, I, S>(
1233
+ self: Effect.Effect<A, E, R>,
1234
+ tag: Context.Tag<I, S>,
1235
+ service: Types.NoInfer<S>
1236
+ ) => Effect.Effect<A, E, Exclude<R, I>>
1237
+ >(
1238
+ 3,
1239
+ <A, E, R, I, S>(
1240
+ self: Effect.Effect<A, E, R>,
1241
+ tag: Context.Tag<I, S>,
1242
+ service: Types.NoInfer<S>
1243
+ ): Effect.Effect<A, E, Exclude<R, I>> =>
1244
+ core.contextWithEffect((env) =>
1245
+ core.provideContext(
1246
+ self as Effect.Effect<A, E, I | Exclude<R, I>>,
1247
+ Context.add(env, tag, service)
1248
+ )
1249
+ )
1250
+ )
1251
+
1252
+ /* @internal */
1253
+ export const provideServiceEffect = dual<
1254
+ <I, S, E1, R1>(
1255
+ tag: Context.Tag<I, S>,
1256
+ effect: Effect.Effect<Types.NoInfer<S>, E1, R1>
1257
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | E1, R1 | Exclude<R, I>>,
1258
+ <A, E, R, I, S, E1, R1>(
1259
+ self: Effect.Effect<A, E, R>,
1260
+ tag: Context.Tag<I, S>,
1261
+ effect: Effect.Effect<Types.NoInfer<S>, E1, R1>
1262
+ ) => Effect.Effect<A, E | E1, R1 | Exclude<R, I>>
1263
+ >(3, <A, E, R, I, S, E1, R1>(
1264
+ self: Effect.Effect<A, E, R>,
1265
+ tag: Context.Tag<I, S>,
1266
+ effect: Effect.Effect<Types.NoInfer<S>, E1, R1>
1267
+ ) =>
1268
+ core.contextWithEffect((env: Context.Context<R1 | Exclude<R, I>>) =>
1269
+ core.flatMap(
1270
+ effect,
1271
+ (service) => core.provideContext(self, pipe(env, Context.add(tag, service)) as Context.Context<R | R1>)
1272
+ )
1273
+ ))
1274
+
1275
+ /* @internal */
1276
+ export const random: Effect.Effect<Random.Random> = defaultServices.randomWith(core.succeed)
1277
+
1278
+ /* @internal */
1279
+ export const reduce = dual<
1280
+ <Z, A, E, R>(
1281
+ zero: Z,
1282
+ f: (z: Z, a: A, i: number) => Effect.Effect<Z, E, R>
1283
+ ) => (elements: Iterable<A>) => Effect.Effect<Z, E, R>,
1284
+ <A, Z, E, R>(
1285
+ elements: Iterable<A>,
1286
+ zero: Z,
1287
+ f: (z: Z, a: A, i: number) => Effect.Effect<Z, E, R>
1288
+ ) => Effect.Effect<Z, E, R>
1289
+ >(
1290
+ 3,
1291
+ <A, Z, E, R>(
1292
+ elements: Iterable<A>,
1293
+ zero: Z,
1294
+ f: (z: Z, a: A, i: number) => Effect.Effect<Z, E, R>
1295
+ ) =>
1296
+ Arr.fromIterable(elements).reduce(
1297
+ (acc, el, i) => core.flatMap(acc, (a) => f(a, el, i)),
1298
+ core.succeed(zero) as Effect.Effect<Z, E, R>
1299
+ )
1300
+ )
1301
+
1302
+ /* @internal */
1303
+ export const reduceRight = dual<
1304
+ <A, Z, R, E>(
1305
+ zero: Z,
1306
+ f: (a: A, z: Z, i: number) => Effect.Effect<Z, E, R>
1307
+ ) => (elements: Iterable<A>) => Effect.Effect<Z, E, R>,
1308
+ <A, Z, R, E>(
1309
+ elements: Iterable<A>,
1310
+ zero: Z,
1311
+ f: (a: A, z: Z, i: number) => Effect.Effect<Z, E, R>
1312
+ ) => Effect.Effect<Z, E, R>
1313
+ >(
1314
+ 3,
1315
+ <A, Z, R, E>(elements: Iterable<A>, zero: Z, f: (a: A, z: Z, i: number) => Effect.Effect<Z, E, R>) =>
1316
+ Arr.fromIterable(elements).reduceRight(
1317
+ (acc, el, i) => core.flatMap(acc, (a) => f(el, a, i)),
1318
+ core.succeed(zero) as Effect.Effect<Z, E, R>
1319
+ )
1320
+ )
1321
+
1322
+ /* @internal */
1323
+ export const reduceWhile = dual<
1324
+ <Z, A, E, R>(
1325
+ zero: Z,
1326
+ options: {
1327
+ readonly while: Predicate.Predicate<Z>
1328
+ readonly body: (s: Z, a: A, i: number) => Effect.Effect<Z, E, R>
1329
+ }
1330
+ ) => (elements: Iterable<A>) => Effect.Effect<Z, E, R>,
1331
+ <A, Z, E, R>(
1332
+ elements: Iterable<A>,
1333
+ zero: Z,
1334
+ options: {
1335
+ readonly while: Predicate.Predicate<Z>
1336
+ readonly body: (s: Z, a: A, i: number) => Effect.Effect<Z, E, R>
1337
+ }
1338
+ ) => Effect.Effect<Z, E, R>
1339
+ >(3, <A, Z, E, R>(
1340
+ elements: Iterable<A>,
1341
+ zero: Z,
1342
+ options: {
1343
+ readonly while: Predicate.Predicate<Z>
1344
+ readonly body: (s: Z, a: A, i: number) => Effect.Effect<Z, E, R>
1345
+ }
1346
+ ) =>
1347
+ core.flatMap(
1348
+ core.sync(() => elements[Symbol.iterator]()),
1349
+ (iterator) => reduceWhileLoop(iterator, 0, zero, options.while, options.body)
1350
+ ))
1351
+
1352
+ const reduceWhileLoop = <A, R, E, Z>(
1353
+ iterator: Iterator<A>,
1354
+ index: number,
1355
+ state: Z,
1356
+ predicate: Predicate.Predicate<Z>,
1357
+ f: (s: Z, a: A, i: number) => Effect.Effect<Z, E, R>
1358
+ ): Effect.Effect<Z, E, R> => {
1359
+ const next = iterator.next()
1360
+ if (!next.done && predicate(state)) {
1361
+ return core.flatMap(
1362
+ f(state, next.value, index),
1363
+ (nextState) => reduceWhileLoop(iterator, index + 1, nextState, predicate, f)
1364
+ )
1365
+ }
1366
+ return core.succeed(state)
1367
+ }
1368
+
1369
+ /* @internal */
1370
+ export const repeatN = dual<
1371
+ (n: number) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>,
1372
+ <A, E, R>(self: Effect.Effect<A, E, R>, n: number) => Effect.Effect<A, E, R>
1373
+ >(2, (self, n) => core.suspend(() => repeatNLoop(self, n)))
1374
+
1375
+ /* @internal */
1376
+ const repeatNLoop = <A, E, R>(self: Effect.Effect<A, E, R>, n: number): Effect.Effect<A, E, R> =>
1377
+ core.flatMap(self, (a) =>
1378
+ n <= 0
1379
+ ? core.succeed(a)
1380
+ : core.zipRight(core.yieldNow(), repeatNLoop(self, n - 1)))
1381
+
1382
+ /* @internal */
1383
+ export const sandbox = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, Cause.Cause<E>, R> =>
1384
+ core.matchCauseEffect(self, {
1385
+ onFailure: core.fail,
1386
+ onSuccess: core.succeed
1387
+ })
1388
+
1389
+ /* @internal */
1390
+ export const setFiberRefs = (fiberRefs: FiberRefs.FiberRefs): Effect.Effect<void> =>
1391
+ core.suspend(() => FiberRefs.setAll(fiberRefs))
1392
+
1393
+ /* @internal */
1394
+ export const sleep: (duration: Duration.DurationInput) => Effect.Effect<void> = Clock.sleep
1395
+
1396
+ /* @internal */
1397
+ export const succeedNone: Effect.Effect<Option.Option<never>> = core.succeed(Option.none())
1398
+
1399
+ /* @internal */
1400
+ export const succeedSome = <A>(value: A): Effect.Effect<Option.Option<A>> => core.succeed(Option.some(value))
1401
+
1402
+ /* @internal */
1403
+ export const summarized: {
1404
+ <B, E2, R2, C>(
1405
+ summary: Effect.Effect<B, E2, R2>,
1406
+ f: (start: B, end: B) => C
1407
+ ): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<[C, A], E2 | E, R2 | R>
1408
+ <A, E, R, B, E2, R2, C>(
1409
+ self: Effect.Effect<A, E, R>,
1410
+ summary: Effect.Effect<B, E2, R2>,
1411
+ f: (start: B, end: B) => C
1412
+ ): Effect.Effect<[C, A], E2 | E, R2 | R>
1413
+ } = dual(
1414
+ 3,
1415
+ <A, E, R, B, E2, R2, C>(
1416
+ self: Effect.Effect<A, E, R>,
1417
+ summary: Effect.Effect<B, E2, R2>,
1418
+ f: (start: B, end: B) => C
1419
+ ): Effect.Effect<[C, A], E2 | E, R2 | R> =>
1420
+ core.flatMap(
1421
+ summary,
1422
+ (start) => core.flatMap(self, (value) => core.map(summary, (end) => [f(start, end), value]))
1423
+ )
1424
+ )
1425
+
1426
+ /* @internal */
1427
+ export const tagMetrics = dual<
1428
+ {
1429
+ (key: string, value: string): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
1430
+ (
1431
+ values: Record<string, string>
1432
+ ): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
1433
+ },
1434
+ {
1435
+ <A, E, R>(effect: Effect.Effect<A, E, R>, key: string, value: string): Effect.Effect<A, E, R>
1436
+ <A, E, R>(effect: Effect.Effect<A, E, R>, values: Record<string, string>): Effect.Effect<A, E, R>
1437
+ }
1438
+ >((args) => core.isEffect(args[0]), function() {
1439
+ return labelMetrics(
1440
+ arguments[0],
1441
+ typeof arguments[1] === "string"
1442
+ ? [metricLabel.make(arguments[1], arguments[2])]
1443
+ : Object.entries<string>(arguments[1]).map(([k, v]) => metricLabel.make(k, v))
1444
+ )
1445
+ })
1446
+
1447
+ /* @internal */
1448
+ export const labelMetrics = dual<
1449
+ (labels: Iterable<MetricLabel.MetricLabel>) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>,
1450
+ <A, E, R>(self: Effect.Effect<A, E, R>, labels: Iterable<MetricLabel.MetricLabel>) => Effect.Effect<A, E, R>
1451
+ >(
1452
+ 2,
1453
+ (self, labels) => core.fiberRefLocallyWith(self, core.currentMetricLabels, (old) => Arr.union(old, labels))
1454
+ )
1455
+
1456
+ /* @internal */
1457
+ export const takeUntil: {
1458
+ <A, R, E>(
1459
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
1460
+ ): (elements: Iterable<A>) => Effect.Effect<Array<A>, E, R>
1461
+ <A, E, R>(
1462
+ elements: Iterable<A>,
1463
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
1464
+ ): Effect.Effect<Array<A>, E, R>
1465
+ } = dual(
1466
+ 2,
1467
+ <A, E, R>(
1468
+ elements: Iterable<A>,
1469
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
1470
+ ): Effect.Effect<Array<A>, E, R> =>
1471
+ core.suspend(() => {
1472
+ const iterator = elements[Symbol.iterator]()
1473
+ const builder: Array<A> = []
1474
+ let next: IteratorResult<A, any>
1475
+ let effect: Effect.Effect<boolean, E, R> = core.succeed(false)
1476
+ let i = 0
1477
+ while ((next = iterator.next()) && !next.done) {
1478
+ const a = next.value
1479
+ const index = i++
1480
+ effect = core.flatMap(effect, (bool) => {
1481
+ if (bool) {
1482
+ return core.succeed(true)
1483
+ }
1484
+ builder.push(a)
1485
+ return predicate(a, index)
1486
+ })
1487
+ }
1488
+ return core.map(effect, () => builder)
1489
+ })
1490
+ )
1491
+
1492
+ /* @internal */
1493
+ export const takeWhile = dual<
1494
+ <A, E, R>(
1495
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
1496
+ ) => (elements: Iterable<A>) => Effect.Effect<Array<A>, E, R>,
1497
+ <A, E, R>(
1498
+ elements: Iterable<A>,
1499
+ predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>
1500
+ ) => Effect.Effect<Array<A>, E, R>
1501
+ >(
1502
+ 2,
1503
+ <A, E, R>(elements: Iterable<A>, predicate: (a: Types.NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>) =>
1504
+ core.suspend(() => {
1505
+ const iterator = elements[Symbol.iterator]()
1506
+ const builder: Array<A> = []
1507
+ let next: IteratorResult<A, any>
1508
+ let taking: Effect.Effect<boolean, E, R> = core.succeed(true)
1509
+ let i = 0
1510
+ while ((next = iterator.next()) && !next.done) {
1511
+ const a = next.value
1512
+ const index = i++
1513
+ taking = core.flatMap(taking, (taking) =>
1514
+ pipe(
1515
+ taking ? predicate(a, index) : core.succeed(false),
1516
+ core.map((bool) => {
1517
+ if (bool) {
1518
+ builder.push(a)
1519
+ }
1520
+ return bool
1521
+ })
1522
+ ))
1523
+ }
1524
+ return core.map(taking, () => builder)
1525
+ })
1526
+ )
1527
+
1528
+ /* @internal */
1529
+ export const tapBoth = dual<
1530
+ <E, X, E2, R2, A, X1, E3, R3>(
1531
+ options: {
1532
+ readonly onFailure: (e: Types.NoInfer<E>) => Effect.Effect<X, E2, R2>
1533
+ readonly onSuccess: (a: Types.NoInfer<A>) => Effect.Effect<X1, E3, R3>
1534
+ }
1535
+ ) => <R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | E2 | E3, R | R2 | R3>,
1536
+ <A, E, R, X, E2, R2, X1, E3, R3>(
1537
+ self: Effect.Effect<A, E, R>,
1538
+ options: {
1539
+ readonly onFailure: (e: E) => Effect.Effect<X, E2, R2>
1540
+ readonly onSuccess: (a: A) => Effect.Effect<X1, E3, R3>
1541
+ }
1542
+ ) => Effect.Effect<A, E | E2 | E3, R | R2 | R3>
1543
+ >(2, (self, { onFailure, onSuccess }) =>
1544
+ core.matchCauseEffect(self, {
1545
+ onFailure: (cause) => {
1546
+ const either = internalCause.failureOrCause(cause)
1547
+ switch (either._tag) {
1548
+ case "Left": {
1549
+ return core.zipRight(onFailure(either.left as any), core.failCause(cause))
1550
+ }
1551
+ case "Right": {
1552
+ return core.failCause(cause)
1553
+ }
1554
+ }
1555
+ },
1556
+ onSuccess: (a) => core.as(onSuccess(a as any), a)
1557
+ }))
1558
+
1559
+ /* @internal */
1560
+ export const tapDefect = dual<
1561
+ <X, E2, R2>(
1562
+ f: (cause: Cause.Cause<never>) => Effect.Effect<X, E2, R2>
1563
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | E2, R | R2>,
1564
+ <A, E, R, X, E2, R2>(
1565
+ self: Effect.Effect<A, E, R>,
1566
+ f: (cause: Cause.Cause<never>) => Effect.Effect<X, E2, R2>
1567
+ ) => Effect.Effect<A, E | E2, R | R2>
1568
+ >(2, (self, f) =>
1569
+ core.catchAllCause(self, (cause) =>
1570
+ Option.match(internalCause.keepDefects(cause), {
1571
+ onNone: () => core.failCause(cause),
1572
+ onSome: (a) => core.zipRight(f(a), core.failCause(cause))
1573
+ })))
1574
+
1575
+ /* @internal */
1576
+ export const tapError = dual<
1577
+ <E, X, E2, R2>(
1578
+ f: (e: Types.NoInfer<E>) => Effect.Effect<X, E2, R2>
1579
+ ) => <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | E2, R | R2>,
1580
+ <A, E, R, X, E2, R2>(
1581
+ self: Effect.Effect<A, E, R>,
1582
+ f: (e: E) => Effect.Effect<X, E2, R2>
1583
+ ) => Effect.Effect<A, E | E2, R | R2>
1584
+ >(2, (self, f) =>
1585
+ core.matchCauseEffect(self, {
1586
+ onFailure: (cause) => {
1587
+ const either = internalCause.failureOrCause(cause)
1588
+ switch (either._tag) {
1589
+ case "Left":
1590
+ return core.zipRight(f(either.left as any), core.failCause(cause))
1591
+ case "Right":
1592
+ return core.failCause(cause)
1593
+ }
1594
+ },
1595
+ onSuccess: core.succeed
1596
+ }))
1597
+
1598
+ /* @internal */
1599
+ export const tapErrorTag = dual<
1600
+ <K extends (E extends { _tag: string } ? E["_tag"] : never), E, A1, E1, R1>(
1601
+ k: K,
1602
+ f: (e: Extract<E, { _tag: K }>) => Effect.Effect<A1, E1, R1>
1603
+ ) => <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | E1, R | R1>,
1604
+ <A, E, R, K extends (E extends { _tag: string } ? E["_tag"] : never), A1, E1, R1>(
1605
+ self: Effect.Effect<A, E, R>,
1606
+ k: K,
1607
+ f: (e: Extract<E, { _tag: K }>) => Effect.Effect<A1, E1, R1>
1608
+ ) => Effect.Effect<A, E | E1, R | R1>
1609
+ >(3, (self, k, f) =>
1610
+ tapError(self, (e) => {
1611
+ if (Predicate.isTagged(e, k)) {
1612
+ return f(e as any)
1613
+ }
1614
+ return core.void as any
1615
+ }))
1616
+
1617
+ /* @internal */
1618
+ export const tapErrorCause = dual<
1619
+ <E, X, E2, R2>(
1620
+ f: (cause: Cause.Cause<Types.NoInfer<E>>) => Effect.Effect<X, E2, R2>
1621
+ ) => <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | E2, R | R2>,
1622
+ <A, E, R, X, E2, R2>(
1623
+ self: Effect.Effect<A, E, R>,
1624
+ f: (cause: Cause.Cause<E>) => Effect.Effect<X, E2, R2>
1625
+ ) => Effect.Effect<A, E | E2, R | R2>
1626
+ >(2, (self, f) =>
1627
+ core.matchCauseEffect(self, {
1628
+ onFailure: (cause) => core.zipRight(f(cause), core.failCause(cause)),
1629
+ onSuccess: core.succeed
1630
+ }))
1631
+
1632
+ /* @internal */
1633
+ export const timed = <A, E, R>(
1634
+ self: Effect.Effect<A, E, R>
1635
+ ): Effect.Effect<[duration: Duration.Duration, result: A], E, R> => timedWith(self, Clock.currentTimeNanos)
1636
+
1637
+ /* @internal */
1638
+ export const timedWith = dual<
1639
+ <E1, R1>(
1640
+ nanoseconds: Effect.Effect<bigint, E1, R1>
1641
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<[Duration.Duration, A], E | E1, R | R1>,
1642
+ <A, E, R, E1, R1>(
1643
+ self: Effect.Effect<A, E, R>,
1644
+ nanoseconds: Effect.Effect<bigint, E1, R1>
1645
+ ) => Effect.Effect<[Duration.Duration, A], E | E1, R | R1>
1646
+ >(
1647
+ 2,
1648
+ (self, nanos) => summarized(self, nanos, (start, end) => Duration.nanos(end - start))
1649
+ )
1650
+
1651
+ /* @internal */
1652
+ export const tracerWith: <A, E, R>(f: (tracer: Tracer.Tracer) => Effect.Effect<A, E, R>) => Effect.Effect<A, E, R> =
1653
+ Tracer.tracerWith
1654
+
1655
+ /** @internal */
1656
+ export const tracer: Effect.Effect<Tracer.Tracer> = tracerWith(core.succeed)
1657
+
1658
+ /* @internal */
1659
+ export const tryPromise: {
1660
+ <A, E>(
1661
+ options: {
1662
+ readonly try: (signal: AbortSignal) => PromiseLike<A>
1663
+ readonly catch: (error: unknown) => E
1664
+ }
1665
+ ): Effect.Effect<A, E>
1666
+ <A>(evaluate: (signal: AbortSignal) => PromiseLike<A>): Effect.Effect<A, Cause.UnknownException>
1667
+ } = <A, E>(
1668
+ arg: ((signal: AbortSignal) => PromiseLike<A>) | {
1669
+ readonly try: (signal: AbortSignal) => PromiseLike<A>
1670
+ readonly catch: (error: unknown) => E
1671
+ }
1672
+ ): Effect.Effect<A, E | Cause.UnknownException> => {
1673
+ let evaluate: (signal?: AbortSignal) => PromiseLike<A>
1674
+ let catcher: ((error: unknown) => E) | undefined = undefined
1675
+ if (typeof arg === "function") {
1676
+ evaluate = arg as (signal?: AbortSignal) => PromiseLike<A>
1677
+ } else {
1678
+ evaluate = arg.try as (signal?: AbortSignal) => PromiseLike<A>
1679
+ catcher = arg.catch
1680
+ }
1681
+ const fail = (e: unknown) =>
1682
+ catcher
1683
+ ? core.failSync(() => catcher(e))
1684
+ : core.fail(new core.UnknownException(e, "An unknown error occurred in Effect.tryPromise"))
1685
+
1686
+ if (evaluate.length >= 1) {
1687
+ return core.async((resolve, signal) => {
1688
+ try {
1689
+ evaluate(signal).then(
1690
+ (a) => resolve(core.succeed(a)),
1691
+ (e) => resolve(fail(e))
1692
+ )
1693
+ } catch (e) {
1694
+ resolve(fail(e))
1695
+ }
1696
+ })
1697
+ }
1698
+
1699
+ return core.async((resolve) => {
1700
+ try {
1701
+ evaluate()
1702
+ .then(
1703
+ (a) => resolve(core.succeed(a)),
1704
+ (e) => resolve(fail(e))
1705
+ )
1706
+ } catch (e) {
1707
+ resolve(fail(e))
1708
+ }
1709
+ })
1710
+ }
1711
+
1712
+ /* @internal */
1713
+ export const tryMap = dual<
1714
+ <A, B, E1>(
1715
+ options: {
1716
+ readonly try: (a: A) => B
1717
+ readonly catch: (error: unknown) => E1
1718
+ }
1719
+ ) => <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, E | E1, R>,
1720
+ <A, E, R, B, E1>(
1721
+ self: Effect.Effect<A, E, R>,
1722
+ options: {
1723
+ readonly try: (a: A) => B
1724
+ readonly catch: (error: unknown) => E1
1725
+ }
1726
+ ) => Effect.Effect<B, E | E1, R>
1727
+ >(2, (self, options) =>
1728
+ core.flatMap(self, (a) =>
1729
+ try_({
1730
+ try: () => options.try(a),
1731
+ catch: options.catch
1732
+ })))
1733
+
1734
+ /* @internal */
1735
+ export const tryMapPromise = dual<
1736
+ <A, B, E1>(
1737
+ options: {
1738
+ readonly try: (a: A, signal: AbortSignal) => PromiseLike<B>
1739
+ readonly catch: (error: unknown) => E1
1740
+ }
1741
+ ) => <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, E | E1, R>,
1742
+ <A, E, R, B, E1>(
1743
+ self: Effect.Effect<A, E, R>,
1744
+ options: {
1745
+ readonly try: (a: A, signal: AbortSignal) => PromiseLike<B>
1746
+ readonly catch: (error: unknown) => E1
1747
+ }
1748
+ ) => Effect.Effect<B, E | E1, R>
1749
+ >(2, <A, E, R, B, E1>(
1750
+ self: Effect.Effect<A, E, R>,
1751
+ options: {
1752
+ readonly try: (a: A, signal: AbortSignal) => PromiseLike<B>
1753
+ readonly catch: (error: unknown) => E1
1754
+ }
1755
+ ) =>
1756
+ core.flatMap(self, (a) =>
1757
+ tryPromise({
1758
+ try: options.try.length >= 1
1759
+ ? (signal) => options.try(a, signal)
1760
+ : () => (options.try as (a: A) => PromiseLike<B>)(a),
1761
+ catch: options.catch
1762
+ })))
1763
+
1764
+ /* @internal */
1765
+ export const unless = dual<
1766
+ (condition: LazyArg<boolean>) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<Option.Option<A>, E, R>,
1767
+ <A, E, R>(self: Effect.Effect<A, E, R>, condition: LazyArg<boolean>) => Effect.Effect<Option.Option<A>, E, R>
1768
+ >(2, (self, condition) =>
1769
+ core.suspend(() =>
1770
+ condition()
1771
+ ? succeedNone
1772
+ : asSome(self)
1773
+ ))
1774
+
1775
+ /* @internal */
1776
+ export const unlessEffect = dual<
1777
+ <E2, R2>(
1778
+ condition: Effect.Effect<boolean, E2, R2>
1779
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<Option.Option<A>, E | E2, R | R2>,
1780
+ <A, E, R, E2, R2>(
1781
+ self: Effect.Effect<A, E, R>,
1782
+ condition: Effect.Effect<boolean, E2, R2>
1783
+ ) => Effect.Effect<Option.Option<A>, E | E2, R | R2>
1784
+ >(2, (self, condition) => core.flatMap(condition, (b) => (b ? succeedNone : asSome(self))))
1785
+
1786
+ /* @internal */
1787
+ export const unsandbox = <A, E, R>(self: Effect.Effect<A, Cause.Cause<E>, R>) =>
1788
+ mapErrorCause(self, internalCause.flatten)
1789
+
1790
+ /* @internal */
1791
+ export const updateFiberRefs = (
1792
+ f: (fiberId: FiberId.Runtime, fiberRefs: FiberRefs.FiberRefs) => FiberRefs.FiberRefs
1793
+ ): Effect.Effect<void> =>
1794
+ core.withFiberRuntime((state) => {
1795
+ state.setFiberRefs(f(state.id(), state.getFiberRefs()))
1796
+ return core.void
1797
+ })
1798
+
1799
+ /* @internal */
1800
+ export const updateService = dual<
1801
+ <I, S>(
1802
+ tag: Context.Tag<I, S>,
1803
+ f: (service: Types.NoInfer<S>) => Types.NoInfer<S>
1804
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R | I>,
1805
+ <A, E, R, I, S>(
1806
+ self: Effect.Effect<A, E, R>,
1807
+ tag: Context.Tag<I, S>,
1808
+ f: (service: Types.NoInfer<S>) => Types.NoInfer<S>
1809
+ ) => Effect.Effect<A, E, R | I>
1810
+ >(3, <A, E, R, I, S>(
1811
+ self: Effect.Effect<A, E, R>,
1812
+ tag: Context.Tag<I, S>,
1813
+ f: (service: Types.NoInfer<S>) => Types.NoInfer<S>
1814
+ ) =>
1815
+ core.mapInputContext(self, (context) =>
1816
+ Context.add(
1817
+ context,
1818
+ tag,
1819
+ f(Context.unsafeGet(context, tag))
1820
+ )) as Effect.Effect<A, E, R | I>)
1821
+
1822
+ /* @internal */
1823
+ export const when = dual<
1824
+ (condition: LazyArg<boolean>) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<Option.Option<A>, E, R>,
1825
+ <A, E, R>(self: Effect.Effect<A, E, R>, condition: LazyArg<boolean>) => Effect.Effect<Option.Option<A>, E, R>
1826
+ >(2, (self, condition) =>
1827
+ core.suspend(() =>
1828
+ condition()
1829
+ ? core.map(self, Option.some)
1830
+ : core.succeed(Option.none())
1831
+ ))
1832
+
1833
+ /* @internal */
1834
+ export const whenFiberRef = dual<
1835
+ <S>(
1836
+ fiberRef: FiberRef.FiberRef<S>,
1837
+ predicate: Predicate.Predicate<S>
1838
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<[S, Option.Option<A>], E, R>,
1839
+ <A, E, R, S>(
1840
+ self: Effect.Effect<A, E, R>,
1841
+ fiberRef: FiberRef.FiberRef<S>,
1842
+ predicate: Predicate.Predicate<S>
1843
+ ) => Effect.Effect<[S, Option.Option<A>], E, R>
1844
+ >(
1845
+ 3,
1846
+ <A, E, R, S>(
1847
+ self: Effect.Effect<A, E, R>,
1848
+ fiberRef: FiberRef.FiberRef<S>,
1849
+ predicate: Predicate.Predicate<S>
1850
+ ) =>
1851
+ core.flatMap(core.fiberRefGet(fiberRef), (s) =>
1852
+ predicate(s)
1853
+ ? core.map(self, (a) => [s, Option.some(a)])
1854
+ : core.succeed<[S, Option.Option<A>]>([s, Option.none()]))
1855
+ )
1856
+
1857
+ /* @internal */
1858
+ export const whenRef = dual<
1859
+ <S>(
1860
+ ref: Ref.Ref<S>,
1861
+ predicate: Predicate.Predicate<S>
1862
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<[S, Option.Option<A>], E, R>,
1863
+ <A, E, R, S>(
1864
+ self: Effect.Effect<A, E, R>,
1865
+ ref: Ref.Ref<S>,
1866
+ predicate: Predicate.Predicate<S>
1867
+ ) => Effect.Effect<[S, Option.Option<A>], E, R>
1868
+ >(
1869
+ 3,
1870
+ <A, E, R, S>(self: Effect.Effect<A, E, R>, ref: Ref.Ref<S>, predicate: Predicate.Predicate<S>) =>
1871
+ core.flatMap(Ref.get(ref), (s) =>
1872
+ predicate(s)
1873
+ ? core.map(self, (a) => [s, Option.some(a)])
1874
+ : core.succeed<[S, Option.Option<A>]>([s, Option.none()]))
1875
+ )
1876
+
1877
+ /* @internal */
1878
+ export const withMetric = dual<
1879
+ <Type, In, Out>(
1880
+ metric: Metric.Metric<Type, In, Out>
1881
+ ) => <A extends In, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>,
1882
+ <A extends In, E, R, Type, In, Out>(
1883
+ self: Effect.Effect<A, E, R>,
1884
+ metric: Metric.Metric<Type, In, Out>
1885
+ ) => Effect.Effect<A, E, R>
1886
+ >(2, (self, metric) => metric(self))
1887
+
1888
+ /** @internal */
1889
+ export const serviceFunctionEffect = <T extends Effect.Effect<any, any, any>, Args extends Array<any>, A, E, R>(
1890
+ getService: T,
1891
+ f: (_: Effect.Effect.Success<T>) => (...args: Args) => Effect.Effect<A, E, R>
1892
+ ) =>
1893
+ (...args: Args): Effect.Effect<A, E | Effect.Effect.Error<T>, R | Effect.Effect.Context<T>> =>
1894
+ core.flatMap(getService, (a) => f(a)(...args))
1895
+
1896
+ /** @internal */
1897
+ export const serviceFunction = <T extends Effect.Effect<any, any, any>, Args extends Array<any>, A>(
1898
+ getService: T,
1899
+ f: (_: Effect.Effect.Success<T>) => (...args: Args) => A
1900
+ ) =>
1901
+ (...args: Args): Effect.Effect<A, Effect.Effect.Error<T>, Effect.Effect.Context<T>> =>
1902
+ core.map(getService, (a) => f(a)(...args))
1903
+
1904
+ /** @internal */
1905
+ export const serviceFunctions = <S, SE, SR>(
1906
+ getService: Effect.Effect<S, SE, SR>
1907
+ ): {
1908
+ [k in keyof S as S[k] extends (...args: Array<any>) => Effect.Effect<any, any, any> ? k : never]: S[k] extends
1909
+ (...args: infer Args) => Effect.Effect<infer A, infer E, infer R>
1910
+ ? (...args: Args) => Effect.Effect<A, E | SE, R | SR>
1911
+ : never
1912
+ } =>
1913
+ new Proxy({} as any, {
1914
+ get(_target: any, prop: any, _receiver) {
1915
+ return (...args: Array<any>) => core.flatMap(getService, (s: any) => s[prop](...args))
1916
+ }
1917
+ })
1918
+
1919
+ /** @internal */
1920
+ export const serviceConstants = <S, SE, SR>(
1921
+ getService: Effect.Effect<S, SE, SR>
1922
+ ): {
1923
+ [k in { [k in keyof S]: k }[keyof S]]: S[k] extends Effect.Effect<infer A, infer E, infer R> ?
1924
+ Effect.Effect<A, E | SE, R | SR> :
1925
+ Effect.Effect<S[k], SE, SR>
1926
+ } =>
1927
+ new Proxy({} as any, {
1928
+ get(_target: any, prop: any, _receiver) {
1929
+ return core.flatMap(getService, (s: any) => core.isEffect(s[prop]) ? s[prop] : core.succeed(s[prop]))
1930
+ }
1931
+ })
1932
+
1933
+ /** @internal */
1934
+ export const serviceMembers = <S, SE, SR>(getService: Effect.Effect<S, SE, SR>): {
1935
+ functions: {
1936
+ [k in keyof S as S[k] extends (...args: Array<any>) => Effect.Effect<any, any, any> ? k : never]: S[k] extends
1937
+ (...args: infer Args) => Effect.Effect<infer A, infer E, infer R>
1938
+ ? (...args: Args) => Effect.Effect<A, E | SE, R | SR>
1939
+ : never
1940
+ }
1941
+ constants: {
1942
+ [k in { [k in keyof S]: k }[keyof S]]: S[k] extends Effect.Effect<infer A, infer E, infer R> ?
1943
+ Effect.Effect<A, E | SE, R | SR> :
1944
+ Effect.Effect<S[k], SE, SR>
1945
+ }
1946
+ } => ({
1947
+ functions: serviceFunctions(getService) as any,
1948
+ constants: serviceConstants(getService)
1949
+ })
1950
+
1951
+ /** @internal */
1952
+ export const serviceOption = <I, S>(tag: Context.Tag<I, S>) => core.map(core.context<never>(), Context.getOption(tag))
1953
+
1954
+ /** @internal */
1955
+ export const serviceOptional = <I, S>(tag: Context.Tag<I, S>) =>
1956
+ core.flatMap(core.context<never>(), Context.getOption(tag))
1957
+
1958
+ // -----------------------------------------------------------------------------
1959
+ // tracing
1960
+ // -----------------------------------------------------------------------------
1961
+
1962
+ /* @internal */
1963
+ export const annotateCurrentSpan: {
1964
+ (key: string, value: unknown): Effect.Effect<void>
1965
+ (values: Record<string, unknown>): Effect.Effect<void>
1966
+ } = function(): Effect.Effect<void> {
1967
+ const args = arguments
1968
+ return ignore(core.flatMap(
1969
+ currentSpan,
1970
+ (span) =>
1971
+ core.sync(() => {
1972
+ if (typeof args[0] === "string") {
1973
+ span.attribute(args[0], args[1])
1974
+ } else {
1975
+ for (const key in args[0]) {
1976
+ span.attribute(key, args[0][key])
1977
+ }
1978
+ }
1979
+ })
1980
+ ))
1981
+ }
1982
+
1983
+ /* @internal */
1984
+ export const linkSpanCurrent: {
1985
+ (span: Tracer.AnySpan, attributes?: Readonly<Record<string, unknown>> | undefined): Effect.Effect<void>
1986
+ (links: ReadonlyArray<Tracer.SpanLink>): Effect.Effect<void>
1987
+ } = function(): Effect.Effect<void> {
1988
+ const args = arguments
1989
+ const links: ReadonlyArray<Tracer.SpanLink> = Array.isArray(args[0])
1990
+ ? args[0]
1991
+ : [{ _tag: "SpanLink", span: args[0], attributes: args[1] ?? {} }]
1992
+ return ignore(core.flatMap(
1993
+ currentSpan,
1994
+ (span) => core.sync(() => span.addLinks(links))
1995
+ ))
1996
+ }
1997
+
1998
+ /* @internal */
1999
+ export const annotateSpans = dual<
2000
+ {
2001
+ (key: string, value: unknown): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
2002
+ (
2003
+ values: Record<string, unknown>
2004
+ ): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
2005
+ },
2006
+ {
2007
+ <A, E, R>(effect: Effect.Effect<A, E, R>, key: string, value: unknown): Effect.Effect<A, E, R>
2008
+ <A, E, R>(effect: Effect.Effect<A, E, R>, values: Record<string, unknown>): Effect.Effect<A, E, R>
2009
+ }
2010
+ >(
2011
+ (args) => core.isEffect(args[0]),
2012
+ function<A, E, R>() {
2013
+ const args = arguments
2014
+ return core.fiberRefLocallyWith(
2015
+ args[0] as Effect.Effect<A, E, R>,
2016
+ core.currentTracerSpanAnnotations,
2017
+ typeof args[1] === "string"
2018
+ ? HashMap.set(args[1], args[2])
2019
+ : (annotations) =>
2020
+ Object.entries(args[1] as Record<string, unknown>).reduce(
2021
+ (acc, [key, value]) => HashMap.set(acc, key, value),
2022
+ annotations
2023
+ )
2024
+ )
2025
+ }
2026
+ )
2027
+
2028
+ /** @internal */
2029
+ export const currentParentSpan: Effect.Effect<Tracer.AnySpan, Cause.NoSuchElementException> = serviceOptional(
2030
+ internalTracer.spanTag
2031
+ )
2032
+
2033
+ /** @internal */
2034
+ export const currentSpan: Effect.Effect<Tracer.Span, Cause.NoSuchElementException> = core.flatMap(
2035
+ core.context<never>(),
2036
+ (context) => {
2037
+ const span = context.unsafeMap.get(internalTracer.spanTag.key) as Tracer.AnySpan | undefined
2038
+ return span !== undefined && span._tag === "Span"
2039
+ ? core.succeed(span)
2040
+ : core.fail(new core.NoSuchElementException())
2041
+ }
2042
+ )
2043
+
2044
+ /* @internal */
2045
+ export const linkSpans = dual<
2046
+ (
2047
+ span: Tracer.AnySpan,
2048
+ attributes?: Record<string, unknown>
2049
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>,
2050
+ <A, E, R>(
2051
+ self: Effect.Effect<A, E, R>,
2052
+ span: Tracer.AnySpan,
2053
+ attributes?: Record<string, unknown>
2054
+ ) => Effect.Effect<A, E, R>
2055
+ >(
2056
+ (args) => core.isEffect(args[0]),
2057
+ (self, span, attributes) =>
2058
+ core.fiberRefLocallyWith(
2059
+ self,
2060
+ core.currentTracerSpanLinks,
2061
+ Chunk.append(
2062
+ {
2063
+ _tag: "SpanLink",
2064
+ span,
2065
+ attributes: attributes ?? {}
2066
+ } as const
2067
+ )
2068
+ )
2069
+ )
2070
+
2071
+ const bigint0 = BigInt(0)
2072
+
2073
+ const filterDisablePropagation: (self: Option.Option<Tracer.AnySpan>) => Option.Option<Tracer.AnySpan> = Option.flatMap(
2074
+ (span) =>
2075
+ Context.get(span.context, internalTracer.DisablePropagation)
2076
+ ? span._tag === "Span" ? filterDisablePropagation(span.parent) : Option.none()
2077
+ : Option.some(span)
2078
+ )
2079
+
2080
+ /** @internal */
2081
+ export const unsafeMakeSpan = <XA, XE>(
2082
+ fiber: FiberRuntime<XA, XE>,
2083
+ name: string,
2084
+ options: Tracer.SpanOptions
2085
+ ) => {
2086
+ const disablePropagation = !fiber.getFiberRef(core.currentTracerEnabled) ||
2087
+ (options.context && Context.get(options.context, internalTracer.DisablePropagation))
2088
+ const context = fiber.getFiberRef(core.currentContext)
2089
+ const parent = options.parent
2090
+ ? Option.some(options.parent)
2091
+ : options.root
2092
+ ? Option.none()
2093
+ : filterDisablePropagation(Context.getOption(context, internalTracer.spanTag))
2094
+
2095
+ let span: Tracer.Span
2096
+
2097
+ if (disablePropagation) {
2098
+ span = core.noopSpan({
2099
+ name,
2100
+ parent,
2101
+ context: Context.add(options.context ?? Context.empty(), internalTracer.DisablePropagation, true)
2102
+ })
2103
+ } else {
2104
+ const services = fiber.getFiberRef(defaultServices.currentServices)
2105
+
2106
+ const tracer = Context.get(services, internalTracer.tracerTag)
2107
+ const clock = Context.get(services, Clock.Clock)
2108
+ const timingEnabled = fiber.getFiberRef(core.currentTracerTimingEnabled)
2109
+
2110
+ const fiberRefs = fiber.getFiberRefs()
2111
+ const annotationsFromEnv = FiberRefs.get(fiberRefs, core.currentTracerSpanAnnotations)
2112
+ const linksFromEnv = FiberRefs.get(fiberRefs, core.currentTracerSpanLinks)
2113
+
2114
+ const links = linksFromEnv._tag === "Some" ?
2115
+ options.links !== undefined ?
2116
+ [
2117
+ ...Chunk.toReadonlyArray(linksFromEnv.value),
2118
+ ...(options.links ?? [])
2119
+ ] :
2120
+ Chunk.toReadonlyArray(linksFromEnv.value) :
2121
+ options.links ?? Arr.empty()
2122
+
2123
+ span = tracer.span(
2124
+ name,
2125
+ parent,
2126
+ options.context ?? Context.empty(),
2127
+ links,
2128
+ timingEnabled ? clock.unsafeCurrentTimeNanos() : bigint0,
2129
+ options.kind ?? "internal",
2130
+ options
2131
+ )
2132
+
2133
+ if (annotationsFromEnv._tag === "Some") {
2134
+ HashMap.forEach(annotationsFromEnv.value, (value, key) => span.attribute(key, value))
2135
+ }
2136
+ if (options.attributes !== undefined) {
2137
+ Object.entries(options.attributes).forEach(([k, v]) => span.attribute(k, v))
2138
+ }
2139
+ }
2140
+
2141
+ if (typeof options.captureStackTrace === "function") {
2142
+ internalCause.spanToTrace.set(span, options.captureStackTrace)
2143
+ }
2144
+
2145
+ return span
2146
+ }
2147
+
2148
+ /** @internal */
2149
+ export const makeSpan = (
2150
+ name: string,
2151
+ options?: Tracer.SpanOptions
2152
+ ): Effect.Effect<Tracer.Span> => {
2153
+ options = internalTracer.addSpanStackTrace(options)
2154
+ return core.withFiberRuntime((fiber) => core.succeed(unsafeMakeSpan(fiber, name, options)))
2155
+ }
2156
+
2157
+ /* @internal */
2158
+ export const spanAnnotations: Effect.Effect<HashMap.HashMap<string, unknown>> = core
2159
+ .fiberRefGet(core.currentTracerSpanAnnotations)
2160
+
2161
+ /* @internal */
2162
+ export const spanLinks: Effect.Effect<Chunk.Chunk<Tracer.SpanLink>> = core
2163
+ .fiberRefGet(core.currentTracerSpanLinks)
2164
+
2165
+ /** @internal */
2166
+ export const endSpan = <A, E>(span: Tracer.Span, exit: Exit<A, E>, clock: Clock.Clock, timingEnabled: boolean) =>
2167
+ core.sync(() => {
2168
+ if (span.status._tag === "Ended") {
2169
+ return
2170
+ }
2171
+ if (core.exitIsFailure(exit) && internalCause.spanToTrace.has(span)) {
2172
+ // https://opentelemetry.io/docs/specs/semconv/registry/attributes/code/#code-stacktrace
2173
+ span.attribute("code.stacktrace", internalCause.spanToTrace.get(span)!())
2174
+ }
2175
+ span.end(timingEnabled ? clock.unsafeCurrentTimeNanos() : bigint0, exit)
2176
+ })
2177
+
2178
+ /** @internal */
2179
+ export const useSpan: {
2180
+ <A, E, R>(name: string, evaluate: (span: Tracer.Span) => Effect.Effect<A, E, R>): Effect.Effect<A, E, R>
2181
+ <A, E, R>(
2182
+ name: string,
2183
+ options: Tracer.SpanOptions,
2184
+ evaluate: (span: Tracer.Span) => Effect.Effect<A, E, R>
2185
+ ): Effect.Effect<A, E, R>
2186
+ } = <A, E, R>(
2187
+ name: string,
2188
+ ...args: [evaluate: (span: Tracer.Span) => Effect.Effect<A, E, R>] | [
2189
+ options: any,
2190
+ evaluate: (span: Tracer.Span) => Effect.Effect<A, E, R>
2191
+ ]
2192
+ ) => {
2193
+ const options = internalTracer.addSpanStackTrace(args.length === 1 ? undefined : args[0])
2194
+ const evaluate: (span: Tracer.Span) => Effect.Effect<A, E, R> = args[args.length - 1]
2195
+
2196
+ return core.withFiberRuntime<A, E, R>((fiber) => {
2197
+ const span = unsafeMakeSpan(fiber, name, options)
2198
+ const timingEnabled = fiber.getFiberRef(core.currentTracerTimingEnabled)
2199
+ const clock = Context.get(fiber.getFiberRef(defaultServices.currentServices), clockTag)
2200
+ return core.onExit(evaluate(span), (exit) => endSpan(span, exit, clock, timingEnabled))
2201
+ })
2202
+ }
2203
+
2204
+ /** @internal */
2205
+ export const withParentSpan = dual<
2206
+ (
2207
+ span: Tracer.AnySpan
2208
+ ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Tracer.ParentSpan>>,
2209
+ <A, E, R>(self: Effect.Effect<A, E, R>, span: Tracer.AnySpan) => Effect.Effect<A, E, Exclude<R, Tracer.ParentSpan>>
2210
+ >(2, (self, span) => provideService(self, internalTracer.spanTag, span))
2211
+
2212
+ /** @internal */
2213
+ export const withSpan: {
2214
+ (
2215
+ name: string,
2216
+ options?: Tracer.SpanOptions | undefined
2217
+ ): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Tracer.ParentSpan>>
2218
+ <A, E, R>(
2219
+ self: Effect.Effect<A, E, R>,
2220
+ name: string,
2221
+ options?: Tracer.SpanOptions | undefined
2222
+ ): Effect.Effect<A, E, Exclude<R, Tracer.ParentSpan>>
2223
+ } = function() {
2224
+ const dataFirst = typeof arguments[0] !== "string"
2225
+ const name = dataFirst ? arguments[1] : arguments[0]
2226
+ const options = internalTracer.addSpanStackTrace(dataFirst ? arguments[2] : arguments[1])
2227
+ if (dataFirst) {
2228
+ const self = arguments[0]
2229
+ return useSpan(name, options, (span) => withParentSpan(self, span))
2230
+ }
2231
+ return (self: Effect.Effect<any, any, any>) => useSpan(name, options, (span) => withParentSpan(self, span))
2232
+ } as any
2233
+
2234
+ export const functionWithSpan = <Args extends Array<any>, Ret extends Effect.Effect<any, any, any>>(
2235
+ options: {
2236
+ readonly body: (...args: Args) => Ret
2237
+ readonly options: Effect.FunctionWithSpanOptions | ((...args: Args) => Effect.FunctionWithSpanOptions)
2238
+ readonly captureStackTrace?: boolean | undefined
2239
+ }
2240
+ ): (...args: Args) => Unify<Ret> =>
2241
+ (function(this: any) {
2242
+ let captureStackTrace: LazyArg<string | undefined> | boolean = options.captureStackTrace ?? false
2243
+ if (options.captureStackTrace !== false) {
2244
+ const limit = Error.stackTraceLimit
2245
+ Error.stackTraceLimit = 2
2246
+ const error = new Error()
2247
+ Error.stackTraceLimit = limit
2248
+ let cache: false | string = false
2249
+ captureStackTrace = () => {
2250
+ if (cache !== false) {
2251
+ return cache
2252
+ }
2253
+ if (error.stack) {
2254
+ const stack = error.stack.trim().split("\n")
2255
+ cache = stack.slice(2).join("\n").trim()
2256
+ return cache
2257
+ }
2258
+ }
2259
+ }
2260
+ return core.suspend(() => {
2261
+ const opts = typeof options.options === "function"
2262
+ ? options.options.apply(null, arguments as any)
2263
+ : options.options
2264
+ return withSpan(
2265
+ core.suspend(() => internalCall(() => options.body.apply(this, arguments as any))),
2266
+ opts.name,
2267
+ {
2268
+ ...opts,
2269
+ captureStackTrace
2270
+ }
2271
+ )
2272
+ })
2273
+ }) as any
2274
+
2275
+ // -------------------------------------------------------------------------------------
2276
+ // optionality
2277
+ // -------------------------------------------------------------------------------------
2278
+
2279
+ /* @internal */
2280
+ export const fromNullable = <A>(value: A): Effect.Effect<NonNullable<A>, Cause.NoSuchElementException> =>
2281
+ value == null ? core.fail(new core.NoSuchElementException()) : core.succeed(value as NonNullable<A>)
2282
+
2283
+ /* @internal */
2284
+ export const optionFromOptional = <A, E, R>(
2285
+ self: Effect.Effect<A, E, R>
2286
+ ): Effect.Effect<Option.Option<A>, Exclude<E, Cause.NoSuchElementException>, R> =>
2287
+ core.catchAll(
2288
+ core.map(self, Option.some),
2289
+ (error) =>
2290
+ core.isNoSuchElementException(error) ?
2291
+ succeedNone :
2292
+ core.fail(error as Exclude<E, Cause.NoSuchElementException>)
2293
+ )