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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. package/SourceLocation/package.json +6 -0
  2. package/dist/cjs/Effect.js +2 -28
  3. package/dist/cjs/Effect.js.map +1 -1
  4. package/dist/cjs/FiberRef.js +12 -1
  5. package/dist/cjs/FiberRef.js.map +1 -1
  6. package/dist/cjs/Layer.js +2 -24
  7. package/dist/cjs/Layer.js.map +1 -1
  8. package/dist/cjs/RuntimeFlags.js +1 -29
  9. package/dist/cjs/RuntimeFlags.js.map +1 -1
  10. package/dist/cjs/SourceLocation.js +60 -0
  11. package/dist/cjs/SourceLocation.js.map +1 -0
  12. package/dist/cjs/Tracer.js +1 -15
  13. package/dist/cjs/Tracer.js.map +1 -1
  14. package/dist/cjs/Utils.js +1 -1
  15. package/dist/cjs/Utils.js.map +1 -1
  16. package/dist/cjs/index.js +3 -1
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/internal/clock.js +1 -1
  19. package/dist/cjs/internal/clock.js.map +1 -1
  20. package/dist/cjs/internal/core.js +17 -50
  21. package/dist/cjs/internal/core.js.map +1 -1
  22. package/dist/cjs/internal/effect/circular.js +18 -30
  23. package/dist/cjs/internal/effect/circular.js.map +1 -1
  24. package/dist/cjs/internal/fiberRuntime.js +16 -65
  25. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  26. package/dist/cjs/internal/layer/circular.js +1 -5
  27. package/dist/cjs/internal/layer/circular.js.map +1 -1
  28. package/dist/cjs/internal/layer.js +1 -3
  29. package/dist/cjs/internal/layer.js.map +1 -1
  30. package/dist/cjs/internal/logger.js +25 -2
  31. package/dist/cjs/internal/logger.js.map +1 -1
  32. package/dist/cjs/internal/runtimeFlags.js +2 -11
  33. package/dist/cjs/internal/runtimeFlags.js.map +1 -1
  34. package/dist/cjs/internal/tracer.js +1 -114
  35. package/dist/cjs/internal/tracer.js.map +1 -1
  36. package/dist/dts/Config.d.ts +2 -2
  37. package/dist/dts/Config.d.ts.map +1 -1
  38. package/dist/dts/Effect.d.ts +8 -29
  39. package/dist/dts/Effect.d.ts.map +1 -1
  40. package/dist/dts/FiberRef.d.ts +12 -0
  41. package/dist/dts/FiberRef.d.ts.map +1 -1
  42. package/dist/dts/Layer.d.ts +0 -22
  43. package/dist/dts/Layer.d.ts.map +1 -1
  44. package/dist/dts/RuntimeFlags.d.ts +0 -28
  45. package/dist/dts/RuntimeFlags.d.ts.map +1 -1
  46. package/dist/dts/SourceLocation.d.ts +88 -0
  47. package/dist/dts/SourceLocation.d.ts.map +1 -0
  48. package/dist/dts/Tracer.d.ts +0 -15
  49. package/dist/dts/Tracer.d.ts.map +1 -1
  50. package/dist/dts/index.d.ts +6 -0
  51. package/dist/dts/index.d.ts.map +1 -1
  52. package/dist/dts/internal/core.d.ts.map +1 -1
  53. package/dist/dts/internal/layer.d.ts.map +1 -1
  54. package/dist/dts/internal/runtimeFlags.d.ts.map +1 -1
  55. package/dist/esm/Effect.js +0 -26
  56. package/dist/esm/Effect.js.map +1 -1
  57. package/dist/esm/FiberRef.js +11 -0
  58. package/dist/esm/FiberRef.js.map +1 -1
  59. package/dist/esm/Layer.js +0 -22
  60. package/dist/esm/Layer.js.map +1 -1
  61. package/dist/esm/RuntimeFlags.js +0 -28
  62. package/dist/esm/RuntimeFlags.js.map +1 -1
  63. package/dist/esm/SourceLocation.js +51 -0
  64. package/dist/esm/SourceLocation.js.map +1 -0
  65. package/dist/esm/Tracer.js +0 -14
  66. package/dist/esm/Tracer.js.map +1 -1
  67. package/dist/esm/Utils.js +1 -1
  68. package/dist/esm/Utils.js.map +1 -1
  69. package/dist/esm/index.js +6 -0
  70. package/dist/esm/index.js.map +1 -1
  71. package/dist/esm/internal/clock.js +1 -1
  72. package/dist/esm/internal/clock.js.map +1 -1
  73. package/dist/esm/internal/core.js +12 -45
  74. package/dist/esm/internal/core.js.map +1 -1
  75. package/dist/esm/internal/effect/circular.js +18 -30
  76. package/dist/esm/internal/effect/circular.js.map +1 -1
  77. package/dist/esm/internal/fiberRuntime.js +13 -60
  78. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  79. package/dist/esm/internal/layer/circular.js +0 -4
  80. package/dist/esm/internal/layer/circular.js.map +1 -1
  81. package/dist/esm/internal/layer.js +0 -2
  82. package/dist/esm/internal/layer.js.map +1 -1
  83. package/dist/esm/internal/logger.js +25 -2
  84. package/dist/esm/internal/logger.js.map +1 -1
  85. package/dist/esm/internal/runtimeFlags.js +1 -9
  86. package/dist/esm/internal/runtimeFlags.js.map +1 -1
  87. package/dist/esm/internal/tracer.js +0 -111
  88. package/dist/esm/internal/tracer.js.map +1 -1
  89. package/package.json +12 -1
  90. package/src/Arbitrary.ts +1101 -0
  91. package/src/Array.ts +3589 -0
  92. package/src/BigDecimal.ts +1349 -0
  93. package/src/BigInt.ts +643 -0
  94. package/src/Boolean.ts +287 -0
  95. package/src/Brand.ts +360 -0
  96. package/src/Cache.ts +281 -0
  97. package/src/Cause.ts +1555 -0
  98. package/src/Channel.ts +2355 -0
  99. package/src/ChildExecutorDecision.ts +146 -0
  100. package/src/Chunk.ts +1495 -0
  101. package/src/Clock.ts +111 -0
  102. package/src/Config.ts +542 -0
  103. package/src/ConfigError.ts +270 -0
  104. package/src/ConfigProvider.ts +333 -0
  105. package/src/ConfigProviderPathPatch.ts +100 -0
  106. package/src/Console.ts +226 -0
  107. package/src/Context.ts +585 -0
  108. package/src/Cron.ts +706 -0
  109. package/src/Data.ts +596 -0
  110. package/src/DateTime.ts +1686 -0
  111. package/src/DefaultServices.ts +34 -0
  112. package/src/Deferred.ts +301 -0
  113. package/src/Differ.ts +450 -0
  114. package/src/Duration.ts +1000 -0
  115. package/src/Effect.ts +14817 -0
  116. package/src/Effectable.ts +107 -0
  117. package/src/Either.ts +1040 -0
  118. package/src/Encoding.ts +195 -0
  119. package/src/Equal.ts +98 -0
  120. package/src/Equivalence.ts +235 -0
  121. package/src/ExecutionPlan.ts +308 -0
  122. package/src/ExecutionStrategy.ts +119 -0
  123. package/src/Exit.ts +467 -0
  124. package/src/FastCheck.ts +9 -0
  125. package/src/Fiber.ts +744 -0
  126. package/src/FiberHandle.ts +540 -0
  127. package/src/FiberId.ts +195 -0
  128. package/src/FiberMap.ts +656 -0
  129. package/src/FiberRef.ts +444 -0
  130. package/src/FiberRefs.ts +204 -0
  131. package/src/FiberRefsPatch.ts +105 -0
  132. package/src/FiberSet.ts +491 -0
  133. package/src/FiberStatus.ts +108 -0
  134. package/src/Function.ts +1222 -0
  135. package/src/GlobalValue.ts +53 -0
  136. package/src/Graph.ts +3732 -0
  137. package/src/GroupBy.ts +103 -0
  138. package/src/HKT.ts +45 -0
  139. package/src/Hash.ts +195 -0
  140. package/src/HashMap.ts +519 -0
  141. package/src/HashRing.ts +317 -0
  142. package/src/HashSet.ts +2346 -0
  143. package/src/Inspectable.ts +287 -0
  144. package/src/Iterable.ts +1119 -0
  145. package/src/JSONSchema.ts +1044 -0
  146. package/src/KeyedPool.ts +167 -0
  147. package/src/Layer.ts +1228 -0
  148. package/src/LayerMap.ts +436 -0
  149. package/src/List.ts +977 -0
  150. package/src/LogLevel.ts +285 -0
  151. package/src/LogSpan.ts +25 -0
  152. package/src/Logger.ts +702 -0
  153. package/src/Mailbox.ts +268 -0
  154. package/src/ManagedRuntime.ts +180 -0
  155. package/src/Match.ts +1477 -0
  156. package/src/MergeDecision.ts +95 -0
  157. package/src/MergeState.ts +172 -0
  158. package/src/MergeStrategy.ts +107 -0
  159. package/src/Metric.ts +780 -0
  160. package/src/MetricBoundaries.ts +69 -0
  161. package/src/MetricHook.ts +151 -0
  162. package/src/MetricKey.ts +224 -0
  163. package/src/MetricKeyType.ts +262 -0
  164. package/src/MetricLabel.ts +47 -0
  165. package/src/MetricPair.ts +71 -0
  166. package/src/MetricPolling.ts +148 -0
  167. package/src/MetricRegistry.ts +48 -0
  168. package/src/MetricState.ts +257 -0
  169. package/src/Micro.ts +4405 -0
  170. package/src/ModuleVersion.ts +18 -0
  171. package/src/MutableHashMap.ts +411 -0
  172. package/src/MutableHashSet.ts +706 -0
  173. package/src/MutableList.ts +297 -0
  174. package/src/MutableQueue.ts +227 -0
  175. package/src/MutableRef.ts +202 -0
  176. package/src/NonEmptyIterable.ts +32 -0
  177. package/src/Number.ts +1071 -0
  178. package/src/Option.ts +2170 -0
  179. package/src/Order.ts +373 -0
  180. package/src/Ordering.ts +111 -0
  181. package/src/ParseResult.ts +2031 -0
  182. package/src/PartitionedSemaphore.ts +200 -0
  183. package/src/Pipeable.ts +566 -0
  184. package/src/Pool.ts +204 -0
  185. package/src/Predicate.ts +1405 -0
  186. package/src/Pretty.ts +205 -0
  187. package/src/PrimaryKey.ts +23 -0
  188. package/src/PubSub.ts +182 -0
  189. package/src/Queue.ts +644 -0
  190. package/src/Random.ts +204 -0
  191. package/src/RateLimiter.ts +138 -0
  192. package/src/RcMap.ts +141 -0
  193. package/src/RcRef.ts +122 -0
  194. package/src/Readable.ts +93 -0
  195. package/src/Record.ts +1274 -0
  196. package/src/RedBlackTree.ts +421 -0
  197. package/src/Redacted.ts +144 -0
  198. package/src/Ref.ts +180 -0
  199. package/src/RegExp.ts +38 -0
  200. package/src/Reloadable.ts +127 -0
  201. package/src/Request.ts +347 -0
  202. package/src/RequestBlock.ts +118 -0
  203. package/src/RequestResolver.ts +366 -0
  204. package/src/Resource.ts +119 -0
  205. package/src/Runtime.ts +383 -0
  206. package/src/RuntimeFlags.ts +336 -0
  207. package/src/RuntimeFlagsPatch.ts +183 -0
  208. package/src/STM.ts +2045 -0
  209. package/src/Schedule.ts +2219 -0
  210. package/src/ScheduleDecision.ts +62 -0
  211. package/src/ScheduleInterval.ts +151 -0
  212. package/src/ScheduleIntervals.ts +122 -0
  213. package/src/Scheduler.ts +353 -0
  214. package/src/Schema.ts +10914 -0
  215. package/src/SchemaAST.ts +3043 -0
  216. package/src/Scope.ts +204 -0
  217. package/src/ScopedCache.ts +151 -0
  218. package/src/ScopedRef.ts +117 -0
  219. package/src/Secret.ts +88 -0
  220. package/src/SingleProducerAsyncInput.ts +67 -0
  221. package/src/Sink.ts +1461 -0
  222. package/src/SortedMap.ts +287 -0
  223. package/src/SortedSet.ts +390 -0
  224. package/src/SourceLocation.ts +108 -0
  225. package/src/Stream.ts +6468 -0
  226. package/src/StreamEmit.ts +136 -0
  227. package/src/StreamHaltStrategy.ts +123 -0
  228. package/src/Streamable.ts +45 -0
  229. package/src/String.ts +778 -0
  230. package/src/Struct.ts +243 -0
  231. package/src/Subscribable.ts +100 -0
  232. package/src/SubscriptionRef.ts +298 -0
  233. package/src/Supervisor.ts +240 -0
  234. package/src/Symbol.ts +29 -0
  235. package/src/SynchronizedRef.ts +270 -0
  236. package/src/TArray.ts +495 -0
  237. package/src/TDeferred.ts +100 -0
  238. package/src/TMap.ts +515 -0
  239. package/src/TPriorityQueue.ts +223 -0
  240. package/src/TPubSub.ts +200 -0
  241. package/src/TQueue.ts +432 -0
  242. package/src/TRandom.ts +129 -0
  243. package/src/TReentrantLock.ts +224 -0
  244. package/src/TRef.ts +178 -0
  245. package/src/TSemaphore.ts +129 -0
  246. package/src/TSet.ts +365 -0
  247. package/src/TSubscriptionRef.ts +192 -0
  248. package/src/Take.ts +258 -0
  249. package/src/TestAnnotation.ts +158 -0
  250. package/src/TestAnnotationMap.ts +119 -0
  251. package/src/TestAnnotations.ts +117 -0
  252. package/src/TestClock.ts +556 -0
  253. package/src/TestConfig.ts +47 -0
  254. package/src/TestContext.ts +36 -0
  255. package/src/TestLive.ts +53 -0
  256. package/src/TestServices.ts +390 -0
  257. package/src/TestSized.ts +55 -0
  258. package/src/Tracer.ts +182 -0
  259. package/src/Trie.ts +840 -0
  260. package/src/Tuple.ts +305 -0
  261. package/src/Types.ts +353 -0
  262. package/src/Unify.ts +113 -0
  263. package/src/UpstreamPullRequest.ts +117 -0
  264. package/src/UpstreamPullStrategy.ts +121 -0
  265. package/src/Utils.ts +809 -0
  266. package/src/index.ts +1568 -0
  267. package/src/internal/array.ts +8 -0
  268. package/src/internal/blockedRequests.ts +520 -0
  269. package/src/internal/cache.ts +733 -0
  270. package/src/internal/cause.ts +1050 -0
  271. package/src/internal/channel/channelExecutor.ts +1200 -0
  272. package/src/internal/channel/channelState.ts +134 -0
  273. package/src/internal/channel/childExecutorDecision.ts +96 -0
  274. package/src/internal/channel/continuation.ts +200 -0
  275. package/src/internal/channel/mergeDecision.ts +113 -0
  276. package/src/internal/channel/mergeState.ts +120 -0
  277. package/src/internal/channel/mergeStrategy.ts +72 -0
  278. package/src/internal/channel/singleProducerAsyncInput.ts +259 -0
  279. package/src/internal/channel/subexecutor.ts +229 -0
  280. package/src/internal/channel/upstreamPullRequest.ts +84 -0
  281. package/src/internal/channel/upstreamPullStrategy.ts +87 -0
  282. package/src/internal/channel.ts +2603 -0
  283. package/src/internal/clock.ts +95 -0
  284. package/src/internal/completedRequestMap.ts +9 -0
  285. package/src/internal/concurrency.ts +54 -0
  286. package/src/internal/config.ts +716 -0
  287. package/src/internal/configError.ts +304 -0
  288. package/src/internal/configProvider/pathPatch.ts +97 -0
  289. package/src/internal/configProvider.ts +799 -0
  290. package/src/internal/console.ts +153 -0
  291. package/src/internal/context.ts +337 -0
  292. package/src/internal/core-effect.ts +2293 -0
  293. package/src/internal/core-stream.ts +998 -0
  294. package/src/internal/core.ts +3189 -0
  295. package/src/internal/data.ts +36 -0
  296. package/src/internal/dataSource.ts +327 -0
  297. package/src/internal/dateTime.ts +1277 -0
  298. package/src/internal/defaultServices/console.ts +100 -0
  299. package/src/internal/defaultServices.ts +163 -0
  300. package/src/internal/deferred.ts +46 -0
  301. package/src/internal/differ/chunkPatch.ts +211 -0
  302. package/src/internal/differ/contextPatch.ts +232 -0
  303. package/src/internal/differ/hashMapPatch.ts +220 -0
  304. package/src/internal/differ/hashSetPatch.ts +176 -0
  305. package/src/internal/differ/orPatch.ts +311 -0
  306. package/src/internal/differ/readonlyArrayPatch.ts +210 -0
  307. package/src/internal/differ.ts +200 -0
  308. package/src/internal/doNotation.ts +80 -0
  309. package/src/internal/effect/circular.ts +895 -0
  310. package/src/internal/effectable.ts +131 -0
  311. package/src/internal/either.ts +110 -0
  312. package/src/internal/encoding/base64.ts +286 -0
  313. package/src/internal/encoding/base64Url.ts +29 -0
  314. package/src/internal/encoding/common.ts +51 -0
  315. package/src/internal/encoding/hex.ts +315 -0
  316. package/src/internal/errors.ts +7 -0
  317. package/src/internal/executionPlan.ts +114 -0
  318. package/src/internal/executionStrategy.ts +74 -0
  319. package/src/internal/fiber.ts +388 -0
  320. package/src/internal/fiberId.ts +267 -0
  321. package/src/internal/fiberMessage.ts +82 -0
  322. package/src/internal/fiberRefs/patch.ts +144 -0
  323. package/src/internal/fiberRefs.ts +297 -0
  324. package/src/internal/fiberRuntime.ts +3842 -0
  325. package/src/internal/fiberScope.ts +71 -0
  326. package/src/internal/fiberStatus.ts +119 -0
  327. package/src/internal/groupBy.ts +530 -0
  328. package/src/internal/hashMap/array.ts +49 -0
  329. package/src/internal/hashMap/bitwise.ts +32 -0
  330. package/src/internal/hashMap/config.ts +14 -0
  331. package/src/internal/hashMap/keySet.ts +8 -0
  332. package/src/internal/hashMap/node.ts +391 -0
  333. package/src/internal/hashMap.ts +586 -0
  334. package/src/internal/hashSet.ts +323 -0
  335. package/src/internal/keyedPool.ts +244 -0
  336. package/src/internal/layer/circular.ts +214 -0
  337. package/src/internal/layer.ts +1483 -0
  338. package/src/internal/logSpan.ts +20 -0
  339. package/src/internal/logger-circular.ts +24 -0
  340. package/src/internal/logger.ts +522 -0
  341. package/src/internal/mailbox.ts +561 -0
  342. package/src/internal/managedRuntime/circular.ts +6 -0
  343. package/src/internal/managedRuntime.ts +134 -0
  344. package/src/internal/matcher.ts +652 -0
  345. package/src/internal/metric/boundaries.ts +75 -0
  346. package/src/internal/metric/hook.ts +483 -0
  347. package/src/internal/metric/key.ts +167 -0
  348. package/src/internal/metric/keyType.ts +238 -0
  349. package/src/internal/metric/label.ts +41 -0
  350. package/src/internal/metric/pair.ts +48 -0
  351. package/src/internal/metric/polling.ts +149 -0
  352. package/src/internal/metric/registry.ts +187 -0
  353. package/src/internal/metric/state.ts +290 -0
  354. package/src/internal/metric.ts +577 -0
  355. package/src/internal/opCodes/cause.ts +35 -0
  356. package/src/internal/opCodes/channel.ts +83 -0
  357. package/src/internal/opCodes/channelChildExecutorDecision.ts +17 -0
  358. package/src/internal/opCodes/channelMergeDecision.ts +11 -0
  359. package/src/internal/opCodes/channelMergeState.ts +17 -0
  360. package/src/internal/opCodes/channelMergeStrategy.ts +11 -0
  361. package/src/internal/opCodes/channelState.ts +23 -0
  362. package/src/internal/opCodes/channelUpstreamPullRequest.ts +11 -0
  363. package/src/internal/opCodes/channelUpstreamPullStrategy.ts +11 -0
  364. package/src/internal/opCodes/config.ts +65 -0
  365. package/src/internal/opCodes/configError.ts +35 -0
  366. package/src/internal/opCodes/continuation.ts +11 -0
  367. package/src/internal/opCodes/deferred.ts +11 -0
  368. package/src/internal/opCodes/effect.ts +89 -0
  369. package/src/internal/opCodes/layer.ts +59 -0
  370. package/src/internal/opCodes/streamHaltStrategy.ts +23 -0
  371. package/src/internal/option.ts +80 -0
  372. package/src/internal/pool.ts +432 -0
  373. package/src/internal/pubsub.ts +1762 -0
  374. package/src/internal/query.ts +204 -0
  375. package/src/internal/queue.ts +766 -0
  376. package/src/internal/random.ts +161 -0
  377. package/src/internal/rateLimiter.ts +93 -0
  378. package/src/internal/rcMap.ts +285 -0
  379. package/src/internal/rcRef.ts +192 -0
  380. package/src/internal/redBlackTree/iterator.ts +200 -0
  381. package/src/internal/redBlackTree/node.ts +68 -0
  382. package/src/internal/redBlackTree.ts +1245 -0
  383. package/src/internal/redacted.ts +73 -0
  384. package/src/internal/ref.ts +171 -0
  385. package/src/internal/reloadable.ts +140 -0
  386. package/src/internal/request.ts +177 -0
  387. package/src/internal/resource.ts +76 -0
  388. package/src/internal/ringBuffer.ts +68 -0
  389. package/src/internal/runtime.ts +558 -0
  390. package/src/internal/runtimeFlags.ts +178 -0
  391. package/src/internal/runtimeFlagsPatch.ts +103 -0
  392. package/src/internal/schedule/decision.ts +47 -0
  393. package/src/internal/schedule/interval.ts +101 -0
  394. package/src/internal/schedule/intervals.ts +180 -0
  395. package/src/internal/schedule.ts +2199 -0
  396. package/src/internal/schema/errors.ts +191 -0
  397. package/src/internal/schema/schemaId.ts +106 -0
  398. package/src/internal/schema/util.ts +50 -0
  399. package/src/internal/scopedCache.ts +644 -0
  400. package/src/internal/scopedRef.ts +118 -0
  401. package/src/internal/secret.ts +89 -0
  402. package/src/internal/singleShotGen.ts +35 -0
  403. package/src/internal/sink.ts +2120 -0
  404. package/src/internal/stack.ts +10 -0
  405. package/src/internal/stm/core.ts +817 -0
  406. package/src/internal/stm/entry.ts +59 -0
  407. package/src/internal/stm/journal.ts +123 -0
  408. package/src/internal/stm/opCodes/stm.ts +71 -0
  409. package/src/internal/stm/opCodes/stmState.ts +17 -0
  410. package/src/internal/stm/opCodes/strategy.ts +17 -0
  411. package/src/internal/stm/opCodes/tExit.ts +29 -0
  412. package/src/internal/stm/opCodes/tryCommit.ts +11 -0
  413. package/src/internal/stm/stm.ts +1453 -0
  414. package/src/internal/stm/stmState.ts +136 -0
  415. package/src/internal/stm/tArray.ts +550 -0
  416. package/src/internal/stm/tDeferred.ts +81 -0
  417. package/src/internal/stm/tExit.ts +190 -0
  418. package/src/internal/stm/tMap.ts +824 -0
  419. package/src/internal/stm/tPriorityQueue.ts +267 -0
  420. package/src/internal/stm/tPubSub.ts +551 -0
  421. package/src/internal/stm/tQueue.ts +393 -0
  422. package/src/internal/stm/tRandom.ts +140 -0
  423. package/src/internal/stm/tReentrantLock.ts +352 -0
  424. package/src/internal/stm/tRef.ts +195 -0
  425. package/src/internal/stm/tSemaphore.ts +113 -0
  426. package/src/internal/stm/tSet.ts +259 -0
  427. package/src/internal/stm/tSubscriptionRef.ts +286 -0
  428. package/src/internal/stm/tryCommit.ts +34 -0
  429. package/src/internal/stm/txnId.ts +14 -0
  430. package/src/internal/stm/versioned.ts +4 -0
  431. package/src/internal/stream/debounceState.ts +57 -0
  432. package/src/internal/stream/emit.ts +123 -0
  433. package/src/internal/stream/haltStrategy.ts +94 -0
  434. package/src/internal/stream/handoff.ts +187 -0
  435. package/src/internal/stream/handoffSignal.ts +59 -0
  436. package/src/internal/stream/pull.ts +34 -0
  437. package/src/internal/stream/sinkEndReason.ts +30 -0
  438. package/src/internal/stream/zipAllState.ts +88 -0
  439. package/src/internal/stream/zipChunksState.ts +56 -0
  440. package/src/internal/stream.ts +8801 -0
  441. package/src/internal/string-utils.ts +107 -0
  442. package/src/internal/subscriptionRef.ts +138 -0
  443. package/src/internal/supervisor/patch.ts +190 -0
  444. package/src/internal/supervisor.ts +303 -0
  445. package/src/internal/synchronizedRef.ts +114 -0
  446. package/src/internal/take.ts +199 -0
  447. package/src/internal/testing/sleep.ts +27 -0
  448. package/src/internal/testing/suspendedWarningData.ts +85 -0
  449. package/src/internal/testing/warningData.ts +94 -0
  450. package/src/internal/tracer.ts +150 -0
  451. package/src/internal/trie.ts +722 -0
  452. package/src/internal/version.ts +7 -0
