@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.
- 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
package/src/Random.ts
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Array from "./Array.js"
|
|
5
|
+
import type * as Cause from "./Cause.js"
|
|
6
|
+
import type * as Chunk from "./Chunk.js"
|
|
7
|
+
import type * as Context from "./Context.js"
|
|
8
|
+
import type * as Effect from "./Effect.js"
|
|
9
|
+
import * as defaultServices from "./internal/defaultServices.js"
|
|
10
|
+
import * as internal from "./internal/random.js"
|
|
11
|
+
import type * as NonEmptyIterable from "./NonEmptyIterable.js"
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @since 2.0.0
|
|
15
|
+
* @category symbols
|
|
16
|
+
*/
|
|
17
|
+
export const RandomTypeId: unique symbol = internal.RandomTypeId
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @since 2.0.0
|
|
21
|
+
* @category symbols
|
|
22
|
+
*/
|
|
23
|
+
export type RandomTypeId = typeof RandomTypeId
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @since 2.0.0
|
|
27
|
+
* @category models
|
|
28
|
+
*/
|
|
29
|
+
export interface Random {
|
|
30
|
+
readonly [RandomTypeId]: RandomTypeId
|
|
31
|
+
/**
|
|
32
|
+
* Returns the next numeric value from the pseudo-random number generator.
|
|
33
|
+
*/
|
|
34
|
+
readonly next: Effect.Effect<number>
|
|
35
|
+
/**
|
|
36
|
+
* Returns the next boolean value from the pseudo-random number generator.
|
|
37
|
+
*/
|
|
38
|
+
readonly nextBoolean: Effect.Effect<boolean>
|
|
39
|
+
/**
|
|
40
|
+
* Returns the next integer value from the pseudo-random number generator.
|
|
41
|
+
*/
|
|
42
|
+
readonly nextInt: Effect.Effect<number>
|
|
43
|
+
/**
|
|
44
|
+
* Returns the next numeric value in the specified range from the
|
|
45
|
+
* pseudo-random number generator.
|
|
46
|
+
*/
|
|
47
|
+
nextRange(min: number, max: number): Effect.Effect<number>
|
|
48
|
+
/**
|
|
49
|
+
* Returns the next integer value in the specified range from the
|
|
50
|
+
* pseudo-random number generator.
|
|
51
|
+
*/
|
|
52
|
+
nextIntBetween(min: number, max: number): Effect.Effect<number>
|
|
53
|
+
/**
|
|
54
|
+
* Uses the pseudo-random number generator to shuffle the specified iterable.
|
|
55
|
+
*/
|
|
56
|
+
shuffle<A>(elements: Iterable<A>): Effect.Effect<Chunk.Chunk<A>>
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Returns the next numeric value from the pseudo-random number generator.
|
|
61
|
+
*
|
|
62
|
+
* @since 2.0.0
|
|
63
|
+
* @category constructors
|
|
64
|
+
*/
|
|
65
|
+
export const next: Effect.Effect<number> = defaultServices.next
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Returns the next integer value from the pseudo-random number generator.
|
|
69
|
+
*
|
|
70
|
+
* @since 2.0.0
|
|
71
|
+
* @category constructors
|
|
72
|
+
*/
|
|
73
|
+
export const nextInt: Effect.Effect<number> = defaultServices.nextInt
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Returns the next boolean value from the pseudo-random number generator.
|
|
77
|
+
*
|
|
78
|
+
* @since 2.0.0
|
|
79
|
+
* @category constructors
|
|
80
|
+
*/
|
|
81
|
+
export const nextBoolean: Effect.Effect<boolean> = defaultServices.nextBoolean
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Returns the next numeric value in the specified range from the
|
|
85
|
+
* pseudo-random number generator.
|
|
86
|
+
*
|
|
87
|
+
* @since 2.0.0
|
|
88
|
+
* @category constructors
|
|
89
|
+
*/
|
|
90
|
+
export const nextRange: (min: number, max: number) => Effect.Effect<number> = defaultServices.nextRange
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Returns the next integer value in the specified range from the
|
|
94
|
+
* pseudo-random number generator.
|
|
95
|
+
*
|
|
96
|
+
* @since 2.0.0
|
|
97
|
+
* @category constructors
|
|
98
|
+
*/
|
|
99
|
+
export const nextIntBetween: (min: number, max: number) => Effect.Effect<number> = defaultServices.nextIntBetween
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Uses the pseudo-random number generator to shuffle the specified iterable.
|
|
103
|
+
*
|
|
104
|
+
* @since 2.0.0
|
|
105
|
+
* @category constructors
|
|
106
|
+
*/
|
|
107
|
+
export const shuffle: <A>(elements: Iterable<A>) => Effect.Effect<Chunk.Chunk<A>> = defaultServices.shuffle
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Get a random element from an iterable.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```ts
|
|
114
|
+
* import { Effect, Random } from "effect"
|
|
115
|
+
*
|
|
116
|
+
* Effect.gen(function* () {
|
|
117
|
+
* const randomItem = yield* Random.choice([1, 2, 3])
|
|
118
|
+
* console.log(randomItem)
|
|
119
|
+
* })
|
|
120
|
+
* ```
|
|
121
|
+
*
|
|
122
|
+
* @since 3.6.0
|
|
123
|
+
* @category constructors
|
|
124
|
+
*/
|
|
125
|
+
export const choice: <Self extends Iterable<unknown>>(
|
|
126
|
+
elements: Self
|
|
127
|
+
) => Self extends NonEmptyIterable.NonEmptyIterable<infer A> ? Effect.Effect<A>
|
|
128
|
+
: Self extends Array.NonEmptyReadonlyArray<infer A> ? Effect.Effect<A>
|
|
129
|
+
: Self extends Iterable<infer A> ? Effect.Effect<A, Cause.NoSuchElementException>
|
|
130
|
+
: never = defaultServices.choice
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Retreives the `Random` service from the context and uses it to run the
|
|
134
|
+
* specified workflow.
|
|
135
|
+
*
|
|
136
|
+
* @since 2.0.0
|
|
137
|
+
* @category constructors
|
|
138
|
+
*/
|
|
139
|
+
export const randomWith: <A, E, R>(f: (random: Random) => Effect.Effect<A, E, R>) => Effect.Effect<A, E, R> =
|
|
140
|
+
defaultServices.randomWith
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @since 2.0.0
|
|
144
|
+
* @category context
|
|
145
|
+
*/
|
|
146
|
+
export const Random: Context.Tag<Random, Random> = internal.randomTag
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Constructs the `Random` service, seeding the pseudo-random number generator
|
|
150
|
+
* with an hash of the specified seed.
|
|
151
|
+
* This constructor is useful for generating predictable sequences of random values for specific use cases.
|
|
152
|
+
*
|
|
153
|
+
* Example uses:
|
|
154
|
+
* - Generating random UI data for visual tests.
|
|
155
|
+
* - Creating data that needs to change daily but remain the same throughout a single day, such as using a date as the seed.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```ts
|
|
159
|
+
* import * as assert from "node:assert"
|
|
160
|
+
* import { Effect, Random } from "effect"
|
|
161
|
+
*
|
|
162
|
+
* const random1 = Random.make("myseed")
|
|
163
|
+
* const random2 = Random.make("myseed")
|
|
164
|
+
*
|
|
165
|
+
* assert.equal(Effect.runSync(random1.next), Effect.runSync(random2.next))
|
|
166
|
+
* ```
|
|
167
|
+
*
|
|
168
|
+
* @since 3.5.0
|
|
169
|
+
* @category constructors
|
|
170
|
+
*/
|
|
171
|
+
export const make: <A>(seed: A) => Random = internal.make
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Constructs the `Random` service from an array of literal values.
|
|
175
|
+
* The service will cycle through the provided values in order when generating random values.
|
|
176
|
+
* This constructor is useful for creating deterministic sequences for testing or when specific values need to be returned.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```ts
|
|
180
|
+
* import { Effect, Random } from "effect"
|
|
181
|
+
*
|
|
182
|
+
* Effect.gen(function* () {
|
|
183
|
+
* console.log(yield* Random.next) // 0.2
|
|
184
|
+
* console.log(yield* Random.next) // 0.5
|
|
185
|
+
* console.log(yield* Random.next) // 0.8
|
|
186
|
+
* console.log(yield* Random.next) // 0.2 (cycles back)
|
|
187
|
+
* }).pipe(Effect.withRandom(Random.fixed([0.2, 0.5, 0.8])))
|
|
188
|
+
* ```
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```ts
|
|
192
|
+
* import { Effect, Random } from "effect"
|
|
193
|
+
*
|
|
194
|
+
* Effect.gen(function* () {
|
|
195
|
+
* console.log(yield* Random.nextBoolean) // true
|
|
196
|
+
* console.log(yield* Random.nextBoolean) // false
|
|
197
|
+
* console.log(yield* Random.nextBoolean) // true
|
|
198
|
+
* }).pipe(Effect.withRandom(Random.fixed([true, false, true])))
|
|
199
|
+
* ```
|
|
200
|
+
*
|
|
201
|
+
* @since 3.11.0
|
|
202
|
+
* @category constructors
|
|
203
|
+
*/
|
|
204
|
+
export const fixed: <const T extends Array.NonEmptyArray<any>>(values: T) => Random = internal.fixed
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Limits the number of calls to a resource to a maximum amount in some interval.
|
|
3
|
+
*
|
|
4
|
+
* @since 2.0.0
|
|
5
|
+
*/
|
|
6
|
+
import type { DurationInput } from "./Duration.js"
|
|
7
|
+
import type { Effect } from "./Effect.js"
|
|
8
|
+
import * as internal from "./internal/rateLimiter.js"
|
|
9
|
+
import type { Scope } from "./Scope.js"
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Limits the number of calls to a resource to a maximum amount in some interval.
|
|
13
|
+
*
|
|
14
|
+
* Note that only the moment of starting the effect is rate limited: the number
|
|
15
|
+
* of concurrent executions is not bounded.
|
|
16
|
+
*
|
|
17
|
+
* @since 2.0.0
|
|
18
|
+
* @category models
|
|
19
|
+
*/
|
|
20
|
+
export interface RateLimiter {
|
|
21
|
+
<A, E, R>(task: Effect<A, E, R>): Effect<A, E, R>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @since 2.0.0
|
|
26
|
+
*/
|
|
27
|
+
export declare namespace RateLimiter {
|
|
28
|
+
/**
|
|
29
|
+
* @since 2.0.0
|
|
30
|
+
* @category models
|
|
31
|
+
*/
|
|
32
|
+
export interface Options {
|
|
33
|
+
/**
|
|
34
|
+
* The maximum number of requests that should be allowed.
|
|
35
|
+
*/
|
|
36
|
+
readonly limit: number
|
|
37
|
+
/**
|
|
38
|
+
* The interval to utilize for rate-limiting requests. The semantics of the
|
|
39
|
+
* specified `interval` vary depending on the chosen `algorithm`:
|
|
40
|
+
*
|
|
41
|
+
* `token-bucket`: The maximum number of requests will be spread out over
|
|
42
|
+
* the provided interval if no tokens are available.
|
|
43
|
+
*
|
|
44
|
+
* For example, for a `RateLimiter` using the `token-bucket` algorithm with
|
|
45
|
+
* a `limit` of `10` and an `interval` of `1 seconds`, `1` request can be
|
|
46
|
+
* made every `100 millis`.
|
|
47
|
+
*
|
|
48
|
+
* `fixed-window`: The maximum number of requests will be reset during each
|
|
49
|
+
* interval. For example, for a `RateLimiter` using the `fixed-window`
|
|
50
|
+
* algorithm with a `limit` of `10` and an `interval` of `1 seconds`, a
|
|
51
|
+
* maximum of `10` requests can be made each second.
|
|
52
|
+
*/
|
|
53
|
+
readonly interval: DurationInput
|
|
54
|
+
/**
|
|
55
|
+
* The algorithm to utilize for rate-limiting requests.
|
|
56
|
+
*
|
|
57
|
+
* Defaults to `token-bucket`.
|
|
58
|
+
*/
|
|
59
|
+
readonly algorithm?: "fixed-window" | "token-bucket"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Constructs a new `RateLimiter` which will utilize the specified algorithm
|
|
65
|
+
* to limit requests (defaults to `token-bucket`).
|
|
66
|
+
*
|
|
67
|
+
* Notes
|
|
68
|
+
* - Only the moment of starting the effect is rate limited. The number of concurrent executions is not bounded.
|
|
69
|
+
* - Instances of `RateLimiter` can be composed.
|
|
70
|
+
* - The "cost" per effect can be changed. See {@link withCost}
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```ts
|
|
74
|
+
* import { Effect, RateLimiter } from "effect";
|
|
75
|
+
* import { compose } from "effect/Function"
|
|
76
|
+
*
|
|
77
|
+
* const program = Effect.scoped(
|
|
78
|
+
* Effect.gen(function* ($) {
|
|
79
|
+
* const perMinuteRL = yield* $(RateLimiter.make({ limit: 30, interval: "1 minutes" }))
|
|
80
|
+
* const perSecondRL = yield* $(RateLimiter.make({ limit: 2, interval: "1 seconds" }))
|
|
81
|
+
*
|
|
82
|
+
* // This rate limiter respects both the 30 calls per minute
|
|
83
|
+
* // and the 2 calls per second constraints.
|
|
84
|
+
* const rateLimit = compose(perMinuteRL, perSecondRL)
|
|
85
|
+
*
|
|
86
|
+
* // simulate repeated calls
|
|
87
|
+
* for (let n = 0; n < 100; n++) {
|
|
88
|
+
* // wrap the effect we want to limit with rateLimit
|
|
89
|
+
* yield* $(rateLimit(Effect.log("Calling RateLimited Effect")));
|
|
90
|
+
* }
|
|
91
|
+
* })
|
|
92
|
+
* );
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @since 2.0.0
|
|
96
|
+
* @category constructors
|
|
97
|
+
*/
|
|
98
|
+
export const make: (options: RateLimiter.Options) => Effect<RateLimiter, never, Scope> = internal.make
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Alters the per-effect cost of the rate-limiter.
|
|
102
|
+
*
|
|
103
|
+
* This can be used for "credit" based rate-limiting where different API endpoints
|
|
104
|
+
* cost a different number of credits within a time window.
|
|
105
|
+
* Eg: 1000 credits / hour, where a query costs 1 credit and a mutation costs 5 credits.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```ts
|
|
109
|
+
* import { Effect, RateLimiter } from "effect";
|
|
110
|
+
* import { compose } from "effect/Function";
|
|
111
|
+
*
|
|
112
|
+
* const program = Effect.scoped(
|
|
113
|
+
* Effect.gen(function* ($) {
|
|
114
|
+
* // Create a rate limiter that has an hourly limit of 1000 credits
|
|
115
|
+
* const rateLimiter = yield* $(RateLimiter.make({ limit: 1000, interval: "1 hours" }));
|
|
116
|
+
* // Query API costs 1 credit per call ( 1 is the default cost )
|
|
117
|
+
* const queryAPIRL = compose(rateLimiter, RateLimiter.withCost(1));
|
|
118
|
+
* // Mutation API costs 5 credits per call
|
|
119
|
+
* const mutationAPIRL = compose(rateLimiter, RateLimiter.withCost(5));
|
|
120
|
+
|
|
121
|
+
* // Use the pre-defined rate limiters
|
|
122
|
+
* yield* $(queryAPIRL(Effect.log("Sample Query")));
|
|
123
|
+
* yield* $(mutationAPIRL(Effect.log("Sample Mutation")));
|
|
124
|
+
*
|
|
125
|
+
* // Or set a cost on-the-fly
|
|
126
|
+
* yield* $(
|
|
127
|
+
* rateLimiter(Effect.log("Another query with a different cost")).pipe(
|
|
128
|
+
* RateLimiter.withCost(3)
|
|
129
|
+
* )
|
|
130
|
+
* );
|
|
131
|
+
* })
|
|
132
|
+
* );
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @since 2.0.0
|
|
136
|
+
* @category combinators
|
|
137
|
+
*/
|
|
138
|
+
export const withCost: (cost: number) => <A, E, R>(effect: Effect<A, E, R>) => Effect<A, E, R> = internal.withCost
|
package/src/RcMap.ts
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 3.5.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Cause from "./Cause.js"
|
|
5
|
+
import type * as Duration from "./Duration.js"
|
|
6
|
+
import type * as Effect from "./Effect.js"
|
|
7
|
+
import * as internal from "./internal/rcMap.js"
|
|
8
|
+
import { type Pipeable } from "./Pipeable.js"
|
|
9
|
+
import type * as Scope from "./Scope.js"
|
|
10
|
+
import type * as Types from "./Types.js"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @since 3.5.0
|
|
14
|
+
* @category type ids
|
|
15
|
+
*/
|
|
16
|
+
export const TypeId: unique symbol = internal.TypeId
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @since 3.5.0
|
|
20
|
+
* @category type ids
|
|
21
|
+
*/
|
|
22
|
+
export type TypeId = typeof TypeId
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @since 3.5.0
|
|
26
|
+
* @category models
|
|
27
|
+
*/
|
|
28
|
+
export interface RcMap<in K, out A, out E = never> extends Pipeable {
|
|
29
|
+
readonly [TypeId]: RcMap.Variance<K, A, E>
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @since 3.5.0
|
|
34
|
+
* @category models
|
|
35
|
+
*/
|
|
36
|
+
export declare namespace RcMap {
|
|
37
|
+
/**
|
|
38
|
+
* @since 3.5.0
|
|
39
|
+
* @category models
|
|
40
|
+
*/
|
|
41
|
+
export interface Variance<K, A, E> {
|
|
42
|
+
readonly _K: Types.Contravariant<K>
|
|
43
|
+
readonly _A: Types.Covariant<A>
|
|
44
|
+
readonly _E: Types.Covariant<E>
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* An `RcMap` can contain multiple reference counted resources that can be indexed
|
|
50
|
+
* by a key. The resources are lazily acquired on the first call to `get` and
|
|
51
|
+
* released when the last reference is released.
|
|
52
|
+
*
|
|
53
|
+
* Complex keys can extend `Equal` and `Hash` to allow lookups by value.
|
|
54
|
+
*
|
|
55
|
+
* **Options**
|
|
56
|
+
*
|
|
57
|
+
* - `capacity`: The maximum number of resources that can be held in the map.
|
|
58
|
+
* - `idleTimeToLive`: When the reference count reaches zero, the resource will be released after this duration.
|
|
59
|
+
*
|
|
60
|
+
* @since 3.5.0
|
|
61
|
+
* @category models
|
|
62
|
+
* @example
|
|
63
|
+
* ```ts
|
|
64
|
+
* import { Effect, RcMap } from "effect"
|
|
65
|
+
*
|
|
66
|
+
* Effect.gen(function*() {
|
|
67
|
+
* const map = yield* RcMap.make({
|
|
68
|
+
* lookup: (key: string) =>
|
|
69
|
+
* Effect.acquireRelease(
|
|
70
|
+
* Effect.succeed(`acquired ${key}`),
|
|
71
|
+
* () => Effect.log(`releasing ${key}`)
|
|
72
|
+
* )
|
|
73
|
+
* })
|
|
74
|
+
*
|
|
75
|
+
* // Get "foo" from the map twice, which will only acquire it once.
|
|
76
|
+
* // It will then be released once the scope closes.
|
|
77
|
+
* yield* RcMap.get(map, "foo").pipe(
|
|
78
|
+
* Effect.andThen(RcMap.get(map, "foo")),
|
|
79
|
+
* Effect.scoped
|
|
80
|
+
* )
|
|
81
|
+
* })
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export const make: {
|
|
85
|
+
<K, A, E, R>(
|
|
86
|
+
options: {
|
|
87
|
+
readonly lookup: (key: K) => Effect.Effect<A, E, R>
|
|
88
|
+
readonly idleTimeToLive?: Duration.DurationInput | undefined
|
|
89
|
+
readonly capacity?: undefined
|
|
90
|
+
}
|
|
91
|
+
): Effect.Effect<RcMap<K, A, E>, never, Scope.Scope | R>
|
|
92
|
+
<K, A, E, R>(
|
|
93
|
+
options: {
|
|
94
|
+
readonly lookup: (key: K) => Effect.Effect<A, E, R>
|
|
95
|
+
readonly idleTimeToLive?: Duration.DurationInput | undefined
|
|
96
|
+
readonly capacity: number
|
|
97
|
+
}
|
|
98
|
+
): Effect.Effect<RcMap<K, A, E | Cause.ExceededCapacityException>, never, Scope.Scope | R>
|
|
99
|
+
} = internal.make
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @since 3.5.0
|
|
103
|
+
* @category combinators
|
|
104
|
+
*/
|
|
105
|
+
export const get: {
|
|
106
|
+
<K>(key: K): <A, E>(self: RcMap<K, A, E>) => Effect.Effect<A, E, Scope.Scope>
|
|
107
|
+
<K, A, E>(self: RcMap<K, A, E>, key: K): Effect.Effect<A, E, Scope.Scope>
|
|
108
|
+
} = internal.get
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @since 3.17.7
|
|
112
|
+
* @category combinators
|
|
113
|
+
*/
|
|
114
|
+
export const has: {
|
|
115
|
+
<K>(key: K): <A, E>(self: RcMap<K, A, E>) => Effect.Effect<boolean>
|
|
116
|
+
<K, A, E>(self: RcMap<K, A, E>, key: K): Effect.Effect<boolean>
|
|
117
|
+
} = internal.has
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @since 3.8.0
|
|
121
|
+
* @category combinators
|
|
122
|
+
*/
|
|
123
|
+
export const keys: <K, A, E>(self: RcMap<K, A, E>) => Effect.Effect<Array<K>> = internal.keys
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* @since 3.13.0
|
|
127
|
+
* @category combinators
|
|
128
|
+
*/
|
|
129
|
+
export const invalidate: {
|
|
130
|
+
<K>(key: K): <A, E>(self: RcMap<K, A, E>) => Effect.Effect<void>
|
|
131
|
+
<K, A, E>(self: RcMap<K, A, E>, key: K): Effect.Effect<void>
|
|
132
|
+
} = internal.invalidate
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @since 3.13.0
|
|
136
|
+
* @category combinators
|
|
137
|
+
*/
|
|
138
|
+
export const touch: {
|
|
139
|
+
<K>(key: K): <A, E>(self: RcMap<K, A, E>) => Effect.Effect<void>
|
|
140
|
+
<K, A, E>(self: RcMap<K, A, E>, key: K): Effect.Effect<void>
|
|
141
|
+
} = internal.touch
|
package/src/RcRef.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 3.5.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Duration from "./Duration.js"
|
|
5
|
+
import type * as Effect from "./Effect.js"
|
|
6
|
+
import * as internal from "./internal/rcRef.js"
|
|
7
|
+
import type * as Readable from "./Readable.js"
|
|
8
|
+
import type * as Scope from "./Scope.js"
|
|
9
|
+
import type * as Types from "./Types.js"
|
|
10
|
+
import type * as Unify from "./Unify.js"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @since 3.5.0
|
|
14
|
+
* @category type ids
|
|
15
|
+
*/
|
|
16
|
+
export const TypeId: unique symbol = internal.TypeId
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @since 3.5.0
|
|
20
|
+
* @category type ids
|
|
21
|
+
*/
|
|
22
|
+
export type TypeId = typeof TypeId
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @since 3.5.0
|
|
26
|
+
* @category models
|
|
27
|
+
*/
|
|
28
|
+
export interface RcRef<out A, out E = never>
|
|
29
|
+
extends Effect.Effect<A, E, Scope.Scope>, Readable.Readable<A, E, Scope.Scope>
|
|
30
|
+
{
|
|
31
|
+
readonly [TypeId]: RcRef.Variance<A, E>
|
|
32
|
+
readonly [Unify.typeSymbol]?: unknown
|
|
33
|
+
readonly [Unify.unifySymbol]?: RcRefUnify<this>
|
|
34
|
+
readonly [Unify.ignoreSymbol]?: RcRefUnifyIgnore
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @category models
|
|
39
|
+
* @since 3.8.0
|
|
40
|
+
*/
|
|
41
|
+
export interface RcRefUnify<A extends { [Unify.typeSymbol]?: any }> extends Effect.EffectUnify<A> {
|
|
42
|
+
RcRef?: () => A[Unify.typeSymbol] extends RcRef<infer A0, infer E0> | infer _ ? RcRef<A0, E0>
|
|
43
|
+
: never
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @category models
|
|
48
|
+
* @since 3.8.0
|
|
49
|
+
*/
|
|
50
|
+
export interface RcRefUnifyIgnore extends Effect.EffectUnifyIgnore {
|
|
51
|
+
Effect?: true
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @since 3.5.0
|
|
55
|
+
* @category models
|
|
56
|
+
*/
|
|
57
|
+
export declare namespace RcRef {
|
|
58
|
+
/**
|
|
59
|
+
* @since 3.5.0
|
|
60
|
+
* @category models
|
|
61
|
+
*/
|
|
62
|
+
export interface Variance<A, E> {
|
|
63
|
+
readonly _A: Types.Covariant<A>
|
|
64
|
+
readonly _E: Types.Covariant<E>
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Create an `RcRef` from an acquire `Effect`.
|
|
70
|
+
*
|
|
71
|
+
* An RcRef wraps a reference counted resource that can be acquired and released
|
|
72
|
+
* multiple times.
|
|
73
|
+
*
|
|
74
|
+
* The resource is lazily acquired on the first call to `get` and released when
|
|
75
|
+
* the last reference is released.
|
|
76
|
+
*
|
|
77
|
+
* @since 3.5.0
|
|
78
|
+
* @category constructors
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* import { Effect, RcRef } from "effect"
|
|
82
|
+
*
|
|
83
|
+
* Effect.gen(function*() {
|
|
84
|
+
* const ref = yield* RcRef.make({
|
|
85
|
+
* acquire: Effect.acquireRelease(
|
|
86
|
+
* Effect.succeed("foo"),
|
|
87
|
+
* () => Effect.log("release foo")
|
|
88
|
+
* )
|
|
89
|
+
* })
|
|
90
|
+
*
|
|
91
|
+
* // will only acquire the resource once, and release it
|
|
92
|
+
* // when the scope is closed
|
|
93
|
+
* yield* RcRef.get(ref).pipe(
|
|
94
|
+
* Effect.andThen(RcRef.get(ref)),
|
|
95
|
+
* Effect.scoped
|
|
96
|
+
* )
|
|
97
|
+
* })
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export const make: <A, E, R>(
|
|
101
|
+
options: {
|
|
102
|
+
readonly acquire: Effect.Effect<A, E, R>
|
|
103
|
+
/**
|
|
104
|
+
* When the reference count reaches zero, the resource will be released
|
|
105
|
+
* after this duration.
|
|
106
|
+
*/
|
|
107
|
+
readonly idleTimeToLive?: Duration.DurationInput | undefined
|
|
108
|
+
}
|
|
109
|
+
) => Effect.Effect<RcRef<A, E>, never, R | Scope.Scope> = internal.make
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @since 3.5.0
|
|
113
|
+
* @category combinators
|
|
114
|
+
*/
|
|
115
|
+
export const get: <A, E>(self: RcRef<A, E>) => Effect.Effect<A, E, Scope.Scope> = internal.get
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @since 3.19.6
|
|
119
|
+
* @category combinators
|
|
120
|
+
* @experimental
|
|
121
|
+
*/
|
|
122
|
+
export const invalidate: <A, E>(self: RcRef<A, E>) => Effect.Effect<void> = internal.invalidate
|
package/src/Readable.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type { Effect } from "./Effect.js"
|
|
5
|
+
import { dual } from "./Function.js"
|
|
6
|
+
import * as core from "./internal/core.js"
|
|
7
|
+
import { type Pipeable, pipeArguments } from "./Pipeable.js"
|
|
8
|
+
import { hasProperty } from "./Predicate.js"
|
|
9
|
+
import type { NoInfer } from "./Types.js"
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @since 2.0.0
|
|
13
|
+
* @category type ids
|
|
14
|
+
*/
|
|
15
|
+
export const TypeId: unique symbol = Symbol.for("effect/Readable")
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @since 2.0.0
|
|
19
|
+
* @category type ids
|
|
20
|
+
*/
|
|
21
|
+
export type TypeId = typeof TypeId
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @since 2.0.0
|
|
25
|
+
* @category models
|
|
26
|
+
*/
|
|
27
|
+
export interface Readable<A, E = never, R = never> extends Pipeable {
|
|
28
|
+
readonly [TypeId]: TypeId
|
|
29
|
+
readonly get: Effect<A, E, R>
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @since 2.0.0
|
|
34
|
+
* @category refinements
|
|
35
|
+
*/
|
|
36
|
+
export const isReadable = (u: unknown): u is Readable<unknown, unknown, unknown> => hasProperty(u, TypeId)
|
|
37
|
+
|
|
38
|
+
const Proto: Omit<Readable<any>, "get"> = {
|
|
39
|
+
[TypeId]: TypeId,
|
|
40
|
+
pipe() {
|
|
41
|
+
return pipeArguments(this, arguments)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @since 2.0.0
|
|
47
|
+
* @category constructors
|
|
48
|
+
*/
|
|
49
|
+
export const make = <A, E, R>(get: Effect<A, E, R>): Readable<A, E, R> => {
|
|
50
|
+
const self = Object.create(Proto)
|
|
51
|
+
self.get = get
|
|
52
|
+
return self
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @since 2.0.0
|
|
57
|
+
* @category combinators
|
|
58
|
+
*/
|
|
59
|
+
export const map: {
|
|
60
|
+
<A, B>(f: (a: NoInfer<A>) => B): <E, R>(fa: Readable<A, E, R>) => Readable<B, E, R>
|
|
61
|
+
<A, E, R, B>(self: Readable<A, E, R>, f: (a: NoInfer<A>) => B): Readable<B, E, R>
|
|
62
|
+
} = dual(
|
|
63
|
+
2,
|
|
64
|
+
<A, E, R, B>(self: Readable<A, E, R>, f: (a: NoInfer<A>) => B): Readable<B, E, R> => make(core.map(self.get, f))
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @since 2.0.0
|
|
69
|
+
* @category combinators
|
|
70
|
+
*/
|
|
71
|
+
export const mapEffect: {
|
|
72
|
+
<A, B, E2, R2>(
|
|
73
|
+
f: (a: NoInfer<A>) => Effect<B, E2, R2>
|
|
74
|
+
): <E, R>(fa: Readable<A, E, R>) => Readable<B, E | E2, R | R2>
|
|
75
|
+
<A, E, R, B, E2, R2>(
|
|
76
|
+
self: Readable<A, E, R>,
|
|
77
|
+
f: (a: NoInfer<A>) => Effect<B, E2, R2>
|
|
78
|
+
): Readable<B, E | E2, R | R2>
|
|
79
|
+
} = dual(2, <A, E, R, B, E2, R2>(
|
|
80
|
+
self: Readable<A, E, R>,
|
|
81
|
+
f: (a: NoInfer<A>) => Effect<B, E2, R2>
|
|
82
|
+
): Readable<B, E | E2, R | R2> => make(core.flatMap(self.get, f)))
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @since 2.0.0
|
|
86
|
+
* @category constructors
|
|
87
|
+
*/
|
|
88
|
+
export const unwrap = <A, E, R, E1, R1>(
|
|
89
|
+
effect: Effect<Readable<A, E, R>, E1, R1>
|
|
90
|
+
): Readable<A, E | E1, R | R1> =>
|
|
91
|
+
make(
|
|
92
|
+
core.flatMap(effect, (s) => s.get)
|
|
93
|
+
)
|