@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,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Dual from "./Function.js"
|
|
5
|
+
import { format, NodeInspectSymbol, toJSON } from "./Inspectable.js"
|
|
6
|
+
import type { Inspectable } from "./Inspectable.js"
|
|
7
|
+
import type { Pipeable } from "./Pipeable.js"
|
|
8
|
+
import { pipeArguments } from "./Pipeable.js"
|
|
9
|
+
|
|
10
|
+
const TypeId: unique symbol = Symbol.for("effect/MutableList") as TypeId
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @since 2.0.0
|
|
14
|
+
* @category symbol
|
|
15
|
+
*/
|
|
16
|
+
export type TypeId = typeof TypeId
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @since 2.0.0
|
|
20
|
+
* @category model
|
|
21
|
+
*/
|
|
22
|
+
export interface MutableList<out A> extends Iterable<A>, Pipeable, Inspectable {
|
|
23
|
+
readonly [TypeId]: TypeId
|
|
24
|
+
|
|
25
|
+
/** @internal */
|
|
26
|
+
head: LinkedListNode<A> | undefined
|
|
27
|
+
/** @internal */
|
|
28
|
+
tail: LinkedListNode<A> | undefined
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const MutableListProto: Omit<MutableList<unknown>, "head" | "tail"> = {
|
|
32
|
+
[TypeId]: TypeId,
|
|
33
|
+
[Symbol.iterator](this: MutableList<unknown>): Iterator<unknown> {
|
|
34
|
+
let done = false
|
|
35
|
+
let head: LinkedListNode<unknown> | undefined = this.head
|
|
36
|
+
return {
|
|
37
|
+
next() {
|
|
38
|
+
if (done) {
|
|
39
|
+
return this.return!()
|
|
40
|
+
}
|
|
41
|
+
if (head == null) {
|
|
42
|
+
done = true
|
|
43
|
+
return this.return!()
|
|
44
|
+
}
|
|
45
|
+
const value = head.value
|
|
46
|
+
head = head.next
|
|
47
|
+
return { done, value }
|
|
48
|
+
},
|
|
49
|
+
return(value?: unknown) {
|
|
50
|
+
if (!done) {
|
|
51
|
+
done = true
|
|
52
|
+
}
|
|
53
|
+
return { done: true, value }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
toString() {
|
|
58
|
+
return format(this.toJSON())
|
|
59
|
+
},
|
|
60
|
+
toJSON() {
|
|
61
|
+
return {
|
|
62
|
+
_id: "MutableList",
|
|
63
|
+
values: Array.from(this).map(toJSON)
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
[NodeInspectSymbol]() {
|
|
67
|
+
return this.toJSON()
|
|
68
|
+
},
|
|
69
|
+
pipe() {
|
|
70
|
+
return pipeArguments(this, arguments)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface MutableListImpl<A> extends MutableList<A> {
|
|
75
|
+
_length: number
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** @internal */
|
|
79
|
+
interface LinkedListNode<T> {
|
|
80
|
+
removed: boolean
|
|
81
|
+
value: T
|
|
82
|
+
prev: LinkedListNode<T> | undefined
|
|
83
|
+
next: LinkedListNode<T> | undefined
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** @internal */
|
|
87
|
+
const makeNode = <T>(value: T): LinkedListNode<T> => ({
|
|
88
|
+
value,
|
|
89
|
+
removed: false,
|
|
90
|
+
prev: undefined,
|
|
91
|
+
next: undefined
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Creates an empty `MutableList`.
|
|
96
|
+
*
|
|
97
|
+
* @since 2.0.0
|
|
98
|
+
* @category constructors
|
|
99
|
+
*/
|
|
100
|
+
export const empty = <A = never>(): MutableList<A> => {
|
|
101
|
+
const list = Object.create(MutableListProto)
|
|
102
|
+
list.head = undefined
|
|
103
|
+
list.tail = undefined
|
|
104
|
+
list._length = 0
|
|
105
|
+
return list
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Creates a new `MutableList` from an iterable collection of values.
|
|
110
|
+
*
|
|
111
|
+
* @since 2.0.0
|
|
112
|
+
* @category constructors
|
|
113
|
+
*/
|
|
114
|
+
export const fromIterable = <A>(iterable: Iterable<A>): MutableList<A> => {
|
|
115
|
+
const list = empty<A>()
|
|
116
|
+
for (const element of iterable) {
|
|
117
|
+
append(list, element)
|
|
118
|
+
}
|
|
119
|
+
return list
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Creates a new `MutableList` from the specified elements.
|
|
124
|
+
*
|
|
125
|
+
* @since 2.0.0
|
|
126
|
+
* @category constructors
|
|
127
|
+
*/
|
|
128
|
+
export const make = <A>(...elements: ReadonlyArray<A>): MutableList<A> => fromIterable(elements)
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Returns `true` if the list contains zero elements, `false`, otherwise.
|
|
132
|
+
*
|
|
133
|
+
* @since 2.0.0
|
|
134
|
+
* @category getters
|
|
135
|
+
*/
|
|
136
|
+
export const isEmpty = <A>(self: MutableList<A>): boolean => length(self) === 0
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Returns the length of the list.
|
|
140
|
+
*
|
|
141
|
+
* @since 2.0.0
|
|
142
|
+
* @category getters
|
|
143
|
+
*/
|
|
144
|
+
export const length = <A>(self: MutableList<A>): number => (self as MutableListImpl<A>)._length
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Returns the last element of the list, if it exists.
|
|
148
|
+
*
|
|
149
|
+
* @since 2.0.0
|
|
150
|
+
* @category getters
|
|
151
|
+
*/
|
|
152
|
+
export const tail = <A>(self: MutableList<A>): A | undefined => self.tail === undefined ? undefined : self.tail.value
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Returns the first element of the list, if it exists.
|
|
156
|
+
*
|
|
157
|
+
* @since 2.0.0
|
|
158
|
+
* @category getters
|
|
159
|
+
*/
|
|
160
|
+
export const head = <A>(self: MutableList<A>): A | undefined => self.head === undefined ? undefined : self.head.value
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Executes the specified function `f` for each element in the list.
|
|
164
|
+
*
|
|
165
|
+
* @since 2.0.0
|
|
166
|
+
* @category traversing
|
|
167
|
+
*/
|
|
168
|
+
export const forEach: {
|
|
169
|
+
<A>(f: (element: A) => void): (self: MutableList<A>) => void
|
|
170
|
+
<A>(self: MutableList<A>, f: (element: A) => void): void
|
|
171
|
+
} = Dual.dual<
|
|
172
|
+
<A>(f: (element: A) => void) => (self: MutableList<A>) => void,
|
|
173
|
+
<A>(self: MutableList<A>, f: (element: A) => void) => void
|
|
174
|
+
>(2, (self, f) => {
|
|
175
|
+
let current = self.head
|
|
176
|
+
while (current !== undefined) {
|
|
177
|
+
f(current.value)
|
|
178
|
+
current = current.next
|
|
179
|
+
}
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Removes all elements from the doubly-linked list.
|
|
184
|
+
*
|
|
185
|
+
* @since 2.0.0
|
|
186
|
+
*/
|
|
187
|
+
export const reset = <A>(self: MutableList<A>): MutableList<A> => {
|
|
188
|
+
;(self as MutableListImpl<A>)._length = 0
|
|
189
|
+
self.head = undefined
|
|
190
|
+
self.tail = undefined
|
|
191
|
+
return self
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Appends the specified element to the end of the `MutableList`.
|
|
196
|
+
*
|
|
197
|
+
* @category concatenating
|
|
198
|
+
* @since 2.0.0
|
|
199
|
+
*/
|
|
200
|
+
export const append: {
|
|
201
|
+
<A>(value: A): (self: MutableList<A>) => MutableList<A>
|
|
202
|
+
<A>(self: MutableList<A>, value: A): MutableList<A>
|
|
203
|
+
} = Dual.dual<
|
|
204
|
+
<A>(value: A) => (self: MutableList<A>) => MutableList<A>,
|
|
205
|
+
<A>(self: MutableList<A>, value: A) => MutableList<A>
|
|
206
|
+
>(2, <A>(self: MutableList<A>, value: A) => {
|
|
207
|
+
const node = makeNode(value)
|
|
208
|
+
if (self.head === undefined) {
|
|
209
|
+
self.head = node
|
|
210
|
+
}
|
|
211
|
+
if (self.tail === undefined) {
|
|
212
|
+
self.tail = node
|
|
213
|
+
} else {
|
|
214
|
+
self.tail.next = node
|
|
215
|
+
node.prev = self.tail
|
|
216
|
+
self.tail = node
|
|
217
|
+
}
|
|
218
|
+
;(self as MutableListImpl<A>)._length += 1
|
|
219
|
+
return self
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Removes the first value from the list and returns it, if it exists.
|
|
224
|
+
*
|
|
225
|
+
* @since 0.0.1
|
|
226
|
+
*/
|
|
227
|
+
export const shift = <A>(self: MutableList<A>): A | undefined => {
|
|
228
|
+
const head = self.head
|
|
229
|
+
if (head !== undefined) {
|
|
230
|
+
remove(self, head)
|
|
231
|
+
return head.value
|
|
232
|
+
}
|
|
233
|
+
return undefined
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Removes the last value from the list and returns it, if it exists.
|
|
238
|
+
*
|
|
239
|
+
* @since 0.0.1
|
|
240
|
+
*/
|
|
241
|
+
export const pop = <A>(self: MutableList<A>): A | undefined => {
|
|
242
|
+
const tail = self.tail
|
|
243
|
+
if (tail !== undefined) {
|
|
244
|
+
remove(self, tail)
|
|
245
|
+
return tail.value
|
|
246
|
+
}
|
|
247
|
+
return undefined
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Prepends the specified value to the beginning of the list.
|
|
252
|
+
*
|
|
253
|
+
* @category concatenating
|
|
254
|
+
* @since 2.0.0
|
|
255
|
+
*/
|
|
256
|
+
export const prepend: {
|
|
257
|
+
<A>(value: A): (self: MutableList<A>) => MutableList<A>
|
|
258
|
+
<A>(self: MutableList<A>, value: A): MutableList<A>
|
|
259
|
+
} = Dual.dual<
|
|
260
|
+
<A>(value: A) => (self: MutableList<A>) => MutableList<A>,
|
|
261
|
+
<A>(self: MutableList<A>, value: A) => MutableList<A>
|
|
262
|
+
>(2, <A>(self: MutableList<A>, value: A) => {
|
|
263
|
+
const node = makeNode(value)
|
|
264
|
+
node.next = self.head
|
|
265
|
+
if (self.head !== undefined) {
|
|
266
|
+
self.head.prev = node
|
|
267
|
+
}
|
|
268
|
+
self.head = node
|
|
269
|
+
if (self.tail === undefined) {
|
|
270
|
+
self.tail = node
|
|
271
|
+
}
|
|
272
|
+
;(self as MutableListImpl<A>)._length += 1
|
|
273
|
+
return self
|
|
274
|
+
})
|
|
275
|
+
|
|
276
|
+
const remove = <A>(self: MutableList<A>, node: LinkedListNode<A>): void => {
|
|
277
|
+
if (node.removed) {
|
|
278
|
+
return
|
|
279
|
+
}
|
|
280
|
+
node.removed = true
|
|
281
|
+
if (node.prev !== undefined && node.next !== undefined) {
|
|
282
|
+
node.prev.next = node.next
|
|
283
|
+
node.next.prev = node.prev
|
|
284
|
+
} else if (node.prev !== undefined) {
|
|
285
|
+
self.tail = node.prev
|
|
286
|
+
node.prev.next = undefined
|
|
287
|
+
} else if (node.next !== undefined) {
|
|
288
|
+
self.head = node.next
|
|
289
|
+
node.next.prev = undefined
|
|
290
|
+
} else {
|
|
291
|
+
self.tail = undefined
|
|
292
|
+
self.head = undefined
|
|
293
|
+
}
|
|
294
|
+
if ((self as MutableListImpl<A>)._length > 0) {
|
|
295
|
+
;(self as MutableListImpl<A>)._length -= 1
|
|
296
|
+
}
|
|
297
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Chunk from "./Chunk.js"
|
|
5
|
+
import * as Dual from "./Function.js"
|
|
6
|
+
import { format, type Inspectable, NodeInspectSymbol, toJSON } from "./Inspectable.js"
|
|
7
|
+
import * as MutableList from "./MutableList.js"
|
|
8
|
+
import type { Pipeable } from "./Pipeable.js"
|
|
9
|
+
import { pipeArguments } from "./Pipeable.js"
|
|
10
|
+
|
|
11
|
+
const TypeId: unique symbol = Symbol.for("effect/MutableQueue") as TypeId
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @since 2.0.0
|
|
15
|
+
* @category symbol
|
|
16
|
+
*/
|
|
17
|
+
export type TypeId = typeof TypeId
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @since 2.0.0
|
|
21
|
+
* @category symbol
|
|
22
|
+
*/
|
|
23
|
+
export const EmptyMutableQueue = Symbol.for("effect/mutable/MutableQueue/Empty")
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @since 2.0.0
|
|
27
|
+
* @category model
|
|
28
|
+
*/
|
|
29
|
+
export interface MutableQueue<out A> extends Iterable<A>, Pipeable, Inspectable {
|
|
30
|
+
readonly [TypeId]: TypeId
|
|
31
|
+
|
|
32
|
+
/** @internal */
|
|
33
|
+
queue: MutableList.MutableList<A>
|
|
34
|
+
/** @internal */
|
|
35
|
+
capacity: number | undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @since 2.0.0
|
|
40
|
+
*/
|
|
41
|
+
export declare namespace MutableQueue {
|
|
42
|
+
/**
|
|
43
|
+
* @since 2.0.0
|
|
44
|
+
*/
|
|
45
|
+
export type Empty = typeof EmptyMutableQueue
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const MutableQueueProto: Omit<MutableQueue<unknown>, "queue" | "capacity"> = {
|
|
49
|
+
[TypeId]: TypeId,
|
|
50
|
+
[Symbol.iterator]<A>(this: MutableQueue<A>): Iterator<A> {
|
|
51
|
+
return Array.from(this.queue)[Symbol.iterator]()
|
|
52
|
+
},
|
|
53
|
+
toString() {
|
|
54
|
+
return format(this.toJSON())
|
|
55
|
+
},
|
|
56
|
+
toJSON() {
|
|
57
|
+
return {
|
|
58
|
+
_id: "MutableQueue",
|
|
59
|
+
values: Array.from(this).map(toJSON)
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
[NodeInspectSymbol]() {
|
|
63
|
+
return this.toJSON()
|
|
64
|
+
},
|
|
65
|
+
pipe() {
|
|
66
|
+
return pipeArguments(this, arguments)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const make = <A>(capacity: number | undefined): MutableQueue<A> => {
|
|
71
|
+
const queue = Object.create(MutableQueueProto)
|
|
72
|
+
queue.queue = MutableList.empty()
|
|
73
|
+
queue.capacity = capacity
|
|
74
|
+
return queue
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Creates a new bounded `MutableQueue`.
|
|
79
|
+
*
|
|
80
|
+
* @since 2.0.0
|
|
81
|
+
* @category constructors
|
|
82
|
+
*/
|
|
83
|
+
export const bounded = <A>(capacity: number): MutableQueue<A> => make(capacity)
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Creates a new unbounded `MutableQueue`.
|
|
87
|
+
*
|
|
88
|
+
* @since 2.0.0
|
|
89
|
+
* @category constructors
|
|
90
|
+
*/
|
|
91
|
+
export const unbounded = <A>(): MutableQueue<A> => make(undefined)
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Returns the current number of elements in the queue.
|
|
95
|
+
*
|
|
96
|
+
* @since 2.0.0
|
|
97
|
+
* @category getters
|
|
98
|
+
*/
|
|
99
|
+
export const length = <A>(self: MutableQueue<A>): number => MutableList.length(self.queue)
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Returns `true` if the queue is empty, `false` otherwise.
|
|
103
|
+
*
|
|
104
|
+
* @since 2.0.0
|
|
105
|
+
* @category getters
|
|
106
|
+
*/
|
|
107
|
+
export const isEmpty = <A>(self: MutableQueue<A>): boolean => MutableList.isEmpty(self.queue)
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Returns `true` if the queue is full, `false` otherwise.
|
|
111
|
+
*
|
|
112
|
+
* @since 2.0.0
|
|
113
|
+
* @category getters
|
|
114
|
+
*/
|
|
115
|
+
export const isFull = <A>(self: MutableQueue<A>): boolean =>
|
|
116
|
+
self.capacity === undefined ? false : MutableList.length(self.queue) === self.capacity
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* The **maximum** number of elements that a queue can hold.
|
|
120
|
+
*
|
|
121
|
+
* **Note**: unbounded queues can still implement this interface with
|
|
122
|
+
* `capacity = Infinity`.
|
|
123
|
+
*
|
|
124
|
+
* @since 2.0.0
|
|
125
|
+
* @category getters
|
|
126
|
+
*/
|
|
127
|
+
export const capacity = <A>(self: MutableQueue<A>): number => self.capacity === undefined ? Infinity : self.capacity
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Offers an element to the queue.
|
|
131
|
+
*
|
|
132
|
+
* Returns whether the enqueue was successful or not.
|
|
133
|
+
*
|
|
134
|
+
* @since 2.0.0
|
|
135
|
+
*/
|
|
136
|
+
export const offer: {
|
|
137
|
+
<A>(self: MutableQueue<A>, value: A): boolean
|
|
138
|
+
<A>(value: A): (self: MutableQueue<A>) => boolean
|
|
139
|
+
} = Dual.dual<
|
|
140
|
+
<A>(value: A) => (self: MutableQueue<A>) => boolean,
|
|
141
|
+
<A>(self: MutableQueue<A>, value: A) => boolean
|
|
142
|
+
>(2, <A>(self: MutableQueue<A>, value: A) => {
|
|
143
|
+
const queueLength = MutableList.length(self.queue)
|
|
144
|
+
if (self.capacity !== undefined && queueLength === self.capacity) {
|
|
145
|
+
return false
|
|
146
|
+
}
|
|
147
|
+
MutableList.append(value)(self.queue)
|
|
148
|
+
return true
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Enqueues a collection of values into the queue.
|
|
153
|
+
*
|
|
154
|
+
* Returns a `Chunk` of the values that were **not** able to be enqueued.
|
|
155
|
+
*
|
|
156
|
+
* @since 2.0.0
|
|
157
|
+
*/
|
|
158
|
+
export const offerAll: {
|
|
159
|
+
<A>(values: Iterable<A>): (self: MutableQueue<A>) => Chunk.Chunk<A>
|
|
160
|
+
<A>(self: MutableQueue<A>, values: Iterable<A>): Chunk.Chunk<A>
|
|
161
|
+
} = Dual.dual<
|
|
162
|
+
<A>(values: Iterable<A>) => (self: MutableQueue<A>) => Chunk.Chunk<A>,
|
|
163
|
+
<A>(self: MutableQueue<A>, values: Iterable<A>) => Chunk.Chunk<A>
|
|
164
|
+
>(2, <A>(self: MutableQueue<A>, values: Iterable<A>) => {
|
|
165
|
+
const iterator = values[Symbol.iterator]()
|
|
166
|
+
let next: IteratorResult<A> | undefined
|
|
167
|
+
let remainder = Chunk.empty<A>()
|
|
168
|
+
let offering = true
|
|
169
|
+
while (offering && (next = iterator.next()) && !next.done) {
|
|
170
|
+
offering = offer(next.value)(self)
|
|
171
|
+
}
|
|
172
|
+
while (next != null && !next.done) {
|
|
173
|
+
remainder = Chunk.prepend<A>(next.value)(remainder)
|
|
174
|
+
next = iterator.next()
|
|
175
|
+
}
|
|
176
|
+
return Chunk.reverse(remainder)
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Dequeues an element from the queue.
|
|
181
|
+
*
|
|
182
|
+
* Returns either an element from the queue, or the `def` param.
|
|
183
|
+
*
|
|
184
|
+
* **Note**: if there is no meaningful default for your type, you can always
|
|
185
|
+
* use `poll(MutableQueue.EmptyMutableQueue)`.
|
|
186
|
+
*
|
|
187
|
+
* @since 2.0.0
|
|
188
|
+
*/
|
|
189
|
+
export const poll: {
|
|
190
|
+
<D>(def: D): <A>(self: MutableQueue<A>) => D | A
|
|
191
|
+
<A, D>(self: MutableQueue<A>, def: D): A | D
|
|
192
|
+
} = Dual.dual<
|
|
193
|
+
<D>(def: D) => <A>(self: MutableQueue<A>) => A | D,
|
|
194
|
+
<A, D>(self: MutableQueue<A>, def: D) => A | D
|
|
195
|
+
>(2, (self, def) => {
|
|
196
|
+
if (MutableList.isEmpty(self.queue)) {
|
|
197
|
+
return def
|
|
198
|
+
}
|
|
199
|
+
return MutableList.shift(self.queue)!
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Dequeues up to `n` elements from the queue.
|
|
204
|
+
*
|
|
205
|
+
* Returns a `List` of up to `n` elements.
|
|
206
|
+
*
|
|
207
|
+
* @since 2.0.0
|
|
208
|
+
*/
|
|
209
|
+
export const pollUpTo: {
|
|
210
|
+
(n: number): <A>(self: MutableQueue<A>) => Chunk.Chunk<A>
|
|
211
|
+
<A>(self: MutableQueue<A>, n: number): Chunk.Chunk<A>
|
|
212
|
+
} = Dual.dual<
|
|
213
|
+
(n: number) => <A>(self: MutableQueue<A>) => Chunk.Chunk<A>,
|
|
214
|
+
<A>(self: MutableQueue<A>, n: number) => Chunk.Chunk<A>
|
|
215
|
+
>(2, <A>(self: MutableQueue<A>, n: number) => {
|
|
216
|
+
let result = Chunk.empty<A>()
|
|
217
|
+
let count = 0
|
|
218
|
+
while (count < n) {
|
|
219
|
+
const element = poll(EmptyMutableQueue)(self)
|
|
220
|
+
if (element === EmptyMutableQueue) {
|
|
221
|
+
break
|
|
222
|
+
}
|
|
223
|
+
result = Chunk.prepend(element)(result)
|
|
224
|
+
count += 1
|
|
225
|
+
}
|
|
226
|
+
return Chunk.reverse(result)
|
|
227
|
+
})
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Equal from "./Equal.js"
|
|
5
|
+
import * as Dual from "./Function.js"
|
|
6
|
+
import { format, type Inspectable, NodeInspectSymbol, toJSON } from "./Inspectable.js"
|
|
7
|
+
import type { Pipeable } from "./Pipeable.js"
|
|
8
|
+
import { pipeArguments } from "./Pipeable.js"
|
|
9
|
+
|
|
10
|
+
const TypeId: unique symbol = Symbol.for("effect/MutableRef") as TypeId
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @since 2.0.0
|
|
14
|
+
* @category symbol
|
|
15
|
+
*/
|
|
16
|
+
export type TypeId = typeof TypeId
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @since 2.0.0
|
|
20
|
+
* @category models
|
|
21
|
+
*/
|
|
22
|
+
export interface MutableRef<out T> extends Pipeable, Inspectable {
|
|
23
|
+
readonly [TypeId]: TypeId
|
|
24
|
+
current: T
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const MutableRefProto: Omit<MutableRef<unknown>, "current"> = {
|
|
28
|
+
[TypeId]: TypeId,
|
|
29
|
+
toString<A>(this: MutableRef<A>): string {
|
|
30
|
+
return format(this.toJSON())
|
|
31
|
+
},
|
|
32
|
+
toJSON<A>(this: MutableRef<A>) {
|
|
33
|
+
return {
|
|
34
|
+
_id: "MutableRef",
|
|
35
|
+
current: toJSON(this.current)
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
[NodeInspectSymbol]() {
|
|
39
|
+
return this.toJSON()
|
|
40
|
+
},
|
|
41
|
+
pipe() {
|
|
42
|
+
return pipeArguments(this, arguments)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @since 2.0.0
|
|
48
|
+
* @category constructors
|
|
49
|
+
*/
|
|
50
|
+
export const make = <T>(value: T): MutableRef<T> => {
|
|
51
|
+
const ref = Object.create(MutableRefProto)
|
|
52
|
+
ref.current = value
|
|
53
|
+
return ref
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @since 2.0.0
|
|
58
|
+
* @category general
|
|
59
|
+
*/
|
|
60
|
+
export const compareAndSet: {
|
|
61
|
+
<T>(oldValue: T, newValue: T): (self: MutableRef<T>) => boolean
|
|
62
|
+
<T>(self: MutableRef<T>, oldValue: T, newValue: T): boolean
|
|
63
|
+
} = Dual.dual<
|
|
64
|
+
<T>(oldValue: T, newValue: T) => (self: MutableRef<T>) => boolean,
|
|
65
|
+
<T>(self: MutableRef<T>, oldValue: T, newValue: T) => boolean
|
|
66
|
+
>(3, (self, oldValue, newValue) => {
|
|
67
|
+
if (Equal.equals(oldValue, self.current)) {
|
|
68
|
+
self.current = newValue
|
|
69
|
+
return true
|
|
70
|
+
}
|
|
71
|
+
return false
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @since 2.0.0
|
|
76
|
+
* @category numeric
|
|
77
|
+
*/
|
|
78
|
+
export const decrement = (self: MutableRef<number>): MutableRef<number> => update(self, (n) => n - 1)
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @since 2.0.0
|
|
82
|
+
* @category numeric
|
|
83
|
+
*/
|
|
84
|
+
export const decrementAndGet = (self: MutableRef<number>): number => updateAndGet(self, (n) => n - 1)
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @since 2.0.0
|
|
88
|
+
* @category general
|
|
89
|
+
*/
|
|
90
|
+
export const get = <T>(self: MutableRef<T>): T => self.current
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @since 2.0.0
|
|
94
|
+
* @category numeric
|
|
95
|
+
*/
|
|
96
|
+
export const getAndDecrement = (self: MutableRef<number>): number => getAndUpdate(self, (n) => n - 1)
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @since 2.0.0
|
|
100
|
+
* @category numeric
|
|
101
|
+
*/
|
|
102
|
+
export const getAndIncrement = (self: MutableRef<number>): number => getAndUpdate(self, (n) => n + 1)
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @since 2.0.0
|
|
106
|
+
* @category general
|
|
107
|
+
*/
|
|
108
|
+
export const getAndSet: {
|
|
109
|
+
<T>(value: T): (self: MutableRef<T>) => T
|
|
110
|
+
<T>(self: MutableRef<T>, value: T): T
|
|
111
|
+
} = Dual.dual<
|
|
112
|
+
<T>(value: T) => (self: MutableRef<T>) => T,
|
|
113
|
+
<T>(self: MutableRef<T>, value: T) => T
|
|
114
|
+
>(2, (self, value) => {
|
|
115
|
+
const ret = self.current
|
|
116
|
+
self.current = value
|
|
117
|
+
return ret
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @since 2.0.0
|
|
122
|
+
* @category general
|
|
123
|
+
*/
|
|
124
|
+
export const getAndUpdate: {
|
|
125
|
+
<T>(f: (value: T) => T): (self: MutableRef<T>) => T
|
|
126
|
+
<T>(self: MutableRef<T>, f: (value: T) => T): T
|
|
127
|
+
} = Dual.dual<
|
|
128
|
+
<T>(f: (value: T) => T) => (self: MutableRef<T>) => T,
|
|
129
|
+
<T>(self: MutableRef<T>, f: (value: T) => T) => T
|
|
130
|
+
>(2, (self, f) => getAndSet(self, f(get(self))))
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @since 2.0.0
|
|
134
|
+
* @category numeric
|
|
135
|
+
*/
|
|
136
|
+
export const increment = (self: MutableRef<number>): MutableRef<number> => update(self, (n) => n + 1)
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @since 2.0.0
|
|
140
|
+
* @category numeric
|
|
141
|
+
*/
|
|
142
|
+
export const incrementAndGet = (self: MutableRef<number>): number => updateAndGet(self, (n) => n + 1)
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @since 2.0.0
|
|
146
|
+
* @category general
|
|
147
|
+
*/
|
|
148
|
+
export const set: {
|
|
149
|
+
<T>(value: T): (self: MutableRef<T>) => MutableRef<T>
|
|
150
|
+
<T>(self: MutableRef<T>, value: T): MutableRef<T>
|
|
151
|
+
} = Dual.dual<
|
|
152
|
+
<T>(value: T) => (self: MutableRef<T>) => MutableRef<T>,
|
|
153
|
+
<T>(self: MutableRef<T>, value: T) => MutableRef<T>
|
|
154
|
+
>(2, (self, value) => {
|
|
155
|
+
self.current = value
|
|
156
|
+
return self
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @since 2.0.0
|
|
161
|
+
* @category general
|
|
162
|
+
*/
|
|
163
|
+
export const setAndGet: {
|
|
164
|
+
<T>(value: T): (self: MutableRef<T>) => T
|
|
165
|
+
<T>(self: MutableRef<T>, value: T): T
|
|
166
|
+
} = Dual.dual<
|
|
167
|
+
<T>(value: T) => (self: MutableRef<T>) => T,
|
|
168
|
+
<T>(self: MutableRef<T>, value: T) => T
|
|
169
|
+
>(2, (self, value) => {
|
|
170
|
+
self.current = value
|
|
171
|
+
return self.current
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* @since 2.0.0
|
|
176
|
+
* @category general
|
|
177
|
+
*/
|
|
178
|
+
export const update: {
|
|
179
|
+
<T>(f: (value: T) => T): (self: MutableRef<T>) => MutableRef<T>
|
|
180
|
+
<T>(self: MutableRef<T>, f: (value: T) => T): MutableRef<T>
|
|
181
|
+
} = Dual.dual<
|
|
182
|
+
<T>(f: (value: T) => T) => (self: MutableRef<T>) => MutableRef<T>,
|
|
183
|
+
<T>(self: MutableRef<T>, f: (value: T) => T) => MutableRef<T>
|
|
184
|
+
>(2, (self, f) => set(self, f(get(self))))
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* @since 2.0.0
|
|
188
|
+
* @category general
|
|
189
|
+
*/
|
|
190
|
+
export const updateAndGet: {
|
|
191
|
+
<T>(f: (value: T) => T): (self: MutableRef<T>) => T
|
|
192
|
+
<T>(self: MutableRef<T>, f: (value: T) => T): T
|
|
193
|
+
} = Dual.dual<
|
|
194
|
+
<T>(f: (value: T) => T) => (self: MutableRef<T>) => T,
|
|
195
|
+
<T>(self: MutableRef<T>, f: (value: T) => T) => T
|
|
196
|
+
>(2, (self, f) => setAndGet(self, f(get(self))))
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* @since 2.0.0
|
|
200
|
+
* @category boolean
|
|
201
|
+
*/
|
|
202
|
+
export const toggle = (self: MutableRef<boolean>): MutableRef<boolean> => update(self, (_) => !_)
|