package/src/Number.ts ADDED
@@ -0,0 +1,1071 @@
1
+ /**
2
+ * # Number
3
+ *
4
+ * This module provides utility functions and type class instances for working
5
+ * with the `number` type in TypeScript. It includes functions for basic
6
+ * arithmetic operations, as well as type class instances for `Equivalence` and
7
+ * `Order`.
8
+ *
9
+ * ## Operations Reference
10
+ *
11
+ * | Category | Operation | Description | Domain | Co-domain |
12
+ * | ------------ | ------------------------------------------ | ------------------------------------------------------- | ------------------------------ | --------------------- |
13
+ * | constructors | {@link module:Number.parse} | Safely parses a string to a number | `string` | `Option<number>` |
14
+ * | | | | | |
15
+ * | math | {@link module:Number.sum} | Adds two numbers | `number`, `number` | `number` |
16
+ * | math | {@link module:Number.sumAll} | Sums all numbers in a collection | `Iterable<number>` | `number` |
17
+ * | math | {@link module:Number.subtract} | Subtracts one number from another | `number`, `number` | `number` |
18
+ * | math | {@link module:Number.multiply} | Multiplies two numbers | `number`, `number` | `number` |
19
+ * | math | {@link module:Number.multiplyAll} | Multiplies all numbers in a collection | `Iterable<number>` | `number` |
20
+ * | math | {@link module:Number.divide} | Safely divides handling division by zero | `number`, `number` | `Option<number>` |
21
+ * | math | {@link module:Number.unsafeDivide} | Divides but misbehaves for division by zero | `number`, `number` | `number` |
22
+ * | math | {@link module:Number.remainder} | Calculates remainder of division | `number`, `number` | `number` |
23
+ * | math | {@link module:Number.increment} | Adds 1 to a number | `number` | `number` |
24
+ * | math | {@link module:Number.decrement} | Subtracts 1 from a number | `number` | `number` |
25
+ * | math | {@link module:Number.sign} | Determines the sign of a number | `number` | `Ordering` |
26
+ * | math | {@link module:Number.nextPow2} | Finds the next power of 2 | `number` | `number` |
27
+ * | math | {@link module:Number.round} | Rounds a number with specified precision | `number`, `number` | `number` |
28
+ * | | | | | |
29
+ * | predicates | {@link module:Number.between} | Checks if a number is in a range | `number`, `{minimum, maximum}` | `boolean` |
30
+ * | predicates | {@link module:Number.lessThan} | Checks if one number is less than another | `number`, `number` | `boolean` |
31
+ * | predicates | {@link module:Number.lessThanOrEqualTo} | Checks if one number is less than or equal | `number`, `number` | `boolean` |
32
+ * | predicates | {@link module:Number.greaterThan} | Checks if one number is greater than another | `number`, `number` | `boolean` |
33
+ * | predicates | {@link module:Number.greaterThanOrEqualTo} | Checks if one number is greater or equal | `number`, `number` | `boolean` |
34
+ * | | | | | |
35
+ * | guards | {@link module:Number.isNumber} | Type guard for JavaScript numbers | `unknown` | `boolean` |
36
+ * | | | | | |
37
+ * | comparison | {@link module:Number.min} | Returns the minimum of two numbers | `number`, `number` | `number` |
38
+ * | comparison | {@link module:Number.max} | Returns the maximum of two numbers | `number`, `number` | `number` |
39
+ * | comparison | {@link module:Number.clamp} | Restricts a number to a range | `number`, `{minimum, maximum}` | `number` |
40
+ * | | | | | |
41
+ * | instances | {@link module:Number.Equivalence} | Equivalence instance for numbers | | `Equivalence<number>` |
42
+ * | instances | {@link module:Number.Order} | Order instance for numbers | | `Order<number>` |
43
+ * | | | | | |
44
+ * | errors | {@link module:Number.DivisionByZeroError} | Error thrown by unsafeDivide | | |
45
+ *
46
+ * ## Composition Patterns and Type Safety
47
+ *
48
+ * When building function pipelines, understanding how types flow through
49
+ * operations is critical:
50
+ *
51
+ * ### Composing with type-preserving operations
52
+ *
53
+ * Most operations in this module are type-preserving (`number → number`),
54
+ * making them easily composable in pipelines:
55
+ *
56
+ * ```ts
57
+ * import { pipe } from "effect"
58
+ * import * as Number from "effect/Number"
59
+ *
60
+ * const result = pipe(
61
+ * 10,
62
+ * Number.increment, // number → number
63
+ * Number.multiply(2), // number → number
64
+ * Number.round(1) // number → number
65
+ * ) // Result: number (21)
66
+ * ```
67
+ *
68
+ * ### Working with Option results
69
+ *
70
+ * Operations that might fail (like division by zero) return Option types and
71
+ * require Option combinators:
72
+ *
73
+ * ```ts
74
+ * import { pipe, Option } from "effect"
75
+ * import * as Number from "effect/Number"
76
+ *
77
+ * const result = pipe(
78
+ * 10,
79
+ * Number.divide(0), // number → Option<number>
80
+ * Option.getOrElse(() => 0) // Option<number> → number
81
+ * ) // Result: number (0)
82
+ * ```
83
+ *
84
+ * ### Composition best practices
85
+ *
86
+ * - Chain type-preserving operations for maximum composability
87
+ * - Use Option combinators when working with potentially failing operations
88
+ * - Consider using Effect for operations that might fail with specific errors
89
+ * - Remember that all operations maintain JavaScript's floating-point precision
90
+ * limitations
91
+ *
92
+ * @module Number
93
+ * @since 2.0.0
94
+ * @see {@link module:BigInt} for more similar operations on `bigint` types
95
+ * @see {@link module:BigDecimal} for more similar operations on `BigDecimal` types
96
+ */
97
+
98
+ import * as equivalence from "./Equivalence.js"
99
+ import { dual } from "./Function.js"
100
+ import * as option from "./internal/option.js"
101
+ import * as _Iterable from "./Iterable.js"
102
+ import type { Option } from "./Option.js"
103
+ import * as order from "./Order.js"
104
+ import type { Ordering } from "./Ordering.js"
105
+ import * as predicate from "./Predicate.js"
106
+
107
+ /**
108
+ * Type guard that tests if a value is a member of the set of JavaScript
109
+ * numbers.
110
+ *
111
+ * @memberof Number
112
+ * @since 2.0.0
113
+ * @category guards
114
+ * @example
115
+ *
116
+ * ```ts
117
+ * import * as assert from "node:assert/strict"
118
+ * import * as Number from "effect/Number"
119
+ *
120
+ * // Regular numbers
121
+ * assert.equal(Number.isNumber(2), true)
122
+ * assert.equal(Number.isNumber(-3.14), true)
123
+ * assert.equal(Number.isNumber(0), true)
124
+ *
125
+ * // Special numeric values
126
+ * assert.equal(Number.isNumber(Infinity), true)
127
+ * assert.equal(Number.isNumber(NaN), true)
128
+ *
129
+ * // Non-number values
130
+ * assert.equal(Number.isNumber("2"), false)
131
+ * assert.equal(Number.isNumber(true), false)
132
+ * assert.equal(Number.isNumber(null), false)
133
+ * assert.equal(Number.isNumber(undefined), false)
134
+ * assert.equal(Number.isNumber({}), false)
135
+ * assert.equal(Number.isNumber([]), false)
136
+ *
137
+ * // Using as a type guard in conditionals
138
+ * function processValue(value: unknown): string {
139
+ * if (Number.isNumber(value)) {
140
+ * // TypeScript now knows 'value' is a number
141
+ * return `Numeric value: ${value.toFixed(2)}`
142
+ * }
143
+ * return "Not a number"
144
+ * }
145
+ *
146
+ * assert.strictEqual(processValue(42), "Numeric value: 42.00")
147
+ * assert.strictEqual(processValue("hello"), "Not a number")
148
+ *
149
+ * // Filtering for numbers in an array
150
+ * const mixed = [1, "two", 3, false, 5]
151
+ * const onlyNumbers = mixed.filter(Number.isNumber)
152
+ * assert.equal(onlyNumbers, [1, 3, 5])
153
+ * ```
154
+ *
155
+ * @param input - The value to test for membership in the set of JavaScript
156
+ * numbers
157
+ *
158
+ * @returns `true` if the input is a JavaScript number, `false` otherwise
159
+ */
160
+ export const isNumber: (input: unknown) => input is number = predicate.isNumber
161
+
162
+ /**
163
+ * Returns the additive inverse of a number, effectively negating it.
164
+ *
165
+ * @memberof Number
166
+ * @since 3.14.6
167
+ * @example
168
+ *
169
+ * ```ts
170
+ * import * as assert from "node:assert/strict"
171
+ * import { pipe } from "effect"
172
+ * import * as Number from "effect/Number"
173
+ *
174
+ * assert.equal(
175
+ * Number.negate(5), //
176
+ * -5
177
+ * )
178
+ *
179
+ * assert.equal(
180
+ * Number.negate(-5), //
181
+ * 5
182
+ * )
183
+ *
184
+ * assert.equal(
185
+ * Number.negate(0), //
186
+ * 0
187
+ * )
188
+ * ```
189
+ *
190
+ * @param n - The number value to be negated.
191
+ *
192
+ * @returns The negated number value.
193
+ */
194
+ export const negate = (n: number): number => multiply(n, -1)
195
+
196
+ /**
197
+ * Performs addition in the set of JavaScript numbers.
198
+ *
199
+ * @memberof Number
200
+ * @since 2.0.0
201
+ * @category math
202
+ * @example
203
+ *
204
+ * ```ts
205
+ * import * as assert from "node:assert/strict"
206
+ * import { pipe } from "effect"
207
+ * import * as Number from "effect/Number"
208
+ *
209
+ * // Data-first style (direct application)
210
+ * assert.equal(Number.sum(2, 3), 5)
211
+ * assert.equal(Number.sum(-10, 5), -5)
212
+ * assert.equal(Number.sum(0.1, 0.2), 0.30000000000000004) // Note: floating-point precision limitation
213
+ *
214
+ * // Data-last style (pipeable)
215
+ * assert.equal(
216
+ * pipe(
217
+ * 10,
218
+ * Number.sum(5) // 10 + 5 = 15
219
+ * ),
220
+ * 15
221
+ * )
222
+ *
223
+ * // Chaining multiple additions
224
+ * assert.equal(
225
+ * pipe(
226
+ * 1,
227
+ * Number.sum(2), // 1 + 2 = 3
228
+ * Number.sum(3), // 3 + 3 = 6
229
+ * Number.sum(4) // 6 + 4 = 10
230
+ * ),
231
+ * 10
232
+ * )
233
+ *
234
+ * // Identity property: a + 0 = a
235
+ * assert.equal(Number.sum(42, 0), 42)
236
+ *
237
+ * // Commutative property: a + b = b + a
238
+ * assert.equal(Number.sum(5, 3), Number.sum(3, 5))
239
+ * ```
240
+ */
241
+ export const sum: {
242
+ /**
243
+ * Returns a function that adds a specified number to its argument.
244
+ *
245
+ * @param that - The number to add to the input of the resulting function
246
+ *
247
+ * @returns A function that takes a number and returns the sum of that number
248
+ * and `that`
249
+ */
250
+ (that: number): (self: number) => number
251
+
252
+ /**
253
+ * Adds two numbers together.
254
+ *
255
+ * @param self - The first addend
256
+ * @param that - The second addend
257
+ *
258
+ * @returns The sum of the two numbers
259
+ */
260
+ (self: number, that: number): number
261
+ } = dual(2, (self: number, that: number): number => self + that)
262
+
263
+ /**
264
+ * Computes the sum of all elements in an iterable collection of numbers.
265
+ *
266
+ * @memberof Number
267
+ * @since 2.0.0
268
+ * @category math
269
+ * @example
270
+ *
271
+ * ```ts
272
+ * import * as assert from "node:assert/strict"
273
+ * import * as Number from "effect/Number"
274
+ *
275
+ * // Basic sums
276
+ * assert.equal(Number.sumAll([2, 3, 4]), 9) // 2 + 3 + 4 = 9
277
+ * assert.equal(Number.sumAll([1.1, 2.2, 3.3]), 6.6) // 1.1 + 2.2 + 3.3 = 6.6
278
+ *
279
+ * // Empty collection returns the additive identity (0)
280
+ * assert.equal(Number.sumAll([]), 0)
281
+ *
282
+ * // Single element collection
283
+ * assert.equal(Number.sumAll([42]), 42)
284
+ *
285
+ * // Sums with negative numbers
286
+ * assert.equal(Number.sumAll([2, -3, 4]), 3) // 2 + (-3) + 4 = 3
287
+ * assert.equal(Number.sumAll([-2, -3, -4]), -9) // (-2) + (-3) + (-4) = -9
288
+ *
289
+ * // Works with any iterable
290
+ * assert.equal(Number.sumAll(new Set([2, 3, 4])), 9)
291
+ *
292
+ * // Using with generated sequences
293
+ * function* range(start: number, end: number) {
294
+ * for (let i = start; i <= end; i++) yield i
295
+ * }
296
+ *
297
+ * // Compute sum of first 5 natural numbers: 1 + 2 + 3 + 4 + 5 = 15
298
+ * assert.equal(Number.sumAll(range(1, 5)), 15)
299
+ *
300
+ * // Floating point precision example
301
+ * assert.equal(
302
+ * Number.sumAll([0.1, 0.2]),
303
+ * 0.30000000000000004 // Note IEEE 754 precision limitation
304
+ * )
305
+ * ```
306
+ *
307
+ * @param collection - An `iterable` containing the `numbers` to sum
308
+ *
309
+ * @returns The sum of all numbers in the collection, or 0 if the collection is
310
+ * empty
311
+ */
312
+ export const sumAll = (collection: Iterable<number>): number => _Iterable.reduce(collection, 0, sum)
313
+
314
+ /**
315
+ * Performs subtraction in the set of JavaScript numbers.
316
+ *
317
+ * @memberof Number
318
+ * @since 2.0.0
319
+ * @category math
320
+ * @example
321
+ *
322
+ * ```ts
323
+ * import * as assert from "node:assert/strict"
324
+ * import { pipe } from "effect"
325
+ * import * as Number from "effect/Number"
326
+ *
327
+ * // Data-first style (direct application)
328
+ * assert.equal(Number.subtract(2, 3), -1) // 2 - 3 = -1
329
+ * assert.equal(Number.subtract(10, 5), 5) // 10 - 5 = 5
330
+ * assert.equal(Number.subtract(0.3, 0.1), 0.19999999999999998) // Note: floating-point precision limitation
331
+ *
332
+ * // Data-last style (pipeable)
333
+ * assert.equal(
334
+ * pipe(
335
+ * 10,
336
+ * Number.subtract(5) // 10 - 5 = 5
337
+ * ),
338
+ * 5
339
+ * )
340
+ *
341
+ * // Chaining multiple subtractions
342
+ * assert.equal(
343
+ * pipe(
344
+ * 20,
345
+ * Number.subtract(5), // 20 - 5 = 15
346
+ * Number.subtract(3), // 15 - 3 = 12
347
+ * Number.subtract(2) // 12 - 2 = 10
348
+ * ),
349
+ * 10
350
+ * )
351
+ *
352
+ * // Right identity property: a - 0 = a
353
+ * assert.equal(Number.subtract(42, 0), 42)
354
+ *
355
+ * // Self-annihilation property: a - a = 0
356
+ * assert.equal(Number.subtract(42, 42), 0)
357
+ *
358
+ * // Non-commutative property: a - b ≠ b - a
359
+ * assert.equal(Number.subtract(5, 3), 2) // 5 - 3 = 2
360
+ * assert.equal(Number.subtract(3, 5), -2) // 3 - 5 = -2
361
+ *
362
+ * // Inverse relation: a - b = -(b - a)
363
+ * assert.equal(Number.subtract(5, 3), -Number.subtract(3, 5))
364
+ * ```
365
+ */
366
+ export const subtract: {
367
+ /**
368
+ * Returns a function that subtracts a specified number from its argument.
369
+ *
370
+ * @param subtrahend - The number to subtract from the input of the resulting
371
+ * function
372
+ *
373
+ * @returns A function that takes a minuend and returns the difference of
374
+ * subtracting the subtrahend from it
375
+ */
376
+ (subtrahend: number): (minuend: number) => number
377
+
378
+ /**
379
+ * Subtracts the subtrahend from the minuend and returns the difference.
380
+ *
381
+ * @param minuend - The number from which another number is to be subtracted
382
+ * @param subtrahend - The number to subtract from the minuend
383
+ *
384
+ * @returns The difference of the minuend minus the subtrahend
385
+ */
386
+ (minuend: number, subtrahend: number): number
387
+ } = dual(
388
+ 2,
389
+ (minuend: number, subtrahend: number): number => minuend - subtrahend
390
+ )
391
+
392
+ /**
393
+ * Performs **multiplication** in the set of JavaScript numbers.
394
+ *
395
+ * @memberof Number
396
+ * @since 2.0.0
397
+ * @category math
398
+ * @example
399
+ *
400
+ * ```ts
401
+ * import * as assert from "node:assert/strict"
402
+ * import { pipe } from "effect"
403
+ * import * as Number from "effect/Number"
404
+ *
405
+ * // Data-first style (direct application)
406
+ * assert.equal(Number.multiply(2, 3), 6) // 2 × 3 = 6
407
+ * assert.equal(Number.multiply(-4, 5), -20) // (-4) × 5 = -20
408
+ * assert.equal(Number.multiply(-3, -2), 6) // (-3) × (-2) = 6
409
+ * assert.equal(Number.multiply(0.1, 0.2), 0.020000000000000004) // Note: floating-point precision limitation
410
+ *
411
+ * // Data-last style (pipeable)
412
+ * assert.equal(
413
+ * pipe(
414
+ * 10,
415
+ * Number.multiply(5) // 10 × 5 = 50
416
+ * ),
417
+ * 50
418
+ * )
419
+ *
420
+ * // Chaining multiple multiplications
421
+ * assert.equal(
422
+ * pipe(
423
+ * 2,
424
+ * Number.multiply(3), // 2 × 3 = 6
425
+ * Number.multiply(4), // 6 × 4 = 24
426
+ * Number.multiply(0.5) // 24 × 0.5 = 12
427
+ * ),
428
+ * 12
429
+ * )
430
+ *
431
+ * // Identity property: a × 1 = a
432
+ * assert.equal(Number.multiply(42, 1), 42)
433
+ *
434
+ * // Zero property: a × 0 = 0
435
+ * assert.equal(Number.multiply(42, 0), 0)
436
+ *
437
+ * // Commutative property: a × b = b × a
438
+ * assert.equal(Number.multiply(5, 3), Number.multiply(3, 5))
439
+ *
440
+ * // Associative property: (a × b) × c = a × (b × c)
441
+ * const a = 2,
442
+ * b = 3,
443
+ * c = 4
444
+ * assert.equal(
445
+ * Number.multiply(Number.multiply(a, b), c),
446
+ * Number.multiply(a, Number.multiply(b, c))
447
+ * )
448
+ * ```
449
+ */
450
+ export const multiply: {
451
+ /**
452
+ * Returns a function that multiplies a specified number with its argument.
453
+ *
454
+ * @param multiplicand - The number to multiply with the input of the
455
+ * resulting function
456
+ *
457
+ * @returns A function that takes a multiplier and returns the product of that
458
+ * multiplier and the multiplicand
459
+ */
460
+ (multiplicand: number): (multiplier: number) => number
461
+
462
+ /**
463
+ * Multiplies two numbers together.
464
+ *
465
+ * @param multiplier - The first factor
466
+ * @param multiplicand - The second factor
467
+ *
468
+ * @returns The product of the two numbers
469
+ */
470
+ (multiplier: number, multiplicand: number): number
471
+ } = dual(
472
+ 2,
473
+ (multiplier: number, multiplicand: number): number => multiplier * multiplicand
474
+ )
475
+
476
+ /**
477
+ * Computes the product of all elements in an iterable collection of numbers.
478
+ *
479
+ * @memberof Number
480
+ * @since 2.0.0
481
+ * @category math
482
+ * @example
483
+ *
484
+ * ```ts
485
+ * import * as assert from "node:assert/strict"
486
+ * import * as Number from "effect/Number"
487
+ *
488
+ * // Basic products
489
+ * assert.equal(Number.multiplyAll([2, 3, 4]), 24) // 2 × 3 × 4 = 24
490
+ * assert.equal(Number.multiplyAll([1.5, 2, 3]), 9) // 1.5 × 2 × 3 = 9
491
+ *
492
+ * // Empty collection returns the multiplicative identity (1)
493
+ * assert.equal(Number.multiplyAll([]), 1)
494
+ *
495
+ * // Single element collection
496
+ * assert.equal(Number.multiplyAll([42]), 42)
497
+ *
498
+ * // Products with negative numbers
499
+ * assert.equal(Number.multiplyAll([2, -3, 4]), -24) // 2 × (-3) × 4 = -24
500
+ * assert.equal(Number.multiplyAll([-2, -3]), 6) // (-2) × (-3) = 6
501
+ *
502
+ * // Zero property - if any element is zero, product is zero
503
+ * assert.equal(Number.multiplyAll([2, 0, 3]), 0)
504
+ *
505
+ * // Works with any iterable
506
+ * assert.equal(Number.multiplyAll(new Set([2, 3, 4])), 24)
507
+ *
508
+ * // Using with generated sequences
509
+ * function* range(start: number, end: number) {
510
+ * for (let i = start; i <= end; i++) yield i
511
+ * }
512
+ *
513
+ * // Compute factorial: 5! = 5 × 4 × 3 × 2 × 1 = 120
514
+ * assert.equal(Number.multiplyAll(range(1, 5)), 120)
515
+ * ```
516
+ *
517
+ * @param collection - An `iterable` containing the `numbers` to multiply
518
+ *
519
+ * @returns The product of all numbers in the collection, or 1 if the collection
520
+ * is empty
521
+ */
522
+ export const multiplyAll = (collection: Iterable<number>): number => {
523
+ let out = 1
524
+ for (const n of collection) {
525
+ if (n === 0) {
526
+ return 0
527
+ }
528
+ out *= n
529
+ }
530
+ return out
531
+ }
532
+
533
+ /**
534
+ * Performs division in the set of JavaScript numbers, returning the result
535
+ * wrapped in an `Option` to handle division by zero.
536
+ *
537
+ * @memberof Number
538
+ * @since 2.0.0
539
+ * @category math
540
+ * @example
541
+ *
542
+ * ```ts
543
+ * import * as assert from "node:assert/strict"
544
+ * import { pipe, Option } from "effect"
545
+ * import * as Number from "effect/Number"
546
+ *
547
+ * // Data-first style (direct application)
548
+ * assert.equal(Number.divide(6, 3), Option.some(2)) // 6 ÷ 3 = 2
549
+ * assert.equal(Number.divide(-8, 4), Option.some(-2)) // (-8) ÷ 4 = -2
550
+ * assert.equal(Number.divide(-10, -5), Option.some(2)) // (-10) ÷ (-5) = 2
551
+ * assert.equal(Number.divide(1, 3), Option.some(0.3333333333333333)) // Note: floating-point approximation
552
+ *
553
+ * // Handling division by zero
554
+ * assert.equal(Number.divide(6, 0), Option.none()) // 6 ÷ 0 is undefined
555
+ *
556
+ * // Data-last style (pipeable)
557
+ * assert.equal(
558
+ * pipe(
559
+ * 10,
560
+ * Number.divide(2) // 10 ÷ 2 = 5
561
+ * ),
562
+ * Option.some(5)
563
+ * )
564
+ *
565
+ * // Chaining multiple divisions using Option combinators
566
+ * assert.equal(
567
+ * pipe(
568
+ * Option.some(24),
569
+ * Option.flatMap((n) => Number.divide(n, 2)), // 24 ÷ 2 = 12
570
+ * Option.flatMap(Number.divide(3)), // 12 ÷ 3 = 4
571
+ * Option.flatMap(Number.divide(2)) // 4 ÷ 2 = 2
572
+ * ),
573
+ * Option.some(2)
574
+ * )
575
+ *
576
+ * // Division-by-one property: a ÷ 1 = a
577
+ * assert.equal(Number.divide(42, 1), Option.some(42))
578
+ *
579
+ * // Self-division property: a ÷ a = 1 (for a ≠ 0)
580
+ * assert.equal(Number.divide(42, 42), Option.some(1))
581
+ *
582
+ * // Non-commutative property: a ÷ b ≠ b ÷ a
583
+ * assert.notDeepStrictEqual(
584
+ * Number.divide(6, 3), // 6 ÷ 3 = 2
585
+ * Number.divide(3, 6) // 3 ÷ 6 = 0.5
586
+ * )
587
+ * ```
588
+ */
589
+ export const divide: {
590
+ /**
591
+ * Returns a function that divides its input by a specified divisor.
592
+ *
593
+ * @param divisor - The number to divide by
594
+ *
595
+ * @returns A function that takes a dividend and returns the quotient wrapped
596
+ * in an Option (Option.none() if divisor is 0)
597
+ */
598
+ (divisor: number): (dividend: number) => Option<number>
599
+
600
+ /**
601
+ * Divides the dividend by the divisor and returns the quotient wrapped in an
602
+ * Option.
603
+ *
604
+ * @param dividend - The number to be divided
605
+ * @param divisor - The number to divide by
606
+ *
607
+ * @returns Some(quotient) if the divisor is not 0, None otherwise
608
+ */
609
+ (dividend: number, divisor: number): Option<number>
610
+ } = dual(2, (dividend: number, divisor: number) => divisor === 0 ? option.none : option.some(dividend / divisor))
611
+
612
+ /**
613
+ * Performs division in the set of JavaScript numbers, but misbehaves for
614
+ * division by zero.
615
+ *
616
+ * Unlike {@link module:Number.divide} which returns an Option, this function
617
+ * directly returns a number or `Infinity` or `NaN`.
618
+ *
619
+ * - If the `divisor` is zero, it returns `Infinity`.
620
+ * - If both the `dividend` and the `divisor` are zero, then it returns `NaN`.
621
+ *
622
+ * @memberof Number
623
+ * @since 2.0.0
624
+ * @category math
625
+ * @example
626
+ *
627
+ * ```ts
628
+ * import * as assert from "node:assert/strict"
629
+ * import { pipe } from "effect"
630
+ * import * as Number from "effect/Number"
631
+ *
632
+ * // Data-first style (direct application)
633
+ * assert.equal(Number.unsafeDivide(6, 3), 2) // 6 ÷ 3 = 2
634
+ * assert.equal(Number.unsafeDivide(-8, 4), -2) // (-8) ÷ 4 = -2
635
+ * assert.equal(Number.unsafeDivide(-10, -5), 2) // (-10) ÷ (-5) = 2
636
+ * assert.equal(Number.unsafeDivide(1, 3), 0.3333333333333333)
637
+ *
638
+ * // Data-last style (pipeable)
639
+ * assert.equal(
640
+ * pipe(
641
+ * 10,
642
+ * Number.unsafeDivide(2) // 10 ÷ 2 = 5
643
+ * ),
644
+ * 5
645
+ * )
646
+ *
647
+ * // Chaining multiple divisions
648
+ * assert.equal(
649
+ * pipe(
650
+ * 24,
651
+ * Number.unsafeDivide(2), // 24 ÷ 2 = 12
652
+ * Number.unsafeDivide(3), // 12 ÷ 3 = 4
653
+ * Number.unsafeDivide(2) // 4 ÷ 2 = 2
654
+ * ),
655
+ * 2
656
+ * )
657
+ *
658
+ * assert.equal(Number.unsafeDivide(6, 0), Infinity)
659
+ *
660
+ * assert.equal(Number.unsafeDivide(0, 0), NaN)
661
+ *
662
+ * // Compare with safe division
663
+ * const safeResult = Number.divide(6, 3) // Option.some(2)
664
+ * const unsafeResult = Number.unsafeDivide(6, 3) // 2 directly
665
+ * ```
666
+ *
667
+ * @throws - An {@link module:Number.DivisionByZeroError} if the divisor is zero.
668
+ * @see {@link module:Number.divide} - Safe division returning an Option
669
+ */
670
+ export const unsafeDivide: {
671
+ /**
672
+ * Returns a function that divides its input by a specified divisor.
673
+ *
674
+ * @param divisor - The number to divide by
675
+ *
676
+ * @returns A function that takes a dividend and returns the quotient
677
+ * @throws - An {@link module:Number.DivisionByZeroError} if the divisor is
678
+ * zero
679
+ */
680
+ (divisor: number): (dividend: number) => number
681
+
682
+ /**
683
+ * Divides the dividend by the divisor and returns the quotient.
684
+ *
685
+ * If the divisor is zero, it returns Infinity.
686
+ *
687
+ * @param dividend - The number to be divided
688
+ * @param divisor - The number to divide by
689
+ *
690
+ * @returns The quotient of the division
691
+ */
692
+ (dividend: number, divisor: number): number
693
+ } = dual(2, (dividend: number, divisor: number): number => dividend / divisor)
694
+
695
+ /**
696
+ * Returns the result of adding `1` to a given number.
697
+ *
698
+ * @memberof Number
699
+ * @since 2.0.0
700
+ * @category math
701
+ * @example
702
+ *
703
+ * ```ts
704
+ * import * as assert from "node:assert/strict"
705
+ * import { increment } from "effect/Number"
706
+ *
707
+ * assert.equal(increment(2), 3)
708
+ * ```
709
+ */
710
+ export const increment = (n: number): number => sum(n, 1)
711
+
712
+ /**
713
+ * Decrements a number by `1`.
714
+ *
715
+ * @memberof Number
716
+ * @since 2.0.0
717
+ * @category math
718
+ * @example
719
+ *
720
+ * ```ts
721
+ * import * as assert from "node:assert/strict"
722
+ * import { decrement } from "effect/Number"
723
+ *
724
+ * assert.equal(decrement(3), 2)
725
+ * ```
726
+ */
727
+ export const decrement = (n: number): number => subtract(n, 1)
728
+
729
+ /**
730
+ * @memberof Number
731
+ * @since 2.0.0
732
+ * @category instances
733
+ */
734
+ export const Equivalence: equivalence.Equivalence<number> = equivalence.number
735
+
736
+ /**
737
+ * @memberof Number
738
+ * @since 2.0.0
739
+ * @category instances
740
+ */
741
+ export const Order: order.Order<number> = order.number
742
+
743
+ /**
744
+ * Returns `true` if the first argument is less than the second, otherwise
745
+ * `false`.
746
+ *
747
+ * @memberof Number
748
+ * @since 2.0.0
749
+ * @category predicates
750
+ * @example
751
+ *
752
+ * ```ts
753
+ * import * as assert from "node:assert/strict"
754
+ * import { lessThan } from "effect/Number"
755
+ *
756
+ * assert.equal(lessThan(2, 3), true)
757
+ * assert.equal(lessThan(3, 3), false)
758
+ * assert.equal(lessThan(4, 3), false)
759
+ * ```
760
+ */
761
+ export const lessThan: {
762
+ (that: number): (self: number) => boolean
763
+ (self: number, that: number): boolean
764
+ } = order.lessThan(Order)
765
+
766
+ /**
767
+ * Returns a function that checks if a given `number` is less than or equal to
768
+ * the provided one.
769
+ *
770
+ * @memberof Number
771
+ * @since 2.0.0
772
+ * @category predicates
773
+ * @example
774
+ *
775
+ * ```ts
776
+ * import * as assert from "node:assert/strict"
777
+ * import { lessThanOrEqualTo } from "effect/Number"
778
+ *
779
+ * assert.equal(lessThanOrEqualTo(2, 3), true)
780
+ * assert.equal(lessThanOrEqualTo(3, 3), true)
781
+ * assert.equal(lessThanOrEqualTo(4, 3), false)
782
+ * ```
783
+ */
784
+ export const lessThanOrEqualTo: {
785
+ (that: number): (self: number) => boolean
786
+ (self: number, that: number): boolean
787
+ } = order.lessThanOrEqualTo(Order)
788
+
789
+ /**
790
+ * Returns `true` if the first argument is greater than the second, otherwise
791
+ * `false`.
792
+ *
793
+ * @memberof Number
794
+ * @since 2.0.0
795
+ * @category predicates
796
+ * @example
797
+ *
798
+ * ```ts
799
+ * import * as assert from "node:assert/strict"
800
+ * import { greaterThan } from "effect/Number"
801
+ *
802
+ * assert.equal(greaterThan(2, 3), false)
803
+ * assert.equal(greaterThan(3, 3), false)
804
+ * assert.equal(greaterThan(4, 3), true)
805
+ * ```
806
+ */
807
+ export const greaterThan: {
808
+ (that: number): (self: number) => boolean
809
+ (self: number, that: number): boolean
810
+ } = order.greaterThan(Order)
811
+
812
+ /**
813
+ * Returns a function that checks if a given `number` is greater than or equal
814
+ * to the provided one.
815
+ *
816
+ * @memberof Number
817
+ * @since 2.0.0
818
+ * @category predicates
819
+ * @example
820
+ *
821
+ * ```ts
822
+ * import * as assert from "node:assert/strict"
823
+ * import { greaterThanOrEqualTo } from "effect/Number"
824
+ *
825
+ * assert.equal(greaterThanOrEqualTo(2, 3), false)
826
+ * assert.equal(greaterThanOrEqualTo(3, 3), true)
827
+ * assert.equal(greaterThanOrEqualTo(4, 3), true)
828
+ * ```
829
+ */
830
+ export const greaterThanOrEqualTo: {
831
+ (that: number): (self: number) => boolean
832
+ (self: number, that: number): boolean
833
+ } = order.greaterThanOrEqualTo(Order)
834
+
835
+ /**
836
+ * Checks if a `number` is between a `minimum` and `maximum` value (inclusive).
837
+ *
838
+ * @memberof Number
839
+ * @since 2.0.0
840
+ * @category predicates
841
+ * @example
842
+ *
843
+ * ```ts
844
+ * import * as assert from "node:assert/strict"
845
+ * import { Number } from "effect"
846
+ *
847
+ * const between = Number.between({ minimum: 0, maximum: 5 })
848
+ *
849
+ * assert.equal(between(3), true)
850
+ * assert.equal(between(-1), false)
851
+ * assert.equal(between(6), false)
852
+ * ```
853
+ */
854
+ export const between: {
855
+ (options: { minimum: number; maximum: number }): (self: number) => boolean
856
+ (
857
+ self: number,
858
+ options: {
859
+ minimum: number
860
+ maximum: number
861
+ }
862
+ ): boolean
863
+ } = order.between(Order)
864
+
865
+ /**
866
+ * Restricts the given `number` to be within the range specified by the
867
+ * `minimum` and `maximum` values.
868
+ *
869
+ * - If the `number` is less than the `minimum` value, the function returns the
870
+ * `minimum` value.
871
+ * - If the `number` is greater than the `maximum` value, the function returns the
872
+ * `maximum` value.
873
+ * - Otherwise, it returns the original `number`.
874
+ *
875
+ * @memberof Number
876
+ * @since 2.0.0
877
+ * @example
878
+ *
879
+ * ```ts
880
+ * import * as assert from "node:assert/strict"
881
+ * import { Number } from "effect"
882
+ *
883
+ * const clamp = Number.clamp({ minimum: 1, maximum: 5 })
884
+ *
885
+ * assert.equal(clamp(3), 3)
886
+ * assert.equal(clamp(0), 1)
887
+ * assert.equal(clamp(6), 5)
888
+ * ```
889
+ */
890
+ export const clamp: {
891
+ (options: { minimum: number; maximum: number }): (self: number) => number
892
+ (
893
+ self: number,
894
+ options: {
895
+ minimum: number
896
+ maximum: number
897
+ }
898
+ ): number
899
+ } = order.clamp(Order)
900
+
901
+ /**
902
+ * Returns the minimum between two `number`s.
903
+ *
904
+ * @memberof Number
905
+ * @since 2.0.0
906
+ * @example
907
+ *
908
+ * ```ts
909
+ * import * as assert from "node:assert/strict"
910
+ * import { min } from "effect/Number"
911
+ *
912
+ * assert.equal(min(2, 3), 2)
913
+ * ```
914
+ */
915
+ export const min: {
916
+ (that: number): (self: number) => number
917
+ (self: number, that: number): number
918
+ } = order.min(Order)
919
+
920
+ /**
921
+ * Returns the maximum between two `number`s.
922
+ *
923
+ * @memberof Number
924
+ * @since 2.0.0
925
+ * @example
926
+ *
927
+ * ```ts
928
+ * import * as assert from "node:assert/strict"
929
+ * import { max } from "effect/Number"
930
+ *
931
+ * assert.equal(max(2, 3), 3)
932
+ * ```
933
+ */
934
+ export const max: {
935
+ (that: number): (self: number) => number
936
+ (self: number, that: number): number
937
+ } = order.max(Order)
938
+
939
+ /**
940
+ * Determines the sign of a given `number`.
941
+ *
942
+ * @memberof Number
943
+ * @since 2.0.0
944
+ * @category math
945
+ * @example
946
+ *
947
+ * ```ts
948
+ * import * as assert from "node:assert/strict"
949
+ * import { sign } from "effect/Number"
950
+ *
951
+ * assert.equal(sign(-5), -1)
952
+ * assert.equal(sign(0), 0)
953
+ * assert.equal(sign(5), 1)
954
+ * ```
955
+ */
956
+ export const sign = (n: number): Ordering => Order(n, 0)
957
+
958
+ /**
959
+ * Returns the remainder left over when one operand is divided by a second
960
+ * operand.
961
+ *
962
+ * It always takes the sign of the dividend.
963
+ *
964
+ * @memberof Number
965
+ * @since 2.0.0
966
+ * @category math
967
+ * @example
968
+ *
969
+ * ```ts
970
+ * import * as assert from "node:assert/strict"
971
+ * import { remainder } from "effect/Number"
972
+ *
973
+ * assert.equal(remainder(2, 2), 0)
974
+ * assert.equal(remainder(3, 2), 1)
975
+ * assert.equal(remainder(-4, 2), -0)
976
+ * ```
977
+ */
978
+ export const remainder: {
979
+ (divisor: number): (dividend: number) => number
980
+ (dividend: number, divisor: number): number
981
+ } = dual(2, (dividend: number, divisor: number): number => {
982
+ // https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034
983
+ const selfDecCount = (dividend.toString().split(".")[1] || "").length
984
+ const divisorDecCount = (divisor.toString().split(".")[1] || "").length
985
+ const decCount = selfDecCount > divisorDecCount ? selfDecCount : divisorDecCount
986
+ const selfInt = parseInt(dividend.toFixed(decCount).replace(".", ""))
987
+ const divisorInt = parseInt(divisor.toFixed(decCount).replace(".", ""))
988
+ return (selfInt % divisorInt) / Math.pow(10, decCount)
989
+ })
990
+
991
+ /**
992
+ * Returns the next power of 2 greater than or equal to the given number.
993
+ *
994
+ * - For `positive` inputs, returns the smallest power of 2 that is >= the input
995
+ * - For `zero`, returns 2
996
+ * - For `negative` inputs, returns NaN (as logarithms of negative numbers are
997
+ * undefined)
998
+ * - For `NaN` input, returns NaN
999
+ * - For `Infinity`, returns Infinity
1000
+ *
1001
+ * @memberof Number
1002
+ * @since 2.0.0
1003
+ * @category math
1004
+ * @example
1005
+ *
1006
+ * ```ts
1007
+ * import * as assert from "node:assert/strict"
1008
+ * import { nextPow2 } from "effect/Number"
1009
+ *
1010
+ * assert.equal(nextPow2(5), 8)
1011
+ * assert.equal(nextPow2(17), 32)
1012
+ * assert.equal(nextPow2(0), 2)
1013
+ * assert.equal(Number.isNaN(nextPow2(-1)), true) // Negative inputs result in NaN
1014
+ * ```
1015
+ */
1016
+ export const nextPow2 = (n: number): number => {
1017
+ const nextPow = Math.ceil(Math.log(n) / Math.log(2))
1018
+ return Math.max(Math.pow(2, nextPow), 2)
1019
+ }
1020
+
1021
+ /**
1022
+ * Tries to parse a `number` from a `string` using the `Number()` function. The
1023
+ * following special string values are supported: "NaN", "Infinity",
1024
+ * "-Infinity".
1025
+ *
1026
+ * @memberof Number
1027
+ * @since 2.0.0
1028
+ * @category constructors
1029
+ */
1030
+ export const parse: {
1031
+ (s: string): Option<number>
1032
+ } = (s) => {
1033
+ if (s === "NaN") {
1034
+ return option.some(NaN)
1035
+ }
1036
+ if (s === "Infinity") {
1037
+ return option.some(Infinity)
1038
+ }
1039
+ if (s === "-Infinity") {
1040
+ return option.some(-Infinity)
1041
+ }
1042
+ if (s.trim() === "") {
1043
+ return option.none
1044
+ }
1045
+ const n = Number(s)
1046
+ return Number.isNaN(n) ? option.none : option.some(n)
1047
+ }
1048
+
1049
+ /**
1050
+ * Returns the number rounded with the given precision.
1051
+ *
1052
+ * @memberof Number
1053
+ * @since 3.8.0
1054
+ * @category math
1055
+ * @example
1056
+ *
1057
+ * ```ts
1058
+ * import * as assert from "node:assert/strict"
1059
+ * import { round } from "effect/Number"
1060
+ *
1061
+ * assert.equal(round(1.1234, 2), 1.12)
1062
+ * assert.equal(round(1.567, 2), 1.57)
1063
+ * ```
1064
+ */
1065
+ export const round: {
1066
+ (precision: number): (self: number) => number
1067
+ (self: number, precision: number): number
1068
+ } = dual(2, (self: number, precision: number): number => {
1069
+ const factor = Math.pow(10, precision)
1070
+ return Math.round(self * factor) / factor
1071
+ })