@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,72 @@
|
|
|
1
|
+
import { dual } from "../../Function.js"
|
|
2
|
+
import type * as MergeStrategy from "../../MergeStrategy.js"
|
|
3
|
+
import { hasProperty } from "../../Predicate.js"
|
|
4
|
+
import * as OpCodes from "../opCodes/channelMergeStrategy.js"
|
|
5
|
+
|
|
6
|
+
/** @internal */
|
|
7
|
+
const MergeStrategySymbolKey = "effect/ChannelMergeStrategy"
|
|
8
|
+
|
|
9
|
+
/** @internal */
|
|
10
|
+
export const MergeStrategyTypeId: MergeStrategy.MergeStrategyTypeId = Symbol.for(
|
|
11
|
+
MergeStrategySymbolKey
|
|
12
|
+
) as MergeStrategy.MergeStrategyTypeId
|
|
13
|
+
|
|
14
|
+
/** @internal */
|
|
15
|
+
const proto = {
|
|
16
|
+
[MergeStrategyTypeId]: MergeStrategyTypeId
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** @internal */
|
|
20
|
+
export const BackPressure = (_: void): MergeStrategy.MergeStrategy => {
|
|
21
|
+
const op = Object.create(proto)
|
|
22
|
+
op._tag = OpCodes.OP_BACK_PRESSURE
|
|
23
|
+
return op
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** @internal */
|
|
27
|
+
export const BufferSliding = (_: void): MergeStrategy.MergeStrategy => {
|
|
28
|
+
const op = Object.create(proto)
|
|
29
|
+
op._tag = OpCodes.OP_BUFFER_SLIDING
|
|
30
|
+
return op
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** @internal */
|
|
34
|
+
export const isMergeStrategy = (u: unknown): u is MergeStrategy.MergeStrategy => hasProperty(u, MergeStrategyTypeId)
|
|
35
|
+
|
|
36
|
+
/** @internal */
|
|
37
|
+
export const isBackPressure = (self: MergeStrategy.MergeStrategy): self is MergeStrategy.BackPressure =>
|
|
38
|
+
self._tag === OpCodes.OP_BACK_PRESSURE
|
|
39
|
+
|
|
40
|
+
/** @internal */
|
|
41
|
+
export const isBufferSliding = (self: MergeStrategy.MergeStrategy): self is MergeStrategy.BufferSliding =>
|
|
42
|
+
self._tag === OpCodes.OP_BUFFER_SLIDING
|
|
43
|
+
|
|
44
|
+
/** @internal */
|
|
45
|
+
export const match = dual<
|
|
46
|
+
<A>(options: {
|
|
47
|
+
readonly onBackPressure: () => A
|
|
48
|
+
readonly onBufferSliding: () => A
|
|
49
|
+
}) => (self: MergeStrategy.MergeStrategy) => A,
|
|
50
|
+
<A>(
|
|
51
|
+
self: MergeStrategy.MergeStrategy,
|
|
52
|
+
options: {
|
|
53
|
+
readonly onBackPressure: () => A
|
|
54
|
+
readonly onBufferSliding: () => A
|
|
55
|
+
}
|
|
56
|
+
) => A
|
|
57
|
+
>(2, <A>(
|
|
58
|
+
self: MergeStrategy.MergeStrategy,
|
|
59
|
+
{ onBackPressure, onBufferSliding }: {
|
|
60
|
+
readonly onBackPressure: () => A
|
|
61
|
+
readonly onBufferSliding: () => A
|
|
62
|
+
}
|
|
63
|
+
): A => {
|
|
64
|
+
switch (self._tag) {
|
|
65
|
+
case OpCodes.OP_BACK_PRESSURE: {
|
|
66
|
+
return onBackPressure()
|
|
67
|
+
}
|
|
68
|
+
case OpCodes.OP_BUFFER_SLIDING: {
|
|
69
|
+
return onBufferSliding()
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
})
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import * as Cause from "../../Cause.js"
|
|
2
|
+
import * as Deferred from "../../Deferred.js"
|
|
3
|
+
import * as Effect from "../../Effect.js"
|
|
4
|
+
import * as Either from "../../Either.js"
|
|
5
|
+
import * as Exit from "../../Exit.js"
|
|
6
|
+
import { pipe } from "../../Function.js"
|
|
7
|
+
import * as Ref from "../../Ref.js"
|
|
8
|
+
import type * as SingleProducerAsyncInput from "../../SingleProducerAsyncInput.js"
|
|
9
|
+
|
|
10
|
+
/** @internal */
|
|
11
|
+
type State<Err, Elem, _Done> =
|
|
12
|
+
| Empty
|
|
13
|
+
| Emit<Err, Elem, _Done>
|
|
14
|
+
| Error<Err>
|
|
15
|
+
| Done<_Done>
|
|
16
|
+
|
|
17
|
+
/** @internal */
|
|
18
|
+
const OP_STATE_EMPTY = "Empty" as const
|
|
19
|
+
|
|
20
|
+
/** @internal */
|
|
21
|
+
type OP_STATE_EMPTY = typeof OP_STATE_EMPTY
|
|
22
|
+
|
|
23
|
+
/** @internal */
|
|
24
|
+
const OP_STATE_EMIT = "Emit" as const
|
|
25
|
+
|
|
26
|
+
/** @internal */
|
|
27
|
+
type OP_STATE_EMIT = typeof OP_STATE_EMIT
|
|
28
|
+
|
|
29
|
+
/** @internal */
|
|
30
|
+
const OP_STATE_ERROR = "Error" as const
|
|
31
|
+
|
|
32
|
+
/** @internal */
|
|
33
|
+
type OP_STATE_ERROR = typeof OP_STATE_ERROR
|
|
34
|
+
|
|
35
|
+
/** @internal */
|
|
36
|
+
const OP_STATE_DONE = "Done" as const
|
|
37
|
+
|
|
38
|
+
/** @internal */
|
|
39
|
+
type OP_STATE_DONE = typeof OP_STATE_DONE
|
|
40
|
+
|
|
41
|
+
/** @internal */
|
|
42
|
+
interface Empty {
|
|
43
|
+
readonly _tag: OP_STATE_EMPTY
|
|
44
|
+
readonly notifyProducer: Deferred.Deferred<void>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** @internal */
|
|
48
|
+
interface Emit<Err, Elem, Done> {
|
|
49
|
+
readonly _tag: OP_STATE_EMIT
|
|
50
|
+
readonly notifyConsumers: ReadonlyArray<Deferred.Deferred<Either.Either<Elem, Done>, Err>>
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** @internal */
|
|
54
|
+
interface Error<Err> {
|
|
55
|
+
readonly _tag: OP_STATE_ERROR
|
|
56
|
+
readonly cause: Cause.Cause<Err>
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** @internal */
|
|
60
|
+
interface Done<_Done> {
|
|
61
|
+
readonly _tag: OP_STATE_DONE
|
|
62
|
+
readonly done: _Done
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** @internal */
|
|
66
|
+
const stateEmpty = (notifyProducer: Deferred.Deferred<void>): State<never, never, never> => ({
|
|
67
|
+
_tag: OP_STATE_EMPTY,
|
|
68
|
+
notifyProducer
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
/** @internal */
|
|
72
|
+
const stateEmit = <Err, Elem, Done>(
|
|
73
|
+
notifyConsumers: ReadonlyArray<Deferred.Deferred<Either.Either<Elem, Done>, Err>>
|
|
74
|
+
): State<Err, Elem, Done> => ({
|
|
75
|
+
_tag: OP_STATE_EMIT,
|
|
76
|
+
notifyConsumers
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
/** @internal */
|
|
80
|
+
const stateError = <Err>(cause: Cause.Cause<Err>): State<Err, never, never> => ({
|
|
81
|
+
_tag: OP_STATE_ERROR,
|
|
82
|
+
cause
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
/** @internal */
|
|
86
|
+
const stateDone = <Done>(done: Done): State<never, never, Done> => ({
|
|
87
|
+
_tag: OP_STATE_DONE,
|
|
88
|
+
done
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
/** @internal */
|
|
92
|
+
class SingleProducerAsyncInputImpl<in out Err, in out Elem, in out Done>
|
|
93
|
+
implements SingleProducerAsyncInput.SingleProducerAsyncInput<Err, Elem, Done>
|
|
94
|
+
{
|
|
95
|
+
constructor(readonly ref: Ref.Ref<State<Err, Elem, Done>>) {
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
awaitRead(): Effect.Effect<unknown> {
|
|
99
|
+
return Effect.flatten(
|
|
100
|
+
Ref.modify(this.ref, (state) =>
|
|
101
|
+
state._tag === OP_STATE_EMPTY ?
|
|
102
|
+
[Deferred.await(state.notifyProducer), state as State<Err, Elem, Done>] :
|
|
103
|
+
[Effect.void, state])
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
get close(): Effect.Effect<unknown> {
|
|
108
|
+
return Effect.fiberIdWith((fiberId) => this.error(Cause.interrupt(fiberId)))
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
done(value: Done): Effect.Effect<unknown> {
|
|
112
|
+
return Effect.flatten(
|
|
113
|
+
Ref.modify(this.ref, (state) => {
|
|
114
|
+
switch (state._tag) {
|
|
115
|
+
case OP_STATE_EMPTY: {
|
|
116
|
+
return [Deferred.await(state.notifyProducer), state]
|
|
117
|
+
}
|
|
118
|
+
case OP_STATE_EMIT: {
|
|
119
|
+
return [
|
|
120
|
+
Effect.forEach(
|
|
121
|
+
state.notifyConsumers,
|
|
122
|
+
(deferred) => Deferred.succeed(deferred, Either.left(value)),
|
|
123
|
+
{ discard: true }
|
|
124
|
+
),
|
|
125
|
+
stateDone(value) as State<Err, Elem, Done>
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
case OP_STATE_ERROR: {
|
|
129
|
+
return [Effect.interrupt, state]
|
|
130
|
+
}
|
|
131
|
+
case OP_STATE_DONE: {
|
|
132
|
+
return [Effect.interrupt, state]
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
emit(element: Elem): Effect.Effect<unknown> {
|
|
140
|
+
return Effect.flatMap(Deferred.make<void>(), (deferred) =>
|
|
141
|
+
Effect.flatten(
|
|
142
|
+
Ref.modify(this.ref, (state) => {
|
|
143
|
+
switch (state._tag) {
|
|
144
|
+
case OP_STATE_EMPTY: {
|
|
145
|
+
return [Deferred.await(state.notifyProducer), state]
|
|
146
|
+
}
|
|
147
|
+
case OP_STATE_EMIT: {
|
|
148
|
+
const notifyConsumer = state.notifyConsumers[0]
|
|
149
|
+
const notifyConsumers = state.notifyConsumers.slice(1)
|
|
150
|
+
if (notifyConsumer !== undefined) {
|
|
151
|
+
return [
|
|
152
|
+
Deferred.succeed(notifyConsumer, Either.right(element)),
|
|
153
|
+
(notifyConsumers.length === 0 ?
|
|
154
|
+
stateEmpty(deferred) :
|
|
155
|
+
stateEmit(notifyConsumers)) as State<Err, Elem, Done>
|
|
156
|
+
]
|
|
157
|
+
}
|
|
158
|
+
throw new Error(
|
|
159
|
+
"Bug: Channel.SingleProducerAsyncInput.emit - Queue was empty! please report an issue at https://github.com/Effect-TS/effect/issues"
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
case OP_STATE_ERROR: {
|
|
163
|
+
return [Effect.interrupt, state]
|
|
164
|
+
}
|
|
165
|
+
case OP_STATE_DONE: {
|
|
166
|
+
return [Effect.interrupt, state]
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
))
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
error(cause: Cause.Cause<Err>): Effect.Effect<unknown> {
|
|
174
|
+
return Effect.flatten(
|
|
175
|
+
Ref.modify(this.ref, (state) => {
|
|
176
|
+
switch (state._tag) {
|
|
177
|
+
case OP_STATE_EMPTY: {
|
|
178
|
+
return [Deferred.await(state.notifyProducer), state]
|
|
179
|
+
}
|
|
180
|
+
case OP_STATE_EMIT: {
|
|
181
|
+
return [
|
|
182
|
+
Effect.forEach(
|
|
183
|
+
state.notifyConsumers,
|
|
184
|
+
(deferred) => Deferred.failCause(deferred, cause),
|
|
185
|
+
{ discard: true }
|
|
186
|
+
),
|
|
187
|
+
stateError(cause) as State<Err, Elem, Done>
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
case OP_STATE_ERROR: {
|
|
191
|
+
return [Effect.interrupt, state]
|
|
192
|
+
}
|
|
193
|
+
case OP_STATE_DONE: {
|
|
194
|
+
return [Effect.interrupt, state]
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
})
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
get take(): Effect.Effect<Exit.Exit<Elem, Either.Either<Done, Err>>> {
|
|
202
|
+
return this.takeWith(
|
|
203
|
+
(cause) => Exit.failCause(Cause.map(cause, Either.left)),
|
|
204
|
+
(elem) => Exit.succeed(elem) as Exit.Exit<Elem, Either.Either<Done, Err>>,
|
|
205
|
+
(done) => Exit.fail(Either.right(done))
|
|
206
|
+
)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
takeWith<A>(
|
|
210
|
+
onError: (cause: Cause.Cause<Err>) => A,
|
|
211
|
+
onElement: (element: Elem) => A,
|
|
212
|
+
onDone: (value: Done) => A
|
|
213
|
+
): Effect.Effect<A> {
|
|
214
|
+
return Effect.flatMap(Deferred.make<Either.Either<Elem, Done>, Err>(), (deferred) =>
|
|
215
|
+
Effect.flatten(
|
|
216
|
+
Ref.modify(this.ref, (state) => {
|
|
217
|
+
switch (state._tag) {
|
|
218
|
+
case OP_STATE_EMPTY: {
|
|
219
|
+
return [
|
|
220
|
+
Effect.zipRight(
|
|
221
|
+
Deferred.succeed(state.notifyProducer, void 0),
|
|
222
|
+
Effect.matchCause(Deferred.await(deferred), {
|
|
223
|
+
onFailure: onError,
|
|
224
|
+
onSuccess: Either.match({ onLeft: onDone, onRight: onElement })
|
|
225
|
+
})
|
|
226
|
+
),
|
|
227
|
+
stateEmit([deferred])
|
|
228
|
+
]
|
|
229
|
+
}
|
|
230
|
+
case OP_STATE_EMIT: {
|
|
231
|
+
return [
|
|
232
|
+
Effect.matchCause(Deferred.await(deferred), {
|
|
233
|
+
onFailure: onError,
|
|
234
|
+
onSuccess: Either.match({ onLeft: onDone, onRight: onElement })
|
|
235
|
+
}),
|
|
236
|
+
stateEmit([...state.notifyConsumers, deferred])
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
case OP_STATE_ERROR: {
|
|
240
|
+
return [Effect.succeed(onError(state.cause)), state]
|
|
241
|
+
}
|
|
242
|
+
case OP_STATE_DONE: {
|
|
243
|
+
return [Effect.succeed(onDone(state.done)), state]
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
})
|
|
247
|
+
))
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** @internal */
|
|
252
|
+
export const make = <Err, Elem, Done>(): Effect.Effect<
|
|
253
|
+
SingleProducerAsyncInput.SingleProducerAsyncInput<Err, Elem, Done>
|
|
254
|
+
> =>
|
|
255
|
+
pipe(
|
|
256
|
+
Deferred.make<void>(),
|
|
257
|
+
Effect.flatMap((deferred) => Ref.make(stateEmpty(deferred) as State<Err, Elem, Done>)),
|
|
258
|
+
Effect.map((ref) => new SingleProducerAsyncInputImpl(ref))
|
|
259
|
+
)
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import type * as ChildExecutorDecision from "../../ChildExecutorDecision.js"
|
|
2
|
+
import * as Effect from "../../Effect.js"
|
|
3
|
+
import * as Exit from "../../Exit.js"
|
|
4
|
+
import { pipe } from "../../Function.js"
|
|
5
|
+
import type * as UpstreamPullRequest from "../../UpstreamPullRequest.js"
|
|
6
|
+
import type * as UpstreamPullStrategy from "../../UpstreamPullStrategy.js"
|
|
7
|
+
import type { ErasedChannel, ErasedExecutor } from "./channelExecutor.js"
|
|
8
|
+
|
|
9
|
+
/** @internal */
|
|
10
|
+
export interface Subexecutor<in out R> {
|
|
11
|
+
close(exit: Exit.Exit<unknown, unknown>): Effect.Effect<unknown, never, R> | undefined
|
|
12
|
+
enqueuePullFromChild(child: PullFromChild<R>): Subexecutor<R>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** @internal */
|
|
16
|
+
export type Primitive<Env> = PullFromChild<Env> | PullFromUpstream<Env> | DrainChildExecutors<Env> | Emit<Env>
|
|
17
|
+
|
|
18
|
+
/** @internal */
|
|
19
|
+
export const OP_PULL_FROM_CHILD = "PullFromChild" as const
|
|
20
|
+
|
|
21
|
+
/** @internal */
|
|
22
|
+
export type OP_PULL_FROM_CHILD = typeof OP_PULL_FROM_CHILD
|
|
23
|
+
|
|
24
|
+
/** @internal */
|
|
25
|
+
export const OP_PULL_FROM_UPSTREAM = "PullFromUpstream" as const
|
|
26
|
+
|
|
27
|
+
/** @internal */
|
|
28
|
+
export type OP_PULL_FROM_UPSTREAM = typeof OP_PULL_FROM_UPSTREAM
|
|
29
|
+
|
|
30
|
+
/** @internal */
|
|
31
|
+
export const OP_DRAIN_CHILD_EXECUTORS = "DrainChildExecutors" as const
|
|
32
|
+
|
|
33
|
+
/** @internal */
|
|
34
|
+
export type OP_DRAIN_CHILD_EXECUTORS = typeof OP_DRAIN_CHILD_EXECUTORS
|
|
35
|
+
|
|
36
|
+
/** @internal */
|
|
37
|
+
export const OP_EMIT = "Emit" as const
|
|
38
|
+
|
|
39
|
+
/** @internal */
|
|
40
|
+
export type OP_EMIT = typeof OP_EMIT
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Execute the `childExecutor` and on each emitted value, decide what to do by
|
|
44
|
+
* `onEmit`.
|
|
45
|
+
*
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
export class PullFromChild<in out R> implements Subexecutor<R> {
|
|
49
|
+
readonly _tag: OP_PULL_FROM_CHILD = OP_PULL_FROM_CHILD
|
|
50
|
+
|
|
51
|
+
constructor(
|
|
52
|
+
readonly childExecutor: ErasedExecutor<R>,
|
|
53
|
+
readonly parentSubexecutor: Subexecutor<R>,
|
|
54
|
+
readonly onEmit: (value: unknown) => ChildExecutorDecision.ChildExecutorDecision
|
|
55
|
+
) {
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
close(exit: Exit.Exit<unknown, unknown>): Effect.Effect<unknown, never, R> | undefined {
|
|
59
|
+
const fin1 = this.childExecutor.close(exit)
|
|
60
|
+
const fin2 = this.parentSubexecutor.close(exit)
|
|
61
|
+
if (fin1 !== undefined && fin2 !== undefined) {
|
|
62
|
+
return Effect.zipWith(
|
|
63
|
+
Effect.exit(fin1),
|
|
64
|
+
Effect.exit(fin2),
|
|
65
|
+
(exit1, exit2) => pipe(exit1, Exit.zipRight(exit2))
|
|
66
|
+
)
|
|
67
|
+
} else if (fin1 !== undefined) {
|
|
68
|
+
return fin1
|
|
69
|
+
} else if (fin2 !== undefined) {
|
|
70
|
+
return fin2
|
|
71
|
+
} else {
|
|
72
|
+
return undefined
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
enqueuePullFromChild(_child: PullFromChild<R>): Subexecutor<R> {
|
|
77
|
+
return this
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Execute `upstreamExecutor` and for each emitted element, spawn a child
|
|
83
|
+
* channel and continue with processing it by `PullFromChild`.
|
|
84
|
+
*
|
|
85
|
+
* @internal
|
|
86
|
+
*/
|
|
87
|
+
export class PullFromUpstream<in out R> implements Subexecutor<R> {
|
|
88
|
+
readonly _tag: OP_PULL_FROM_UPSTREAM = OP_PULL_FROM_UPSTREAM
|
|
89
|
+
|
|
90
|
+
constructor(
|
|
91
|
+
readonly upstreamExecutor: ErasedExecutor<R>,
|
|
92
|
+
readonly createChild: (value: unknown) => ErasedChannel<R>,
|
|
93
|
+
readonly lastDone: unknown,
|
|
94
|
+
readonly activeChildExecutors: ReadonlyArray<PullFromChild<R> | undefined>,
|
|
95
|
+
readonly combineChildResults: (x: unknown, y: unknown) => unknown,
|
|
96
|
+
readonly combineWithChildResult: (x: unknown, y: unknown) => unknown,
|
|
97
|
+
readonly onPull: (
|
|
98
|
+
request: UpstreamPullRequest.UpstreamPullRequest<unknown>
|
|
99
|
+
) => UpstreamPullStrategy.UpstreamPullStrategy<unknown>,
|
|
100
|
+
readonly onEmit: (value: unknown) => ChildExecutorDecision.ChildExecutorDecision
|
|
101
|
+
) {
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
close(exit: Exit.Exit<unknown, unknown>): Effect.Effect<unknown, never, R> | undefined {
|
|
105
|
+
const fin1 = this.upstreamExecutor.close(exit)
|
|
106
|
+
const fins = [
|
|
107
|
+
...this.activeChildExecutors.map((child) =>
|
|
108
|
+
child !== undefined ?
|
|
109
|
+
child.childExecutor.close(exit) :
|
|
110
|
+
undefined
|
|
111
|
+
),
|
|
112
|
+
fin1
|
|
113
|
+
]
|
|
114
|
+
const result = fins.reduce(
|
|
115
|
+
(acc: Effect.Effect<Exit.Exit<unknown, unknown>, never, R> | undefined, next) => {
|
|
116
|
+
if (acc !== undefined && next !== undefined) {
|
|
117
|
+
return Effect.zipWith(
|
|
118
|
+
acc,
|
|
119
|
+
Effect.exit(next),
|
|
120
|
+
(exit1, exit2) => Exit.zipRight(exit1, exit2)
|
|
121
|
+
)
|
|
122
|
+
} else if (acc !== undefined) {
|
|
123
|
+
return acc
|
|
124
|
+
} else if (next !== undefined) {
|
|
125
|
+
return Effect.exit(next)
|
|
126
|
+
} else {
|
|
127
|
+
return undefined
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
undefined
|
|
131
|
+
)
|
|
132
|
+
return result === undefined ? result : result
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
enqueuePullFromChild(child: PullFromChild<R>): Subexecutor<R> {
|
|
136
|
+
return new PullFromUpstream(
|
|
137
|
+
this.upstreamExecutor,
|
|
138
|
+
this.createChild,
|
|
139
|
+
this.lastDone,
|
|
140
|
+
[...this.activeChildExecutors, child],
|
|
141
|
+
this.combineChildResults,
|
|
142
|
+
this.combineWithChildResult,
|
|
143
|
+
this.onPull,
|
|
144
|
+
this.onEmit
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Transformed from `PullFromUpstream` when upstream has finished but there
|
|
151
|
+
* are still active child executors.
|
|
152
|
+
*
|
|
153
|
+
* @internal
|
|
154
|
+
*/
|
|
155
|
+
export class DrainChildExecutors<in out R> implements Subexecutor<R> {
|
|
156
|
+
readonly _tag: OP_DRAIN_CHILD_EXECUTORS = OP_DRAIN_CHILD_EXECUTORS
|
|
157
|
+
|
|
158
|
+
constructor(
|
|
159
|
+
readonly upstreamExecutor: ErasedExecutor<R>,
|
|
160
|
+
readonly lastDone: unknown,
|
|
161
|
+
readonly activeChildExecutors: ReadonlyArray<PullFromChild<R> | undefined>,
|
|
162
|
+
readonly upstreamDone: Exit.Exit<unknown, unknown>,
|
|
163
|
+
readonly combineChildResults: (x: unknown, y: unknown) => unknown,
|
|
164
|
+
readonly combineWithChildResult: (x: unknown, y: unknown) => unknown,
|
|
165
|
+
readonly onPull: (
|
|
166
|
+
request: UpstreamPullRequest.UpstreamPullRequest<unknown>
|
|
167
|
+
) => UpstreamPullStrategy.UpstreamPullStrategy<unknown>
|
|
168
|
+
) {
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
close(exit: Exit.Exit<unknown, unknown>): Effect.Effect<unknown, never, R> | undefined {
|
|
172
|
+
const fin1 = this.upstreamExecutor.close(exit)
|
|
173
|
+
const fins = [
|
|
174
|
+
...this.activeChildExecutors.map((child) => (child !== undefined ?
|
|
175
|
+
child.childExecutor.close(exit) :
|
|
176
|
+
undefined)
|
|
177
|
+
),
|
|
178
|
+
fin1
|
|
179
|
+
]
|
|
180
|
+
const result = fins.reduce(
|
|
181
|
+
(acc: Effect.Effect<Exit.Exit<unknown, unknown>, never, R> | undefined, next) => {
|
|
182
|
+
if (acc !== undefined && next !== undefined) {
|
|
183
|
+
return Effect.zipWith(
|
|
184
|
+
acc,
|
|
185
|
+
Effect.exit(next),
|
|
186
|
+
(exit1, exit2) => Exit.zipRight(exit1, exit2)
|
|
187
|
+
)
|
|
188
|
+
} else if (acc !== undefined) {
|
|
189
|
+
return acc
|
|
190
|
+
} else if (next !== undefined) {
|
|
191
|
+
return Effect.exit(next)
|
|
192
|
+
} else {
|
|
193
|
+
return undefined
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
undefined
|
|
197
|
+
)
|
|
198
|
+
return result === undefined ? result : result
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
enqueuePullFromChild(child: PullFromChild<R>): Subexecutor<R> {
|
|
202
|
+
return new DrainChildExecutors(
|
|
203
|
+
this.upstreamExecutor,
|
|
204
|
+
this.lastDone,
|
|
205
|
+
[...this.activeChildExecutors, child],
|
|
206
|
+
this.upstreamDone,
|
|
207
|
+
this.combineChildResults,
|
|
208
|
+
this.combineWithChildResult,
|
|
209
|
+
this.onPull
|
|
210
|
+
)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** @internal */
|
|
215
|
+
export class Emit<in out R> implements Subexecutor<R> {
|
|
216
|
+
readonly _tag: OP_EMIT = OP_EMIT
|
|
217
|
+
|
|
218
|
+
constructor(readonly value: unknown, readonly next: Subexecutor<R>) {
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
close(exit: Exit.Exit<unknown, unknown>): Effect.Effect<unknown, never, R> | undefined {
|
|
222
|
+
const result = this.next.close(exit)
|
|
223
|
+
return result === undefined ? result : result
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
enqueuePullFromChild(_child: PullFromChild<R>): Subexecutor<R> {
|
|
227
|
+
return this
|
|
228
|
+
}
|
|
229
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { dual } from "../../Function.js"
|
|
2
|
+
import { hasProperty } from "../../Predicate.js"
|
|
3
|
+
import type * as UpstreamPullRequest from "../../UpstreamPullRequest.js"
|
|
4
|
+
import * as OpCodes from "../opCodes/channelUpstreamPullRequest.js"
|
|
5
|
+
|
|
6
|
+
/** @internal */
|
|
7
|
+
const UpstreamPullRequestSymbolKey = "effect/ChannelUpstreamPullRequest"
|
|
8
|
+
|
|
9
|
+
/** @internal */
|
|
10
|
+
export const UpstreamPullRequestTypeId: UpstreamPullRequest.UpstreamPullRequestTypeId = Symbol.for(
|
|
11
|
+
UpstreamPullRequestSymbolKey
|
|
12
|
+
) as UpstreamPullRequest.UpstreamPullRequestTypeId
|
|
13
|
+
|
|
14
|
+
const upstreamPullRequestVariance = {
|
|
15
|
+
/* c8 ignore next */
|
|
16
|
+
_A: (_: never) => _
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** @internal */
|
|
20
|
+
const proto = {
|
|
21
|
+
[UpstreamPullRequestTypeId]: upstreamPullRequestVariance
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** @internal */
|
|
25
|
+
export const Pulled = <A>(value: A): UpstreamPullRequest.UpstreamPullRequest<A> => {
|
|
26
|
+
const op = Object.create(proto)
|
|
27
|
+
op._tag = OpCodes.OP_PULLED
|
|
28
|
+
op.value = value
|
|
29
|
+
return op
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** @internal */
|
|
33
|
+
export const NoUpstream = (activeDownstreamCount: number): UpstreamPullRequest.UpstreamPullRequest<never> => {
|
|
34
|
+
const op = Object.create(proto)
|
|
35
|
+
op._tag = OpCodes.OP_NO_UPSTREAM
|
|
36
|
+
op.activeDownstreamCount = activeDownstreamCount
|
|
37
|
+
return op
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** @internal */
|
|
41
|
+
export const isUpstreamPullRequest = (u: unknown): u is UpstreamPullRequest.UpstreamPullRequest<unknown> =>
|
|
42
|
+
hasProperty(u, UpstreamPullRequestTypeId)
|
|
43
|
+
|
|
44
|
+
/** @internal */
|
|
45
|
+
export const isPulled = <A>(
|
|
46
|
+
self: UpstreamPullRequest.UpstreamPullRequest<A>
|
|
47
|
+
): self is UpstreamPullRequest.Pulled<A> => self._tag === OpCodes.OP_PULLED
|
|
48
|
+
|
|
49
|
+
/** @internal */
|
|
50
|
+
export const isNoUpstream = <A>(
|
|
51
|
+
self: UpstreamPullRequest.UpstreamPullRequest<A>
|
|
52
|
+
): self is UpstreamPullRequest.NoUpstream => self._tag === OpCodes.OP_NO_UPSTREAM
|
|
53
|
+
|
|
54
|
+
/** @internal */
|
|
55
|
+
export const match = dual<
|
|
56
|
+
<A, Z>(
|
|
57
|
+
options: {
|
|
58
|
+
readonly onPulled: (value: A) => Z
|
|
59
|
+
readonly onNoUpstream: (activeDownstreamCount: number) => Z
|
|
60
|
+
}
|
|
61
|
+
) => (self: UpstreamPullRequest.UpstreamPullRequest<A>) => Z,
|
|
62
|
+
<A, Z>(
|
|
63
|
+
self: UpstreamPullRequest.UpstreamPullRequest<A>,
|
|
64
|
+
options: {
|
|
65
|
+
readonly onPulled: (value: A) => Z
|
|
66
|
+
readonly onNoUpstream: (activeDownstreamCount: number) => Z
|
|
67
|
+
}
|
|
68
|
+
) => Z
|
|
69
|
+
>(2, <A, Z>(
|
|
70
|
+
self: UpstreamPullRequest.UpstreamPullRequest<A>,
|
|
71
|
+
{ onNoUpstream, onPulled }: {
|
|
72
|
+
readonly onPulled: (value: A) => Z
|
|
73
|
+
readonly onNoUpstream: (activeDownstreamCount: number) => Z
|
|
74
|
+
}
|
|
75
|
+
): Z => {
|
|
76
|
+
switch (self._tag) {
|
|
77
|
+
case OpCodes.OP_PULLED: {
|
|
78
|
+
return onPulled(self.value)
|
|
79
|
+
}
|
|
80
|
+
case OpCodes.OP_NO_UPSTREAM: {
|
|
81
|
+
return onNoUpstream(self.activeDownstreamCount)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
})
|