@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
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as internal from "./internal/schedule/decision.js"
|
|
5
|
+
import type * as Interval from "./ScheduleInterval.js"
|
|
6
|
+
import type * as Intervals from "./ScheduleIntervals.js"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @since 2.0.0
|
|
10
|
+
* @category models
|
|
11
|
+
*/
|
|
12
|
+
export type ScheduleDecision = Continue | Done
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @since 2.0.0
|
|
16
|
+
* @category models
|
|
17
|
+
*/
|
|
18
|
+
export interface Continue {
|
|
19
|
+
readonly _tag: "Continue"
|
|
20
|
+
readonly intervals: Intervals.Intervals
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @since 2.0.0
|
|
25
|
+
* @category models
|
|
26
|
+
*/
|
|
27
|
+
export interface Done {
|
|
28
|
+
readonly _tag: "Done"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const _continue = internal._continue
|
|
32
|
+
export {
|
|
33
|
+
/**
|
|
34
|
+
* @since 2.0.0
|
|
35
|
+
* @category constructors
|
|
36
|
+
*/
|
|
37
|
+
_continue as continue
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @since 2.0.0
|
|
42
|
+
* @category constructors
|
|
43
|
+
*/
|
|
44
|
+
export const continueWith: (interval: Interval.Interval) => ScheduleDecision = internal.continueWith
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @since 2.0.0
|
|
48
|
+
* @category constructors
|
|
49
|
+
*/
|
|
50
|
+
export const done: ScheduleDecision = internal.done
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @since 2.0.0
|
|
54
|
+
* @category refinements
|
|
55
|
+
*/
|
|
56
|
+
export const isContinue: (self: ScheduleDecision) => self is Continue = internal.isContinue
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @since 2.0.0
|
|
60
|
+
* @category refinements
|
|
61
|
+
*/
|
|
62
|
+
export const isDone: (self: ScheduleDecision) => self is Done = internal.isDone
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Duration from "./Duration.js"
|
|
5
|
+
import * as internal from "./internal/schedule/interval.js"
|
|
6
|
+
import type * as Option from "./Option.js"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @since 2.0.0
|
|
10
|
+
* @category symbols
|
|
11
|
+
*/
|
|
12
|
+
export const IntervalTypeId: unique symbol = internal.IntervalTypeId
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @since 2.0.0
|
|
16
|
+
* @category symbols
|
|
17
|
+
*/
|
|
18
|
+
export type IntervalTypeId = typeof IntervalTypeId
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* An `Interval` represents an interval of time. Intervals can encompass all
|
|
22
|
+
* time, or no time at all.
|
|
23
|
+
*
|
|
24
|
+
* @since 2.0.0
|
|
25
|
+
* @category models
|
|
26
|
+
*/
|
|
27
|
+
export interface Interval {
|
|
28
|
+
readonly [IntervalTypeId]: IntervalTypeId
|
|
29
|
+
readonly startMillis: number
|
|
30
|
+
readonly endMillis: number
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Constructs a new interval from the two specified endpoints. If the start
|
|
35
|
+
* endpoint greater than the end endpoint, then a zero size interval will be
|
|
36
|
+
* returned.
|
|
37
|
+
*
|
|
38
|
+
* @since 2.0.0
|
|
39
|
+
* @category constructors
|
|
40
|
+
*/
|
|
41
|
+
export const make: (startMillis: number, endMillis: number) => Interval = internal.make
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* An `Interval` of zero-width.
|
|
45
|
+
*
|
|
46
|
+
* @since 2.0.0
|
|
47
|
+
* @category constructors
|
|
48
|
+
*/
|
|
49
|
+
export const empty: Interval = internal.empty
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Returns `true` if this `Interval` is less than `that` interval, `false`
|
|
53
|
+
* otherwise.
|
|
54
|
+
*
|
|
55
|
+
* @since 2.0.0
|
|
56
|
+
* @category ordering
|
|
57
|
+
*/
|
|
58
|
+
export const lessThan: {
|
|
59
|
+
(that: Interval): (self: Interval) => boolean
|
|
60
|
+
(self: Interval, that: Interval): boolean
|
|
61
|
+
} = internal.lessThan
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Returns the minimum of two `Interval`s.
|
|
65
|
+
*
|
|
66
|
+
* @since 2.0.0
|
|
67
|
+
* @category ordering
|
|
68
|
+
*/
|
|
69
|
+
export const min: {
|
|
70
|
+
(that: Interval): (self: Interval) => Interval
|
|
71
|
+
(self: Interval, that: Interval): Interval
|
|
72
|
+
} = internal.min
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Returns the maximum of two `Interval`s.
|
|
76
|
+
*
|
|
77
|
+
* @since 2.0.0
|
|
78
|
+
* @category ordering
|
|
79
|
+
*/
|
|
80
|
+
export const max: {
|
|
81
|
+
(that: Interval): (self: Interval) => Interval
|
|
82
|
+
(self: Interval, that: Interval): Interval
|
|
83
|
+
} = internal.max
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Returns `true` if the specified `Interval` is empty, `false` otherwise.
|
|
87
|
+
*
|
|
88
|
+
* @since 2.0.0
|
|
89
|
+
* @category ordering
|
|
90
|
+
*/
|
|
91
|
+
export const isEmpty: (self: Interval) => boolean = internal.isEmpty
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Returns `true` if the specified `Interval` is non-empty, `false` otherwise.
|
|
95
|
+
*
|
|
96
|
+
* @since 2.0.0
|
|
97
|
+
* @category ordering
|
|
98
|
+
*/
|
|
99
|
+
export const isNonEmpty: (self: Interval) => boolean = internal.isNonEmpty
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Computes a new `Interval` which is the intersection of this `Interval` and
|
|
103
|
+
* that `Interval`.
|
|
104
|
+
*
|
|
105
|
+
* @since 2.0.0
|
|
106
|
+
* @category ordering
|
|
107
|
+
*/
|
|
108
|
+
export const intersect: {
|
|
109
|
+
(that: Interval): (self: Interval) => Interval
|
|
110
|
+
(self: Interval, that: Interval): Interval
|
|
111
|
+
} = internal.intersect
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Calculates the size of the `Interval` as the `Duration` from the start of the
|
|
115
|
+
* interval to the end of the interval.
|
|
116
|
+
*
|
|
117
|
+
* @since 2.0.0
|
|
118
|
+
* @category getters
|
|
119
|
+
*/
|
|
120
|
+
export const size: (self: Interval) => Duration.Duration = internal.size
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Computes a new `Interval` which is the union of this `Interval` and that
|
|
124
|
+
* `Interval` as a `Some`, otherwise returns `None` if the two intervals cannot
|
|
125
|
+
* form a union.
|
|
126
|
+
*
|
|
127
|
+
* @since 2.0.0
|
|
128
|
+
* @category utils
|
|
129
|
+
*/
|
|
130
|
+
export const union: {
|
|
131
|
+
(that: Interval): (self: Interval) => Option.Option<Interval>
|
|
132
|
+
(self: Interval, that: Interval): Option.Option<Interval>
|
|
133
|
+
} = internal.union
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Construct an `Interval` that includes all time equal to and after the
|
|
137
|
+
* specified start time.
|
|
138
|
+
*
|
|
139
|
+
* @since 2.0.0
|
|
140
|
+
* @category constructors
|
|
141
|
+
*/
|
|
142
|
+
export const after: (startMilliseconds: number) => Interval = internal.after
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Construct an `Interval` that includes all time equal to and before the
|
|
146
|
+
* specified end time.
|
|
147
|
+
*
|
|
148
|
+
* @category constructors
|
|
149
|
+
* @since 2.0.0
|
|
150
|
+
*/
|
|
151
|
+
export const before: (endMilliseconds: number) => Interval = internal.before
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Check from "./Chunk.js"
|
|
5
|
+
import * as internal from "./internal/schedule/intervals.js"
|
|
6
|
+
import type * as Interval from "./ScheduleInterval.js"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @since 2.0.0
|
|
10
|
+
* @category symbols
|
|
11
|
+
*/
|
|
12
|
+
export const IntervalsTypeId: unique symbol = internal.IntervalsTypeId
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @since 2.0.0
|
|
16
|
+
* @category symbols
|
|
17
|
+
*/
|
|
18
|
+
export type IntervalsTypeId = typeof IntervalsTypeId
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* An `Intervals` represents a list of several `Interval`s.
|
|
22
|
+
*
|
|
23
|
+
* @since 2.0.0
|
|
24
|
+
* @category models
|
|
25
|
+
*/
|
|
26
|
+
export interface Intervals {
|
|
27
|
+
readonly [IntervalsTypeId]: IntervalsTypeId
|
|
28
|
+
readonly intervals: Check.Chunk<Interval.Interval>
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Creates a new `Intervals` from a `List` of `Interval`s.
|
|
33
|
+
*
|
|
34
|
+
* @since 2.0.0
|
|
35
|
+
* @category constructors
|
|
36
|
+
*/
|
|
37
|
+
export const make: (intervals: Check.Chunk<Interval.Interval>) => Intervals = internal.make
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Constructs an empty list of `Interval`s.
|
|
41
|
+
*
|
|
42
|
+
* @since 2.0.0
|
|
43
|
+
* @category constructors
|
|
44
|
+
*/
|
|
45
|
+
export const empty: Intervals = internal.empty
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates `Intervals` from the specified `Iterable<Interval>`.
|
|
49
|
+
*
|
|
50
|
+
* @since 2.0.0
|
|
51
|
+
* @category constructors
|
|
52
|
+
*/
|
|
53
|
+
export const fromIterable: (intervals: Iterable<Interval.Interval>) => Intervals = internal.fromIterable
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Computes the union of this `Intervals` and that `Intervals`
|
|
57
|
+
*
|
|
58
|
+
* @since 2.0.0
|
|
59
|
+
* @category utils
|
|
60
|
+
*/
|
|
61
|
+
export const union: {
|
|
62
|
+
(that: Intervals): (self: Intervals) => Intervals
|
|
63
|
+
(self: Intervals, that: Intervals): Intervals
|
|
64
|
+
} = internal.union
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Produces the intersection of this `Intervals` and that `Intervals`.
|
|
68
|
+
*
|
|
69
|
+
* @since 2.0.0
|
|
70
|
+
* @category utils
|
|
71
|
+
*/
|
|
72
|
+
export const intersect: {
|
|
73
|
+
(that: Intervals): (self: Intervals) => Intervals
|
|
74
|
+
(self: Intervals, that: Intervals): Intervals
|
|
75
|
+
} = internal.intersect
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The start of the earliest interval in the specified `Intervals`.
|
|
79
|
+
*
|
|
80
|
+
* @since 2.0.0
|
|
81
|
+
* @category getters
|
|
82
|
+
*/
|
|
83
|
+
export const start: (self: Intervals) => number = internal.start
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The end of the latest interval in the specified `Intervals`.
|
|
87
|
+
*
|
|
88
|
+
* @since 2.0.0
|
|
89
|
+
* @category getters
|
|
90
|
+
*/
|
|
91
|
+
export const end: (self: Intervals) => number = internal.end
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Returns `true` if the start of this `Intervals` is before the start of that
|
|
95
|
+
* `Intervals`, `false` otherwise.
|
|
96
|
+
*
|
|
97
|
+
* @since 2.0.0
|
|
98
|
+
* @category ordering
|
|
99
|
+
*/
|
|
100
|
+
export const lessThan: {
|
|
101
|
+
(that: Intervals): (self: Intervals) => boolean
|
|
102
|
+
(self: Intervals, that: Intervals): boolean
|
|
103
|
+
} = internal.lessThan
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Returns `true` if this `Intervals` is non-empty, `false` otherwise.
|
|
107
|
+
*
|
|
108
|
+
* @since 2.0.0
|
|
109
|
+
* @category getters
|
|
110
|
+
*/
|
|
111
|
+
export const isNonEmpty: (self: Intervals) => boolean = internal.isNonEmpty
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Returns the maximum of the two `Intervals` (i.e. which has the latest start).
|
|
115
|
+
*
|
|
116
|
+
* @since 2.0.0
|
|
117
|
+
* @category ordering
|
|
118
|
+
*/
|
|
119
|
+
export const max: {
|
|
120
|
+
(that: Intervals): (self: Intervals) => Intervals
|
|
121
|
+
(self: Intervals, that: Intervals): Intervals
|
|
122
|
+
} = internal.max
|
package/src/Scheduler.ts
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { Effect } from "./Effect.js"
|
|
6
|
+
import type { RuntimeFiber } from "./Fiber.js"
|
|
7
|
+
import type { FiberRef } from "./FiberRef.js"
|
|
8
|
+
import { dual } from "./Function.js"
|
|
9
|
+
import { globalValue } from "./GlobalValue.js"
|
|
10
|
+
import * as core from "./internal/core.js"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @since 2.0.0
|
|
14
|
+
* @category models
|
|
15
|
+
*/
|
|
16
|
+
export type Task = () => void
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @since 2.0.0
|
|
20
|
+
* @category models
|
|
21
|
+
*/
|
|
22
|
+
export interface Scheduler {
|
|
23
|
+
shouldYield(fiber: RuntimeFiber<unknown, unknown>): number | false
|
|
24
|
+
scheduleTask(task: Task, priority: number): void
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @since 2.0.0
|
|
29
|
+
* @category utils
|
|
30
|
+
*/
|
|
31
|
+
export class PriorityBuckets<in out T = Task> {
|
|
32
|
+
/**
|
|
33
|
+
* @since 2.0.0
|
|
34
|
+
*/
|
|
35
|
+
public buckets: Array<[number, Array<T>]> = []
|
|
36
|
+
/**
|
|
37
|
+
* @since 2.0.0
|
|
38
|
+
*/
|
|
39
|
+
scheduleTask(task: T, priority: number) {
|
|
40
|
+
const length = this.buckets.length
|
|
41
|
+
let bucket: [number, Array<T>] | undefined = undefined
|
|
42
|
+
let index = 0
|
|
43
|
+
for (; index < length; index++) {
|
|
44
|
+
if (this.buckets[index][0] <= priority) {
|
|
45
|
+
bucket = this.buckets[index]
|
|
46
|
+
} else {
|
|
47
|
+
break
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (bucket && bucket[0] === priority) {
|
|
51
|
+
bucket[1].push(task)
|
|
52
|
+
} else if (index === length) {
|
|
53
|
+
this.buckets.push([priority, [task]])
|
|
54
|
+
} else {
|
|
55
|
+
this.buckets.splice(index, 0, [priority, [task]])
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @since 2.0.0
|
|
62
|
+
* @category constructors
|
|
63
|
+
*/
|
|
64
|
+
export class MixedScheduler implements Scheduler {
|
|
65
|
+
/**
|
|
66
|
+
* @since 2.0.0
|
|
67
|
+
*/
|
|
68
|
+
running = false
|
|
69
|
+
/**
|
|
70
|
+
* @since 2.0.0
|
|
71
|
+
*/
|
|
72
|
+
tasks = new PriorityBuckets()
|
|
73
|
+
|
|
74
|
+
constructor(
|
|
75
|
+
/**
|
|
76
|
+
* @since 2.0.0
|
|
77
|
+
*/
|
|
78
|
+
readonly maxNextTickBeforeTimer: number
|
|
79
|
+
) {}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @since 2.0.0
|
|
83
|
+
*/
|
|
84
|
+
private starveInternal(depth: number) {
|
|
85
|
+
const tasks = this.tasks.buckets
|
|
86
|
+
this.tasks.buckets = []
|
|
87
|
+
for (const [_, toRun] of tasks) {
|
|
88
|
+
for (let i = 0; i < toRun.length; i++) {
|
|
89
|
+
toRun[i]()
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (this.tasks.buckets.length === 0) {
|
|
93
|
+
this.running = false
|
|
94
|
+
} else {
|
|
95
|
+
this.starve(depth)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* @since 2.0.0
|
|
101
|
+
*/
|
|
102
|
+
private starve(depth = 0) {
|
|
103
|
+
if (depth >= this.maxNextTickBeforeTimer) {
|
|
104
|
+
setTimeout(() => this.starveInternal(0), 0)
|
|
105
|
+
} else {
|
|
106
|
+
Promise.resolve(void 0).then(() => this.starveInternal(depth + 1))
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @since 2.0.0
|
|
112
|
+
*/
|
|
113
|
+
shouldYield(fiber: RuntimeFiber<unknown, unknown>): number | false {
|
|
114
|
+
return fiber.currentOpCount > fiber.getFiberRef(core.currentMaxOpsBeforeYield)
|
|
115
|
+
? fiber.getFiberRef(core.currentSchedulingPriority)
|
|
116
|
+
: false
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @since 2.0.0
|
|
121
|
+
*/
|
|
122
|
+
scheduleTask(task: Task, priority: number) {
|
|
123
|
+
this.tasks.scheduleTask(task, priority)
|
|
124
|
+
if (!this.running) {
|
|
125
|
+
this.running = true
|
|
126
|
+
this.starve()
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @since 2.0.0
|
|
133
|
+
* @category schedulers
|
|
134
|
+
*/
|
|
135
|
+
export const defaultScheduler: Scheduler = globalValue(
|
|
136
|
+
Symbol.for("effect/Scheduler/defaultScheduler"),
|
|
137
|
+
() => new MixedScheduler(2048)
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @since 2.0.0
|
|
142
|
+
* @category constructors
|
|
143
|
+
*/
|
|
144
|
+
export class SyncScheduler implements Scheduler {
|
|
145
|
+
/**
|
|
146
|
+
* @since 2.0.0
|
|
147
|
+
*/
|
|
148
|
+
tasks = new PriorityBuckets()
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @since 2.0.0
|
|
152
|
+
*/
|
|
153
|
+
deferred = false
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @since 2.0.0
|
|
157
|
+
*/
|
|
158
|
+
scheduleTask(task: Task, priority: number) {
|
|
159
|
+
if (this.deferred) {
|
|
160
|
+
defaultScheduler.scheduleTask(task, priority)
|
|
161
|
+
} else {
|
|
162
|
+
this.tasks.scheduleTask(task, priority)
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* @since 2.0.0
|
|
168
|
+
*/
|
|
169
|
+
shouldYield(fiber: RuntimeFiber<unknown, unknown>): number | false {
|
|
170
|
+
return fiber.currentOpCount > fiber.getFiberRef(core.currentMaxOpsBeforeYield)
|
|
171
|
+
? fiber.getFiberRef(core.currentSchedulingPriority)
|
|
172
|
+
: false
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* @since 2.0.0
|
|
177
|
+
*/
|
|
178
|
+
flush() {
|
|
179
|
+
while (this.tasks.buckets.length > 0) {
|
|
180
|
+
const tasks = this.tasks.buckets
|
|
181
|
+
this.tasks.buckets = []
|
|
182
|
+
for (const [_, toRun] of tasks) {
|
|
183
|
+
for (let i = 0; i < toRun.length; i++) {
|
|
184
|
+
toRun[i]()
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
this.deferred = true
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* @since 2.0.0
|
|
194
|
+
* @category constructors
|
|
195
|
+
*/
|
|
196
|
+
export class ControlledScheduler implements Scheduler {
|
|
197
|
+
/**
|
|
198
|
+
* @since 2.0.0
|
|
199
|
+
*/
|
|
200
|
+
tasks = new PriorityBuckets()
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* @since 2.0.0
|
|
204
|
+
*/
|
|
205
|
+
deferred = false
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @since 2.0.0
|
|
209
|
+
*/
|
|
210
|
+
scheduleTask(task: Task, priority: number) {
|
|
211
|
+
if (this.deferred) {
|
|
212
|
+
defaultScheduler.scheduleTask(task, priority)
|
|
213
|
+
} else {
|
|
214
|
+
this.tasks.scheduleTask(task, priority)
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* @since 2.0.0
|
|
220
|
+
*/
|
|
221
|
+
shouldYield(fiber: RuntimeFiber<unknown, unknown>): number | false {
|
|
222
|
+
return fiber.currentOpCount > fiber.getFiberRef(core.currentMaxOpsBeforeYield)
|
|
223
|
+
? fiber.getFiberRef(core.currentSchedulingPriority)
|
|
224
|
+
: false
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* @since 2.0.0
|
|
229
|
+
*/
|
|
230
|
+
step() {
|
|
231
|
+
const tasks = this.tasks.buckets
|
|
232
|
+
this.tasks.buckets = []
|
|
233
|
+
for (const [_, toRun] of tasks) {
|
|
234
|
+
for (let i = 0; i < toRun.length; i++) {
|
|
235
|
+
toRun[i]()
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* @since 2.0.0
|
|
243
|
+
* @category constructors
|
|
244
|
+
*/
|
|
245
|
+
export const makeMatrix = (...record: Array<[number, Scheduler]>): Scheduler => {
|
|
246
|
+
const index = record.sort(([p0], [p1]) => p0 < p1 ? -1 : p0 > p1 ? 1 : 0)
|
|
247
|
+
return {
|
|
248
|
+
shouldYield(fiber) {
|
|
249
|
+
for (const scheduler of record) {
|
|
250
|
+
const priority = scheduler[1].shouldYield(fiber)
|
|
251
|
+
if (priority !== false) {
|
|
252
|
+
return priority
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return false
|
|
256
|
+
},
|
|
257
|
+
scheduleTask(task, priority) {
|
|
258
|
+
let scheduler: Scheduler | undefined = undefined
|
|
259
|
+
for (const i of index) {
|
|
260
|
+
if (priority >= i[0]) {
|
|
261
|
+
scheduler = i[1]
|
|
262
|
+
} else {
|
|
263
|
+
return (scheduler ?? defaultScheduler).scheduleTask(task, priority)
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return (scheduler ?? defaultScheduler).scheduleTask(task, priority)
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* @since 2.0.0
|
|
273
|
+
* @category utilities
|
|
274
|
+
*/
|
|
275
|
+
export const defaultShouldYield: Scheduler["shouldYield"] = (fiber) => {
|
|
276
|
+
return fiber.currentOpCount > fiber.getFiberRef(core.currentMaxOpsBeforeYield)
|
|
277
|
+
? fiber.getFiberRef(core.currentSchedulingPriority)
|
|
278
|
+
: false
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* @since 2.0.0
|
|
283
|
+
* @category constructors
|
|
284
|
+
*/
|
|
285
|
+
export const make = (
|
|
286
|
+
scheduleTask: Scheduler["scheduleTask"],
|
|
287
|
+
shouldYield: Scheduler["shouldYield"] = defaultShouldYield
|
|
288
|
+
): Scheduler => ({
|
|
289
|
+
scheduleTask,
|
|
290
|
+
shouldYield
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* @since 2.0.0
|
|
295
|
+
* @category constructors
|
|
296
|
+
*/
|
|
297
|
+
export const makeBatched = (
|
|
298
|
+
callback: (runBatch: () => void) => void,
|
|
299
|
+
shouldYield: Scheduler["shouldYield"] = defaultShouldYield
|
|
300
|
+
) => {
|
|
301
|
+
let running = false
|
|
302
|
+
const tasks = new PriorityBuckets()
|
|
303
|
+
const starveInternal = () => {
|
|
304
|
+
const tasksToRun = tasks.buckets
|
|
305
|
+
tasks.buckets = []
|
|
306
|
+
for (const [_, toRun] of tasksToRun) {
|
|
307
|
+
for (let i = 0; i < toRun.length; i++) {
|
|
308
|
+
toRun[i]()
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (tasks.buckets.length === 0) {
|
|
312
|
+
running = false
|
|
313
|
+
} else {
|
|
314
|
+
starve()
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const starve = () => callback(starveInternal)
|
|
319
|
+
|
|
320
|
+
return make((task, priority) => {
|
|
321
|
+
tasks.scheduleTask(task, priority)
|
|
322
|
+
if (!running) {
|
|
323
|
+
running = true
|
|
324
|
+
starve()
|
|
325
|
+
}
|
|
326
|
+
}, shouldYield)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* @since 2.0.0
|
|
331
|
+
* @category constructors
|
|
332
|
+
*/
|
|
333
|
+
export const timer = (ms: number, shouldYield: Scheduler["shouldYield"] = defaultShouldYield) =>
|
|
334
|
+
make((task) => setTimeout(task, ms), shouldYield)
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* @since 2.0.0
|
|
338
|
+
* @category constructors
|
|
339
|
+
*/
|
|
340
|
+
export const timerBatched = (ms: number, shouldYield: Scheduler["shouldYield"] = defaultShouldYield) =>
|
|
341
|
+
makeBatched((task) => setTimeout(task, ms), shouldYield)
|
|
342
|
+
|
|
343
|
+
/** @internal */
|
|
344
|
+
export const currentScheduler: FiberRef<Scheduler> = globalValue(
|
|
345
|
+
Symbol.for("effect/FiberRef/currentScheduler"),
|
|
346
|
+
() => core.fiberRefUnsafeMake(defaultScheduler)
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
/** @internal */
|
|
350
|
+
export const withScheduler = dual<
|
|
351
|
+
(scheduler: Scheduler) => <A, E, R>(self: Effect<A, E, R>) => Effect<A, E, R>,
|
|
352
|
+
<A, E, R>(self: Effect<A, E, R>, scheduler: Scheduler) => Effect<A, E, R>
|
|
353
|
+
>(2, (self, scheduler) => core.fiberRefLocally(self, currentScheduler, scheduler))
|