@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.
- package/SourceLocation/package.json +6 -0
- package/dist/cjs/Effect.js +2 -28
- package/dist/cjs/Effect.js.map +1 -1
- package/dist/cjs/FiberRef.js +12 -1
- package/dist/cjs/FiberRef.js.map +1 -1
- package/dist/cjs/Layer.js +2 -24
- package/dist/cjs/Layer.js.map +1 -1
- package/dist/cjs/RuntimeFlags.js +1 -29
- package/dist/cjs/RuntimeFlags.js.map +1 -1
- package/dist/cjs/SourceLocation.js +60 -0
- package/dist/cjs/SourceLocation.js.map +1 -0
- package/dist/cjs/Tracer.js +1 -15
- package/dist/cjs/Tracer.js.map +1 -1
- package/dist/cjs/Utils.js +1 -1
- package/dist/cjs/Utils.js.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/clock.js +1 -1
- package/dist/cjs/internal/clock.js.map +1 -1
- package/dist/cjs/internal/core.js +17 -50
- package/dist/cjs/internal/core.js.map +1 -1
- package/dist/cjs/internal/effect/circular.js +18 -30
- package/dist/cjs/internal/effect/circular.js.map +1 -1
- package/dist/cjs/internal/fiberRuntime.js +16 -65
- package/dist/cjs/internal/fiberRuntime.js.map +1 -1
- package/dist/cjs/internal/layer/circular.js +1 -5
- package/dist/cjs/internal/layer/circular.js.map +1 -1
- package/dist/cjs/internal/layer.js +1 -3
- package/dist/cjs/internal/layer.js.map +1 -1
- package/dist/cjs/internal/logger.js +25 -2
- package/dist/cjs/internal/logger.js.map +1 -1
- package/dist/cjs/internal/runtimeFlags.js +2 -11
- package/dist/cjs/internal/runtimeFlags.js.map +1 -1
- package/dist/cjs/internal/tracer.js +1 -114
- package/dist/cjs/internal/tracer.js.map +1 -1
- package/dist/dts/Config.d.ts +2 -2
- package/dist/dts/Config.d.ts.map +1 -1
- package/dist/dts/Effect.d.ts +8 -29
- package/dist/dts/Effect.d.ts.map +1 -1
- package/dist/dts/FiberRef.d.ts +12 -0
- package/dist/dts/FiberRef.d.ts.map +1 -1
- package/dist/dts/Layer.d.ts +0 -22
- package/dist/dts/Layer.d.ts.map +1 -1
- package/dist/dts/RuntimeFlags.d.ts +0 -28
- package/dist/dts/RuntimeFlags.d.ts.map +1 -1
- package/dist/dts/SourceLocation.d.ts +88 -0
- package/dist/dts/SourceLocation.d.ts.map +1 -0
- package/dist/dts/Tracer.d.ts +0 -15
- package/dist/dts/Tracer.d.ts.map +1 -1
- package/dist/dts/index.d.ts +6 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/core.d.ts.map +1 -1
- package/dist/dts/internal/layer.d.ts.map +1 -1
- package/dist/dts/internal/runtimeFlags.d.ts.map +1 -1
- package/dist/esm/Effect.js +0 -26
- package/dist/esm/Effect.js.map +1 -1
- package/dist/esm/FiberRef.js +11 -0
- package/dist/esm/FiberRef.js.map +1 -1
- package/dist/esm/Layer.js +0 -22
- package/dist/esm/Layer.js.map +1 -1
- package/dist/esm/RuntimeFlags.js +0 -28
- package/dist/esm/RuntimeFlags.js.map +1 -1
- package/dist/esm/SourceLocation.js +51 -0
- package/dist/esm/SourceLocation.js.map +1 -0
- package/dist/esm/Tracer.js +0 -14
- package/dist/esm/Tracer.js.map +1 -1
- package/dist/esm/Utils.js +1 -1
- package/dist/esm/Utils.js.map +1 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/clock.js +1 -1
- package/dist/esm/internal/clock.js.map +1 -1
- package/dist/esm/internal/core.js +12 -45
- package/dist/esm/internal/core.js.map +1 -1
- package/dist/esm/internal/effect/circular.js +18 -30
- package/dist/esm/internal/effect/circular.js.map +1 -1
- package/dist/esm/internal/fiberRuntime.js +13 -60
- package/dist/esm/internal/fiberRuntime.js.map +1 -1
- package/dist/esm/internal/layer/circular.js +0 -4
- package/dist/esm/internal/layer/circular.js.map +1 -1
- package/dist/esm/internal/layer.js +0 -2
- package/dist/esm/internal/layer.js.map +1 -1
- package/dist/esm/internal/logger.js +25 -2
- package/dist/esm/internal/logger.js.map +1 -1
- package/dist/esm/internal/runtimeFlags.js +1 -9
- package/dist/esm/internal/runtimeFlags.js.map +1 -1
- package/dist/esm/internal/tracer.js +0 -111
- package/dist/esm/internal/tracer.js.map +1 -1
- package/package.json +12 -1
- package/src/Arbitrary.ts +1101 -0
- package/src/Array.ts +3589 -0
- package/src/BigDecimal.ts +1349 -0
- package/src/BigInt.ts +643 -0
- package/src/Boolean.ts +287 -0
- package/src/Brand.ts +360 -0
- package/src/Cache.ts +281 -0
- package/src/Cause.ts +1555 -0
- package/src/Channel.ts +2355 -0
- package/src/ChildExecutorDecision.ts +146 -0
- package/src/Chunk.ts +1495 -0
- package/src/Clock.ts +111 -0
- package/src/Config.ts +542 -0
- package/src/ConfigError.ts +270 -0
- package/src/ConfigProvider.ts +333 -0
- package/src/ConfigProviderPathPatch.ts +100 -0
- package/src/Console.ts +226 -0
- package/src/Context.ts +585 -0
- package/src/Cron.ts +706 -0
- package/src/Data.ts +596 -0
- package/src/DateTime.ts +1686 -0
- package/src/DefaultServices.ts +34 -0
- package/src/Deferred.ts +301 -0
- package/src/Differ.ts +450 -0
- package/src/Duration.ts +1000 -0
- package/src/Effect.ts +14817 -0
- package/src/Effectable.ts +107 -0
- package/src/Either.ts +1040 -0
- package/src/Encoding.ts +195 -0
- package/src/Equal.ts +98 -0
- package/src/Equivalence.ts +235 -0
- package/src/ExecutionPlan.ts +308 -0
- package/src/ExecutionStrategy.ts +119 -0
- package/src/Exit.ts +467 -0
- package/src/FastCheck.ts +9 -0
- package/src/Fiber.ts +744 -0
- package/src/FiberHandle.ts +540 -0
- package/src/FiberId.ts +195 -0
- package/src/FiberMap.ts +656 -0
- package/src/FiberRef.ts +444 -0
- package/src/FiberRefs.ts +204 -0
- package/src/FiberRefsPatch.ts +105 -0
- package/src/FiberSet.ts +491 -0
- package/src/FiberStatus.ts +108 -0
- package/src/Function.ts +1222 -0
- package/src/GlobalValue.ts +53 -0
- package/src/Graph.ts +3732 -0
- package/src/GroupBy.ts +103 -0
- package/src/HKT.ts +45 -0
- package/src/Hash.ts +195 -0
- package/src/HashMap.ts +519 -0
- package/src/HashRing.ts +317 -0
- package/src/HashSet.ts +2346 -0
- package/src/Inspectable.ts +287 -0
- package/src/Iterable.ts +1119 -0
- package/src/JSONSchema.ts +1044 -0
- package/src/KeyedPool.ts +167 -0
- package/src/Layer.ts +1228 -0
- package/src/LayerMap.ts +436 -0
- package/src/List.ts +977 -0
- package/src/LogLevel.ts +285 -0
- package/src/LogSpan.ts +25 -0
- package/src/Logger.ts +702 -0
- package/src/Mailbox.ts +268 -0
- package/src/ManagedRuntime.ts +180 -0
- package/src/Match.ts +1477 -0
- package/src/MergeDecision.ts +95 -0
- package/src/MergeState.ts +172 -0
- package/src/MergeStrategy.ts +107 -0
- package/src/Metric.ts +780 -0
- package/src/MetricBoundaries.ts +69 -0
- package/src/MetricHook.ts +151 -0
- package/src/MetricKey.ts +224 -0
- package/src/MetricKeyType.ts +262 -0
- package/src/MetricLabel.ts +47 -0
- package/src/MetricPair.ts +71 -0
- package/src/MetricPolling.ts +148 -0
- package/src/MetricRegistry.ts +48 -0
- package/src/MetricState.ts +257 -0
- package/src/Micro.ts +4405 -0
- package/src/ModuleVersion.ts +18 -0
- package/src/MutableHashMap.ts +411 -0
- package/src/MutableHashSet.ts +706 -0
- package/src/MutableList.ts +297 -0
- package/src/MutableQueue.ts +227 -0
- package/src/MutableRef.ts +202 -0
- package/src/NonEmptyIterable.ts +32 -0
- package/src/Number.ts +1071 -0
- package/src/Option.ts +2170 -0
- package/src/Order.ts +373 -0
- package/src/Ordering.ts +111 -0
- package/src/ParseResult.ts +2031 -0
- package/src/PartitionedSemaphore.ts +200 -0
- package/src/Pipeable.ts +566 -0
- package/src/Pool.ts +204 -0
- package/src/Predicate.ts +1405 -0
- package/src/Pretty.ts +205 -0
- package/src/PrimaryKey.ts +23 -0
- package/src/PubSub.ts +182 -0
- package/src/Queue.ts +644 -0
- package/src/Random.ts +204 -0
- package/src/RateLimiter.ts +138 -0
- package/src/RcMap.ts +141 -0
- package/src/RcRef.ts +122 -0
- package/src/Readable.ts +93 -0
- package/src/Record.ts +1274 -0
- package/src/RedBlackTree.ts +421 -0
- package/src/Redacted.ts +144 -0
- package/src/Ref.ts +180 -0
- package/src/RegExp.ts +38 -0
- package/src/Reloadable.ts +127 -0
- package/src/Request.ts +347 -0
- package/src/RequestBlock.ts +118 -0
- package/src/RequestResolver.ts +366 -0
- package/src/Resource.ts +119 -0
- package/src/Runtime.ts +383 -0
- package/src/RuntimeFlags.ts +336 -0
- package/src/RuntimeFlagsPatch.ts +183 -0
- package/src/STM.ts +2045 -0
- package/src/Schedule.ts +2219 -0
- package/src/ScheduleDecision.ts +62 -0
- package/src/ScheduleInterval.ts +151 -0
- package/src/ScheduleIntervals.ts +122 -0
- package/src/Scheduler.ts +353 -0
- package/src/Schema.ts +10914 -0
- package/src/SchemaAST.ts +3043 -0
- package/src/Scope.ts +204 -0
- package/src/ScopedCache.ts +151 -0
- package/src/ScopedRef.ts +117 -0
- package/src/Secret.ts +88 -0
- package/src/SingleProducerAsyncInput.ts +67 -0
- package/src/Sink.ts +1461 -0
- package/src/SortedMap.ts +287 -0
- package/src/SortedSet.ts +390 -0
- package/src/SourceLocation.ts +108 -0
- package/src/Stream.ts +6468 -0
- package/src/StreamEmit.ts +136 -0
- package/src/StreamHaltStrategy.ts +123 -0
- package/src/Streamable.ts +45 -0
- package/src/String.ts +778 -0
- package/src/Struct.ts +243 -0
- package/src/Subscribable.ts +100 -0
- package/src/SubscriptionRef.ts +298 -0
- package/src/Supervisor.ts +240 -0
- package/src/Symbol.ts +29 -0
- package/src/SynchronizedRef.ts +270 -0
- package/src/TArray.ts +495 -0
- package/src/TDeferred.ts +100 -0
- package/src/TMap.ts +515 -0
- package/src/TPriorityQueue.ts +223 -0
- package/src/TPubSub.ts +200 -0
- package/src/TQueue.ts +432 -0
- package/src/TRandom.ts +129 -0
- package/src/TReentrantLock.ts +224 -0
- package/src/TRef.ts +178 -0
- package/src/TSemaphore.ts +129 -0
- package/src/TSet.ts +365 -0
- package/src/TSubscriptionRef.ts +192 -0
- package/src/Take.ts +258 -0
- package/src/TestAnnotation.ts +158 -0
- package/src/TestAnnotationMap.ts +119 -0
- package/src/TestAnnotations.ts +117 -0
- package/src/TestClock.ts +556 -0
- package/src/TestConfig.ts +47 -0
- package/src/TestContext.ts +36 -0
- package/src/TestLive.ts +53 -0
- package/src/TestServices.ts +390 -0
- package/src/TestSized.ts +55 -0
- package/src/Tracer.ts +182 -0
- package/src/Trie.ts +840 -0
- package/src/Tuple.ts +305 -0
- package/src/Types.ts +353 -0
- package/src/Unify.ts +113 -0
- package/src/UpstreamPullRequest.ts +117 -0
- package/src/UpstreamPullStrategy.ts +121 -0
- package/src/Utils.ts +809 -0
- package/src/index.ts +1568 -0
- package/src/internal/array.ts +8 -0
- package/src/internal/blockedRequests.ts +520 -0
- package/src/internal/cache.ts +733 -0
- package/src/internal/cause.ts +1050 -0
- package/src/internal/channel/channelExecutor.ts +1200 -0
- package/src/internal/channel/channelState.ts +134 -0
- package/src/internal/channel/childExecutorDecision.ts +96 -0
- package/src/internal/channel/continuation.ts +200 -0
- package/src/internal/channel/mergeDecision.ts +113 -0
- package/src/internal/channel/mergeState.ts +120 -0
- package/src/internal/channel/mergeStrategy.ts +72 -0
- package/src/internal/channel/singleProducerAsyncInput.ts +259 -0
- package/src/internal/channel/subexecutor.ts +229 -0
- package/src/internal/channel/upstreamPullRequest.ts +84 -0
- package/src/internal/channel/upstreamPullStrategy.ts +87 -0
- package/src/internal/channel.ts +2603 -0
- package/src/internal/clock.ts +95 -0
- package/src/internal/completedRequestMap.ts +9 -0
- package/src/internal/concurrency.ts +54 -0
- package/src/internal/config.ts +716 -0
- package/src/internal/configError.ts +304 -0
- package/src/internal/configProvider/pathPatch.ts +97 -0
- package/src/internal/configProvider.ts +799 -0
- package/src/internal/console.ts +153 -0
- package/src/internal/context.ts +337 -0
- package/src/internal/core-effect.ts +2293 -0
- package/src/internal/core-stream.ts +998 -0
- package/src/internal/core.ts +3189 -0
- package/src/internal/data.ts +36 -0
- package/src/internal/dataSource.ts +327 -0
- package/src/internal/dateTime.ts +1277 -0
- package/src/internal/defaultServices/console.ts +100 -0
- package/src/internal/defaultServices.ts +163 -0
- package/src/internal/deferred.ts +46 -0
- package/src/internal/differ/chunkPatch.ts +211 -0
- package/src/internal/differ/contextPatch.ts +232 -0
- package/src/internal/differ/hashMapPatch.ts +220 -0
- package/src/internal/differ/hashSetPatch.ts +176 -0
- package/src/internal/differ/orPatch.ts +311 -0
- package/src/internal/differ/readonlyArrayPatch.ts +210 -0
- package/src/internal/differ.ts +200 -0
- package/src/internal/doNotation.ts +80 -0
- package/src/internal/effect/circular.ts +895 -0
- package/src/internal/effectable.ts +131 -0
- package/src/internal/either.ts +110 -0
- package/src/internal/encoding/base64.ts +286 -0
- package/src/internal/encoding/base64Url.ts +29 -0
- package/src/internal/encoding/common.ts +51 -0
- package/src/internal/encoding/hex.ts +315 -0
- package/src/internal/errors.ts +7 -0
- package/src/internal/executionPlan.ts +114 -0
- package/src/internal/executionStrategy.ts +74 -0
- package/src/internal/fiber.ts +388 -0
- package/src/internal/fiberId.ts +267 -0
- package/src/internal/fiberMessage.ts +82 -0
- package/src/internal/fiberRefs/patch.ts +144 -0
- package/src/internal/fiberRefs.ts +297 -0
- package/src/internal/fiberRuntime.ts +3842 -0
- package/src/internal/fiberScope.ts +71 -0
- package/src/internal/fiberStatus.ts +119 -0
- package/src/internal/groupBy.ts +530 -0
- package/src/internal/hashMap/array.ts +49 -0
- package/src/internal/hashMap/bitwise.ts +32 -0
- package/src/internal/hashMap/config.ts +14 -0
- package/src/internal/hashMap/keySet.ts +8 -0
- package/src/internal/hashMap/node.ts +391 -0
- package/src/internal/hashMap.ts +586 -0
- package/src/internal/hashSet.ts +323 -0
- package/src/internal/keyedPool.ts +244 -0
- package/src/internal/layer/circular.ts +214 -0
- package/src/internal/layer.ts +1483 -0
- package/src/internal/logSpan.ts +20 -0
- package/src/internal/logger-circular.ts +24 -0
- package/src/internal/logger.ts +522 -0
- package/src/internal/mailbox.ts +561 -0
- package/src/internal/managedRuntime/circular.ts +6 -0
- package/src/internal/managedRuntime.ts +134 -0
- package/src/internal/matcher.ts +652 -0
- package/src/internal/metric/boundaries.ts +75 -0
- package/src/internal/metric/hook.ts +483 -0
- package/src/internal/metric/key.ts +167 -0
- package/src/internal/metric/keyType.ts +238 -0
- package/src/internal/metric/label.ts +41 -0
- package/src/internal/metric/pair.ts +48 -0
- package/src/internal/metric/polling.ts +149 -0
- package/src/internal/metric/registry.ts +187 -0
- package/src/internal/metric/state.ts +290 -0
- package/src/internal/metric.ts +577 -0
- package/src/internal/opCodes/cause.ts +35 -0
- package/src/internal/opCodes/channel.ts +83 -0
- package/src/internal/opCodes/channelChildExecutorDecision.ts +17 -0
- package/src/internal/opCodes/channelMergeDecision.ts +11 -0
- package/src/internal/opCodes/channelMergeState.ts +17 -0
- package/src/internal/opCodes/channelMergeStrategy.ts +11 -0
- package/src/internal/opCodes/channelState.ts +23 -0
- package/src/internal/opCodes/channelUpstreamPullRequest.ts +11 -0
- package/src/internal/opCodes/channelUpstreamPullStrategy.ts +11 -0
- package/src/internal/opCodes/config.ts +65 -0
- package/src/internal/opCodes/configError.ts +35 -0
- package/src/internal/opCodes/continuation.ts +11 -0
- package/src/internal/opCodes/deferred.ts +11 -0
- package/src/internal/opCodes/effect.ts +89 -0
- package/src/internal/opCodes/layer.ts +59 -0
- package/src/internal/opCodes/streamHaltStrategy.ts +23 -0
- package/src/internal/option.ts +80 -0
- package/src/internal/pool.ts +432 -0
- package/src/internal/pubsub.ts +1762 -0
- package/src/internal/query.ts +204 -0
- package/src/internal/queue.ts +766 -0
- package/src/internal/random.ts +161 -0
- package/src/internal/rateLimiter.ts +93 -0
- package/src/internal/rcMap.ts +285 -0
- package/src/internal/rcRef.ts +192 -0
- package/src/internal/redBlackTree/iterator.ts +200 -0
- package/src/internal/redBlackTree/node.ts +68 -0
- package/src/internal/redBlackTree.ts +1245 -0
- package/src/internal/redacted.ts +73 -0
- package/src/internal/ref.ts +171 -0
- package/src/internal/reloadable.ts +140 -0
- package/src/internal/request.ts +177 -0
- package/src/internal/resource.ts +76 -0
- package/src/internal/ringBuffer.ts +68 -0
- package/src/internal/runtime.ts +558 -0
- package/src/internal/runtimeFlags.ts +178 -0
- package/src/internal/runtimeFlagsPatch.ts +103 -0
- package/src/internal/schedule/decision.ts +47 -0
- package/src/internal/schedule/interval.ts +101 -0
- package/src/internal/schedule/intervals.ts +180 -0
- package/src/internal/schedule.ts +2199 -0
- package/src/internal/schema/errors.ts +191 -0
- package/src/internal/schema/schemaId.ts +106 -0
- package/src/internal/schema/util.ts +50 -0
- package/src/internal/scopedCache.ts +644 -0
- package/src/internal/scopedRef.ts +118 -0
- package/src/internal/secret.ts +89 -0
- package/src/internal/singleShotGen.ts +35 -0
- package/src/internal/sink.ts +2120 -0
- package/src/internal/stack.ts +10 -0
- package/src/internal/stm/core.ts +817 -0
- package/src/internal/stm/entry.ts +59 -0
- package/src/internal/stm/journal.ts +123 -0
- package/src/internal/stm/opCodes/stm.ts +71 -0
- package/src/internal/stm/opCodes/stmState.ts +17 -0
- package/src/internal/stm/opCodes/strategy.ts +17 -0
- package/src/internal/stm/opCodes/tExit.ts +29 -0
- package/src/internal/stm/opCodes/tryCommit.ts +11 -0
- package/src/internal/stm/stm.ts +1453 -0
- package/src/internal/stm/stmState.ts +136 -0
- package/src/internal/stm/tArray.ts +550 -0
- package/src/internal/stm/tDeferred.ts +81 -0
- package/src/internal/stm/tExit.ts +190 -0
- package/src/internal/stm/tMap.ts +824 -0
- package/src/internal/stm/tPriorityQueue.ts +267 -0
- package/src/internal/stm/tPubSub.ts +551 -0
- package/src/internal/stm/tQueue.ts +393 -0
- package/src/internal/stm/tRandom.ts +140 -0
- package/src/internal/stm/tReentrantLock.ts +352 -0
- package/src/internal/stm/tRef.ts +195 -0
- package/src/internal/stm/tSemaphore.ts +113 -0
- package/src/internal/stm/tSet.ts +259 -0
- package/src/internal/stm/tSubscriptionRef.ts +286 -0
- package/src/internal/stm/tryCommit.ts +34 -0
- package/src/internal/stm/txnId.ts +14 -0
- package/src/internal/stm/versioned.ts +4 -0
- package/src/internal/stream/debounceState.ts +57 -0
- package/src/internal/stream/emit.ts +123 -0
- package/src/internal/stream/haltStrategy.ts +94 -0
- package/src/internal/stream/handoff.ts +187 -0
- package/src/internal/stream/handoffSignal.ts +59 -0
- package/src/internal/stream/pull.ts +34 -0
- package/src/internal/stream/sinkEndReason.ts +30 -0
- package/src/internal/stream/zipAllState.ts +88 -0
- package/src/internal/stream/zipChunksState.ts +56 -0
- package/src/internal/stream.ts +8801 -0
- package/src/internal/string-utils.ts +107 -0
- package/src/internal/subscriptionRef.ts +138 -0
- package/src/internal/supervisor/patch.ts +190 -0
- package/src/internal/supervisor.ts +303 -0
- package/src/internal/synchronizedRef.ts +114 -0
- package/src/internal/take.ts +199 -0
- package/src/internal/testing/sleep.ts +27 -0
- package/src/internal/testing/suspendedWarningData.ts +85 -0
- package/src/internal/testing/warningData.ts +94 -0
- package/src/internal/tracer.ts +150 -0
- package/src/internal/trie.ts +722 -0
- package/src/internal/version.ts +7 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as Arr from "../../Array.js"
|
|
2
|
+
import * as Chunk from "../../Chunk.js"
|
|
3
|
+
import * as Equal from "../../Equal.js"
|
|
4
|
+
import { pipe } from "../../Function.js"
|
|
5
|
+
import * as Hash from "../../Hash.js"
|
|
6
|
+
import type * as MetricBoundaries from "../../MetricBoundaries.js"
|
|
7
|
+
import { pipeArguments } from "../../Pipeable.js"
|
|
8
|
+
import { hasProperty } from "../../Predicate.js"
|
|
9
|
+
|
|
10
|
+
/** @internal */
|
|
11
|
+
const MetricBoundariesSymbolKey = "effect/MetricBoundaries"
|
|
12
|
+
|
|
13
|
+
/** @internal */
|
|
14
|
+
export const MetricBoundariesTypeId: MetricBoundaries.MetricBoundariesTypeId = Symbol.for(
|
|
15
|
+
MetricBoundariesSymbolKey
|
|
16
|
+
) as MetricBoundaries.MetricBoundariesTypeId
|
|
17
|
+
|
|
18
|
+
/** @internal */
|
|
19
|
+
class MetricBoundariesImpl implements MetricBoundaries.MetricBoundaries {
|
|
20
|
+
readonly [MetricBoundariesTypeId]: MetricBoundaries.MetricBoundariesTypeId = MetricBoundariesTypeId
|
|
21
|
+
constructor(readonly values: ReadonlyArray<number>) {
|
|
22
|
+
this._hash = pipe(
|
|
23
|
+
Hash.string(MetricBoundariesSymbolKey),
|
|
24
|
+
Hash.combine(Hash.array(this.values))
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
readonly _hash: number;
|
|
28
|
+
[Hash.symbol](): number {
|
|
29
|
+
return this._hash
|
|
30
|
+
}
|
|
31
|
+
[Equal.symbol](u: unknown): boolean {
|
|
32
|
+
return isMetricBoundaries(u) && Equal.equals(this.values, u.values)
|
|
33
|
+
}
|
|
34
|
+
pipe() {
|
|
35
|
+
return pipeArguments(this, arguments)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** @internal */
|
|
40
|
+
export const isMetricBoundaries = (u: unknown): u is MetricBoundaries.MetricBoundaries =>
|
|
41
|
+
hasProperty(u, MetricBoundariesTypeId)
|
|
42
|
+
|
|
43
|
+
/** @internal */
|
|
44
|
+
export const fromIterable = (iterable: Iterable<number>): MetricBoundaries.MetricBoundaries => {
|
|
45
|
+
const values = pipe(
|
|
46
|
+
iterable,
|
|
47
|
+
Arr.appendAll(Chunk.of(Number.POSITIVE_INFINITY)),
|
|
48
|
+
Arr.dedupe
|
|
49
|
+
)
|
|
50
|
+
return new MetricBoundariesImpl(values)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** @internal */
|
|
54
|
+
export const linear = (options: {
|
|
55
|
+
readonly start: number
|
|
56
|
+
readonly width: number
|
|
57
|
+
readonly count: number
|
|
58
|
+
}): MetricBoundaries.MetricBoundaries =>
|
|
59
|
+
pipe(
|
|
60
|
+
Arr.makeBy(options.count - 1, (i) => options.start + i * options.width),
|
|
61
|
+
Chunk.unsafeFromArray,
|
|
62
|
+
fromIterable
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
/** @internal */
|
|
66
|
+
export const exponential = (options: {
|
|
67
|
+
readonly start: number
|
|
68
|
+
readonly factor: number
|
|
69
|
+
readonly count: number
|
|
70
|
+
}): MetricBoundaries.MetricBoundaries =>
|
|
71
|
+
pipe(
|
|
72
|
+
Arr.makeBy(options.count - 1, (i) => options.start * Math.pow(options.factor, i)),
|
|
73
|
+
Chunk.unsafeFromArray,
|
|
74
|
+
fromIterable
|
|
75
|
+
)
|
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
import * as Arr from "../../Array.js"
|
|
2
|
+
import * as Duration from "../../Duration.js"
|
|
3
|
+
import type { LazyArg } from "../../Function.js"
|
|
4
|
+
import { dual, pipe } from "../../Function.js"
|
|
5
|
+
import type * as MetricHook from "../../MetricHook.js"
|
|
6
|
+
import type * as MetricKey from "../../MetricKey.js"
|
|
7
|
+
import type * as MetricState from "../../MetricState.js"
|
|
8
|
+
import * as number from "../../Number.js"
|
|
9
|
+
import * as Option from "../../Option.js"
|
|
10
|
+
import { pipeArguments } from "../../Pipeable.js"
|
|
11
|
+
import * as metricState from "./state.js"
|
|
12
|
+
|
|
13
|
+
/** @internal */
|
|
14
|
+
const MetricHookSymbolKey = "effect/MetricHook"
|
|
15
|
+
|
|
16
|
+
/** @internal */
|
|
17
|
+
export const MetricHookTypeId: MetricHook.MetricHookTypeId = Symbol.for(
|
|
18
|
+
MetricHookSymbolKey
|
|
19
|
+
) as MetricHook.MetricHookTypeId
|
|
20
|
+
|
|
21
|
+
const metricHookVariance = {
|
|
22
|
+
/* c8 ignore next */
|
|
23
|
+
_In: (_: unknown) => _,
|
|
24
|
+
/* c8 ignore next */
|
|
25
|
+
_Out: (_: never) => _
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** @internal */
|
|
29
|
+
export const make = <In, Out>(
|
|
30
|
+
options: {
|
|
31
|
+
readonly get: LazyArg<Out>
|
|
32
|
+
readonly update: (input: In) => void
|
|
33
|
+
readonly modify: (input: In) => void
|
|
34
|
+
}
|
|
35
|
+
): MetricHook.MetricHook<In, Out> => ({
|
|
36
|
+
[MetricHookTypeId]: metricHookVariance,
|
|
37
|
+
pipe() {
|
|
38
|
+
return pipeArguments(this, arguments)
|
|
39
|
+
},
|
|
40
|
+
...options
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
/** @internal */
|
|
44
|
+
export const onModify = dual<
|
|
45
|
+
<In, Out>(f: (input: In) => void) => (self: MetricHook.MetricHook<In, Out>) => MetricHook.MetricHook<In, Out>,
|
|
46
|
+
<In, Out>(self: MetricHook.MetricHook<In, Out>, f: (input: In) => void) => MetricHook.MetricHook<In, Out>
|
|
47
|
+
>(2, (self, f) => ({
|
|
48
|
+
[MetricHookTypeId]: metricHookVariance,
|
|
49
|
+
pipe() {
|
|
50
|
+
return pipeArguments(this, arguments)
|
|
51
|
+
},
|
|
52
|
+
get: self.get,
|
|
53
|
+
update: self.update,
|
|
54
|
+
modify: (input) => {
|
|
55
|
+
self.modify(input)
|
|
56
|
+
return f(input)
|
|
57
|
+
}
|
|
58
|
+
}))
|
|
59
|
+
|
|
60
|
+
/** @internal */
|
|
61
|
+
export const onUpdate = dual<
|
|
62
|
+
<In, Out>(f: (input: In) => void) => (self: MetricHook.MetricHook<In, Out>) => MetricHook.MetricHook<In, Out>,
|
|
63
|
+
<In, Out>(self: MetricHook.MetricHook<In, Out>, f: (input: In) => void) => MetricHook.MetricHook<In, Out>
|
|
64
|
+
>(2, (self, f) => ({
|
|
65
|
+
[MetricHookTypeId]: metricHookVariance,
|
|
66
|
+
pipe() {
|
|
67
|
+
return pipeArguments(this, arguments)
|
|
68
|
+
},
|
|
69
|
+
get: self.get,
|
|
70
|
+
update: (input) => {
|
|
71
|
+
self.update(input)
|
|
72
|
+
return f(input)
|
|
73
|
+
},
|
|
74
|
+
modify: self.modify
|
|
75
|
+
}))
|
|
76
|
+
|
|
77
|
+
const bigint0 = BigInt(0)
|
|
78
|
+
|
|
79
|
+
/** @internal */
|
|
80
|
+
export const counter = <A extends (number | bigint)>(
|
|
81
|
+
key: MetricKey.MetricKey.Counter<A>
|
|
82
|
+
): MetricHook.MetricHook.Counter<A> => {
|
|
83
|
+
let sum: A = key.keyType.bigint ? bigint0 as A : 0 as A
|
|
84
|
+
const canUpdate = key.keyType.incremental
|
|
85
|
+
? key.keyType.bigint
|
|
86
|
+
? (value: A) => value >= bigint0
|
|
87
|
+
: (value: A) => value >= 0
|
|
88
|
+
: (_value: A) => true
|
|
89
|
+
const update = (value: A) => {
|
|
90
|
+
if (canUpdate(value)) {
|
|
91
|
+
sum = (sum as any) + value
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return make({
|
|
95
|
+
get: () => metricState.counter(sum as number) as unknown as MetricState.MetricState.Counter<A>,
|
|
96
|
+
update,
|
|
97
|
+
modify: update
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** @internal */
|
|
102
|
+
export const frequency = (key: MetricKey.MetricKey.Frequency): MetricHook.MetricHook.Frequency => {
|
|
103
|
+
const values = new Map<string, number>()
|
|
104
|
+
for (const word of key.keyType.preregisteredWords) {
|
|
105
|
+
values.set(word, 0)
|
|
106
|
+
}
|
|
107
|
+
const update = (word: string) => {
|
|
108
|
+
const slotCount = values.get(word) ?? 0
|
|
109
|
+
values.set(word, slotCount + 1)
|
|
110
|
+
}
|
|
111
|
+
return make({
|
|
112
|
+
get: () => metricState.frequency(values),
|
|
113
|
+
update,
|
|
114
|
+
modify: update
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** @internal */
|
|
119
|
+
export const gauge: {
|
|
120
|
+
(key: MetricKey.MetricKey.Gauge<number>, startAt: number): MetricHook.MetricHook.Gauge<number>
|
|
121
|
+
(key: MetricKey.MetricKey.Gauge<bigint>, startAt: bigint): MetricHook.MetricHook.Gauge<bigint>
|
|
122
|
+
} = <A extends (number | bigint)>(
|
|
123
|
+
_key: MetricKey.MetricKey.Gauge<A>,
|
|
124
|
+
startAt: A
|
|
125
|
+
): MetricHook.MetricHook.Gauge<A> => {
|
|
126
|
+
let value = startAt
|
|
127
|
+
return make({
|
|
128
|
+
get: () => metricState.gauge(value as number) as unknown as MetricState.MetricState.Gauge<A>,
|
|
129
|
+
update: (v) => {
|
|
130
|
+
value = v
|
|
131
|
+
},
|
|
132
|
+
modify: (v) => {
|
|
133
|
+
value = (value as any) + v
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** @internal */
|
|
139
|
+
export const histogram = (key: MetricKey.MetricKey.Histogram): MetricHook.MetricHook.Histogram => {
|
|
140
|
+
const bounds = key.keyType.boundaries.values
|
|
141
|
+
const size = bounds.length
|
|
142
|
+
const values = new Uint32Array(size + 1)
|
|
143
|
+
// NOTE: while 64-bit floating point precision shoule be enough for any
|
|
144
|
+
// practical histogram boundary values, there is still a small chance that
|
|
145
|
+
// precision will be lost with very large / very small numbers. If we find
|
|
146
|
+
// that is the case, a more complex approach storing the histogram boundary
|
|
147
|
+
// values as a tuple of `[original: string, numeric: number]` may be warranted
|
|
148
|
+
const boundaries = new Float64Array(size)
|
|
149
|
+
let count = 0
|
|
150
|
+
let sum = 0
|
|
151
|
+
let min = Number.MAX_VALUE
|
|
152
|
+
let max = Number.MIN_VALUE
|
|
153
|
+
|
|
154
|
+
pipe(
|
|
155
|
+
bounds,
|
|
156
|
+
Arr.sort(number.Order),
|
|
157
|
+
Arr.map((n, i) => {
|
|
158
|
+
boundaries[i] = n
|
|
159
|
+
})
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
// Insert the value into the right bucket with a binary search
|
|
163
|
+
const update = (value: number) => {
|
|
164
|
+
let from = 0
|
|
165
|
+
let to = size
|
|
166
|
+
while (from !== to) {
|
|
167
|
+
const mid = Math.floor(from + (to - from) / 2)
|
|
168
|
+
const boundary = boundaries[mid]
|
|
169
|
+
if (value <= boundary) {
|
|
170
|
+
to = mid
|
|
171
|
+
} else {
|
|
172
|
+
from = mid
|
|
173
|
+
}
|
|
174
|
+
// The special case when to / from have a distance of one
|
|
175
|
+
if (to === from + 1) {
|
|
176
|
+
if (value <= boundaries[from]) {
|
|
177
|
+
to = from
|
|
178
|
+
} else {
|
|
179
|
+
from = to
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
values[from] = values[from]! + 1
|
|
184
|
+
count = count + 1
|
|
185
|
+
sum = sum + value
|
|
186
|
+
if (value < min) {
|
|
187
|
+
min = value
|
|
188
|
+
}
|
|
189
|
+
if (value > max) {
|
|
190
|
+
max = value
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const getBuckets = (): ReadonlyArray<readonly [number, number]> => {
|
|
195
|
+
const builder: Array<readonly [number, number]> = Arr.allocate(size) as any
|
|
196
|
+
let cumulated = 0
|
|
197
|
+
for (let i = 0; i < size; i++) {
|
|
198
|
+
const boundary = boundaries[i]
|
|
199
|
+
const value = values[i]
|
|
200
|
+
cumulated = cumulated + value
|
|
201
|
+
builder[i] = [boundary, cumulated]
|
|
202
|
+
}
|
|
203
|
+
return builder
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return make({
|
|
207
|
+
get: () =>
|
|
208
|
+
metricState.histogram({
|
|
209
|
+
buckets: getBuckets(),
|
|
210
|
+
count,
|
|
211
|
+
min,
|
|
212
|
+
max,
|
|
213
|
+
sum
|
|
214
|
+
}),
|
|
215
|
+
update,
|
|
216
|
+
modify: update
|
|
217
|
+
})
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** @internal */
|
|
221
|
+
export const summary = (key: MetricKey.MetricKey.Summary): MetricHook.MetricHook.Summary => {
|
|
222
|
+
const { error, maxAge, maxSize, quantiles } = key.keyType
|
|
223
|
+
const sortedQuantiles = pipe(quantiles, Arr.sort(number.Order))
|
|
224
|
+
const values = Arr.allocate<readonly [number, number]>(maxSize)
|
|
225
|
+
|
|
226
|
+
let head = 0
|
|
227
|
+
let count = 0
|
|
228
|
+
let sum = 0
|
|
229
|
+
let min = 0
|
|
230
|
+
let max = 0
|
|
231
|
+
|
|
232
|
+
// Just before the snapshot we filter out all values older than maxAge
|
|
233
|
+
const snapshot = (now: number): ReadonlyArray<readonly [number, Option.Option<number>]> => {
|
|
234
|
+
const builder: Array<number> = []
|
|
235
|
+
// If the buffer is not full yet it contains valid items at the 0..last
|
|
236
|
+
// indices and null values at the rest of the positions.
|
|
237
|
+
//
|
|
238
|
+
// If the buffer is already full then all elements contains a valid
|
|
239
|
+
// measurement with timestamp.
|
|
240
|
+
//
|
|
241
|
+
// At any given point in time we can enumerate all the non-null elements in
|
|
242
|
+
// the buffer and filter them by timestamp to get a valid view of a time
|
|
243
|
+
// window.
|
|
244
|
+
//
|
|
245
|
+
// The order does not matter because it gets sorted before passing to
|
|
246
|
+
// `calculateQuantiles`.
|
|
247
|
+
let i = 0
|
|
248
|
+
while (i !== maxSize - 1) {
|
|
249
|
+
const item = values[i]
|
|
250
|
+
if (item != null) {
|
|
251
|
+
const [t, v] = item
|
|
252
|
+
const age = Duration.millis(now - t)
|
|
253
|
+
if (Duration.greaterThanOrEqualTo(age, Duration.zero) && Duration.lessThanOrEqualTo(age, maxAge)) {
|
|
254
|
+
builder.push(v)
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
i = i + 1
|
|
258
|
+
}
|
|
259
|
+
return calculateQuantiles(
|
|
260
|
+
error,
|
|
261
|
+
sortedQuantiles,
|
|
262
|
+
Arr.sort(builder, number.Order)
|
|
263
|
+
)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const observe = (value: number, timestamp: number) => {
|
|
267
|
+
if (maxSize > 0) {
|
|
268
|
+
head = head + 1
|
|
269
|
+
const target = head % maxSize
|
|
270
|
+
values[target] = [timestamp, value] as const
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
min = count === 0 ? value : Math.min(min, value)
|
|
274
|
+
max = count === 0 ? value : Math.max(max, value)
|
|
275
|
+
|
|
276
|
+
count = count + 1
|
|
277
|
+
sum = sum + value
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return make({
|
|
281
|
+
get: () =>
|
|
282
|
+
metricState.summary({
|
|
283
|
+
error,
|
|
284
|
+
quantiles: snapshot(Date.now()),
|
|
285
|
+
count,
|
|
286
|
+
min,
|
|
287
|
+
max,
|
|
288
|
+
sum
|
|
289
|
+
}),
|
|
290
|
+
update: ([value, timestamp]) => observe(value, timestamp),
|
|
291
|
+
modify: ([value, timestamp]) => observe(value, timestamp)
|
|
292
|
+
})
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/** @internal */
|
|
296
|
+
interface ResolvedQuantile {
|
|
297
|
+
/**
|
|
298
|
+
* The quantile that shall be resolved.
|
|
299
|
+
*/
|
|
300
|
+
readonly quantile: number
|
|
301
|
+
/**
|
|
302
|
+
* `Some<number>` if a value for the quantile could be found, otherwise
|
|
303
|
+
* `None`.
|
|
304
|
+
*/
|
|
305
|
+
readonly value: Option.Option<number>
|
|
306
|
+
/**
|
|
307
|
+
* How many samples have been consumed prior to this quantile.
|
|
308
|
+
*/
|
|
309
|
+
readonly consumed: number
|
|
310
|
+
/**
|
|
311
|
+
* The rest of the samples after the quantile has been resolved.
|
|
312
|
+
*/
|
|
313
|
+
readonly rest: ReadonlyArray<number>
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/** @internal */
|
|
317
|
+
const calculateQuantiles = (
|
|
318
|
+
error: number,
|
|
319
|
+
sortedQuantiles: ReadonlyArray<number>,
|
|
320
|
+
sortedSamples: ReadonlyArray<number>
|
|
321
|
+
): ReadonlyArray<readonly [number, Option.Option<number>]> => {
|
|
322
|
+
// The number of samples examined
|
|
323
|
+
const sampleCount = sortedSamples.length
|
|
324
|
+
if (!Arr.isNonEmptyReadonlyArray(sortedQuantiles)) {
|
|
325
|
+
return Arr.empty()
|
|
326
|
+
}
|
|
327
|
+
const head = sortedQuantiles[0]
|
|
328
|
+
const tail = sortedQuantiles.slice(1)
|
|
329
|
+
const resolvedHead = resolveQuantile(
|
|
330
|
+
error,
|
|
331
|
+
sampleCount,
|
|
332
|
+
Option.none(),
|
|
333
|
+
0,
|
|
334
|
+
head,
|
|
335
|
+
sortedSamples
|
|
336
|
+
)
|
|
337
|
+
const resolved = Arr.of(resolvedHead)
|
|
338
|
+
tail.forEach((quantile) => {
|
|
339
|
+
resolved.push(
|
|
340
|
+
resolveQuantile(
|
|
341
|
+
error,
|
|
342
|
+
sampleCount,
|
|
343
|
+
resolvedHead.value,
|
|
344
|
+
resolvedHead.consumed,
|
|
345
|
+
quantile,
|
|
346
|
+
resolvedHead.rest
|
|
347
|
+
)
|
|
348
|
+
)
|
|
349
|
+
})
|
|
350
|
+
return Arr.map(resolved, (rq) => [rq.quantile, rq.value] as const)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/** @internal */
|
|
354
|
+
const resolveQuantile = (
|
|
355
|
+
error: number,
|
|
356
|
+
sampleCount: number,
|
|
357
|
+
current: Option.Option<number>,
|
|
358
|
+
consumed: number,
|
|
359
|
+
quantile: number,
|
|
360
|
+
rest: ReadonlyArray<number>
|
|
361
|
+
): ResolvedQuantile => {
|
|
362
|
+
let error_1 = error
|
|
363
|
+
let sampleCount_1 = sampleCount
|
|
364
|
+
let current_1 = current
|
|
365
|
+
let consumed_1 = consumed
|
|
366
|
+
let quantile_1 = quantile
|
|
367
|
+
let rest_1 = rest
|
|
368
|
+
let error_2 = error
|
|
369
|
+
let sampleCount_2 = sampleCount
|
|
370
|
+
let current_2 = current
|
|
371
|
+
let consumed_2 = consumed
|
|
372
|
+
let quantile_2 = quantile
|
|
373
|
+
let rest_2 = rest
|
|
374
|
+
// eslint-disable-next-line no-constant-condition
|
|
375
|
+
while (1) {
|
|
376
|
+
// If the remaining list of samples is empty, there is nothing more to resolve
|
|
377
|
+
if (!Arr.isNonEmptyReadonlyArray(rest_1)) {
|
|
378
|
+
return {
|
|
379
|
+
quantile: quantile_1,
|
|
380
|
+
value: Option.none(),
|
|
381
|
+
consumed: consumed_1,
|
|
382
|
+
rest: []
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// If the quantile is the 100% quantile, we can take the maximum of all the
|
|
386
|
+
// remaining values as the result
|
|
387
|
+
if (quantile_1 === 1) {
|
|
388
|
+
return {
|
|
389
|
+
quantile: quantile_1,
|
|
390
|
+
value: Option.some(Arr.lastNonEmpty(rest_1)),
|
|
391
|
+
consumed: consumed_1 + rest_1.length,
|
|
392
|
+
rest: []
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Split into two chunks - the first chunk contains all elements of the same
|
|
396
|
+
// value as the chunk head
|
|
397
|
+
const headValue = Arr.headNonEmpty(rest_1) // Get head value since rest_1 is non-empty
|
|
398
|
+
const sameHead = Arr.span(rest_1, (n) => n === headValue)
|
|
399
|
+
// How many elements do we want to accept for this quantile
|
|
400
|
+
const desired = quantile_1 * sampleCount_1
|
|
401
|
+
// The error margin
|
|
402
|
+
const allowedError = (error_1 / 2) * desired
|
|
403
|
+
// Taking into account the elements consumed from the samples so far and the
|
|
404
|
+
// number of same elements at the beginning of the chunk, calculate the number
|
|
405
|
+
// of elements we would have if we selected the current head as result
|
|
406
|
+
const candConsumed = consumed_1 + sameHead[0].length
|
|
407
|
+
const candError = Math.abs(candConsumed - desired)
|
|
408
|
+
// If we haven't got enough elements yet, recurse
|
|
409
|
+
if (candConsumed < desired - allowedError) {
|
|
410
|
+
error_2 = error_1
|
|
411
|
+
sampleCount_2 = sampleCount_1
|
|
412
|
+
current_2 = Arr.head(rest_1)
|
|
413
|
+
consumed_2 = candConsumed
|
|
414
|
+
quantile_2 = quantile_1
|
|
415
|
+
rest_2 = sameHead[1]
|
|
416
|
+
error_1 = error_2
|
|
417
|
+
sampleCount_1 = sampleCount_2
|
|
418
|
+
current_1 = current_2
|
|
419
|
+
consumed_1 = consumed_2
|
|
420
|
+
quantile_1 = quantile_2
|
|
421
|
+
rest_1 = rest_2
|
|
422
|
+
continue
|
|
423
|
+
}
|
|
424
|
+
// If consuming this chunk leads to too many elements (rank is too high)
|
|
425
|
+
if (candConsumed > desired + allowedError) {
|
|
426
|
+
const valueToReturn = Option.isNone(current_1)
|
|
427
|
+
? Option.some(headValue)
|
|
428
|
+
: current_1
|
|
429
|
+
return {
|
|
430
|
+
quantile: quantile_1,
|
|
431
|
+
value: valueToReturn,
|
|
432
|
+
consumed: consumed_1,
|
|
433
|
+
rest: rest_1
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
// If we are in the target interval, select the current head and hand back the leftover after dropping all elements
|
|
437
|
+
// from the sample chunk that are equal to the current head
|
|
438
|
+
switch (current_1._tag) {
|
|
439
|
+
case "None": {
|
|
440
|
+
error_2 = error_1
|
|
441
|
+
sampleCount_2 = sampleCount_1
|
|
442
|
+
current_2 = Arr.head(rest_1)
|
|
443
|
+
consumed_2 = candConsumed
|
|
444
|
+
quantile_2 = quantile_1
|
|
445
|
+
rest_2 = sameHead[1]
|
|
446
|
+
error_1 = error_2
|
|
447
|
+
sampleCount_1 = sampleCount_2
|
|
448
|
+
current_1 = current_2
|
|
449
|
+
consumed_1 = consumed_2
|
|
450
|
+
quantile_1 = quantile_2
|
|
451
|
+
rest_1 = rest_2
|
|
452
|
+
continue
|
|
453
|
+
}
|
|
454
|
+
case "Some": {
|
|
455
|
+
const prevError = Math.abs(desired - current_1.value)
|
|
456
|
+
if (candError < prevError) {
|
|
457
|
+
error_2 = error_1
|
|
458
|
+
sampleCount_2 = sampleCount_1
|
|
459
|
+
current_2 = Arr.head(rest_1)
|
|
460
|
+
consumed_2 = candConsumed
|
|
461
|
+
quantile_2 = quantile_1
|
|
462
|
+
rest_2 = sameHead[1]
|
|
463
|
+
error_1 = error_2
|
|
464
|
+
sampleCount_1 = sampleCount_2
|
|
465
|
+
current_1 = current_2
|
|
466
|
+
consumed_1 = consumed_2
|
|
467
|
+
quantile_1 = quantile_2
|
|
468
|
+
rest_1 = rest_2
|
|
469
|
+
continue
|
|
470
|
+
}
|
|
471
|
+
return {
|
|
472
|
+
quantile: quantile_1,
|
|
473
|
+
value: Option.some(current_1.value),
|
|
474
|
+
consumed: consumed_1,
|
|
475
|
+
rest: rest_1
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
throw new Error(
|
|
481
|
+
"BUG: MetricHook.resolveQuantiles - please report an issue at https://github.com/Effect-TS/effect/issues"
|
|
482
|
+
)
|
|
483
|
+
}
|