@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,706 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* # MutableHashSet
|
|
3
|
+
*
|
|
4
|
+
* A mutable `MutableHashSet` provides a collection of unique values with
|
|
5
|
+
* efficient lookup, insertion and removal. Unlike its immutable sibling
|
|
6
|
+
* {@link module:HashSet}, a `MutableHashSet` can be modified in-place;
|
|
7
|
+
* operations like add, remove, and clear directly modify the original set
|
|
8
|
+
* rather than creating a new one. This mutability offers benefits like improved
|
|
9
|
+
* performance in scenarios where you need to build or modify a set
|
|
10
|
+
* incrementally.
|
|
11
|
+
*
|
|
12
|
+
* ## What Problem Does It Solve?
|
|
13
|
+
*
|
|
14
|
+
* `MutableHashSet` solves the problem of maintaining an unsorted collection
|
|
15
|
+
* where each value appears exactly once, with fast operations for checking
|
|
16
|
+
* membership and adding/removing values, in contexts where mutability is
|
|
17
|
+
* preferred for performance or implementation simplicity.
|
|
18
|
+
*
|
|
19
|
+
* ## When to Use
|
|
20
|
+
*
|
|
21
|
+
* Use `MutableHashSet` when you need:
|
|
22
|
+
*
|
|
23
|
+
* - A collection with no duplicate values
|
|
24
|
+
* - Efficient membership testing (**`O(1)`** average complexity)
|
|
25
|
+
* - In-place modifications for better performance
|
|
26
|
+
* - A set that will be built or modified incrementally
|
|
27
|
+
* - Local mutability in otherwise immutable code
|
|
28
|
+
*
|
|
29
|
+
* ## Advanced Features
|
|
30
|
+
*
|
|
31
|
+
* MutableHashSet provides operations for:
|
|
32
|
+
*
|
|
33
|
+
* - Adding and removing elements with direct mutation
|
|
34
|
+
* - Checking for element existence
|
|
35
|
+
* - Clearing all elements at once
|
|
36
|
+
* - Converting to/from other collection types
|
|
37
|
+
*
|
|
38
|
+
* ## Performance Characteristics
|
|
39
|
+
*
|
|
40
|
+
* - **Lookup** operations ({@link module:MutableHashSet.has}): **`O(1)`** average
|
|
41
|
+
* time complexity
|
|
42
|
+
* - **Insertion** operations ({@link module:MutableHashSet.add}): **`O(1)`**
|
|
43
|
+
* average time complexity
|
|
44
|
+
* - **Removal** operations ({@link module:MutableHashSet.remove}): **`O(1)`**
|
|
45
|
+
* average time complexity
|
|
46
|
+
* - **Iteration**: **`O(n)`** where n is the size of the set
|
|
47
|
+
*
|
|
48
|
+
* The MutableHashSet data structure implements the following traits:
|
|
49
|
+
*
|
|
50
|
+
* - {@link Iterable}: allows iterating over the values in the set
|
|
51
|
+
* - {@link Pipeable}: allows chaining operations with the pipe operator
|
|
52
|
+
* - {@link Inspectable}: allows inspecting the contents of the set
|
|
53
|
+
*
|
|
54
|
+
* ## Operations Reference
|
|
55
|
+
*
|
|
56
|
+
* | Category | Operation | Description | Complexity |
|
|
57
|
+
* | ------------ | ------------------------------------------ | ----------------------------------- | ---------- |
|
|
58
|
+
* | constructors | {@link module:MutableHashSet.empty} | Creates an empty MutableHashSet | O(1) |
|
|
59
|
+
* | constructors | {@link module:MutableHashSet.fromIterable} | Creates a set from an iterable | O(n) |
|
|
60
|
+
* | constructors | {@link module:MutableHashSet.make} | Creates a set from multiple values | O(n) |
|
|
61
|
+
* | | | | |
|
|
62
|
+
* | elements | {@link module:MutableHashSet.has} | Checks if a value exists in the set | O(1) avg |
|
|
63
|
+
* | elements | {@link module:MutableHashSet.add} | Adds a value to the set | O(1) avg |
|
|
64
|
+
* | elements | {@link module:MutableHashSet.remove} | Removes a value from the set | O(1) avg |
|
|
65
|
+
* | elements | {@link module:MutableHashSet.size} | Gets the number of elements | O(1) |
|
|
66
|
+
* | elements | {@link module:MutableHashSet.clear} | Removes all values from the set | O(1) |
|
|
67
|
+
*
|
|
68
|
+
* ## Notes
|
|
69
|
+
*
|
|
70
|
+
* ### Mutability Considerations:
|
|
71
|
+
*
|
|
72
|
+
* Unlike most data structures in the Effect ecosystem, `MutableHashSet` is
|
|
73
|
+
* mutable. This means that operations like `add`, `remove`, and `clear` modify
|
|
74
|
+
* the original set rather than creating a new one. This can lead to more
|
|
75
|
+
* efficient code in some scenarios, but requires careful handling to avoid
|
|
76
|
+
* unexpected side effects.
|
|
77
|
+
*
|
|
78
|
+
* ### When to Choose `MutableHashSet` vs {@link module:HashSet}:
|
|
79
|
+
*
|
|
80
|
+
* - Use `MutableHashSet` when you need to build or modify a set incrementally and
|
|
81
|
+
* performance is a priority
|
|
82
|
+
* - Use `HashSet` when you want immutability guarantees and functional
|
|
83
|
+
* programming patterns
|
|
84
|
+
* - Consider using {@link module:HashSet}'s bounded mutation context (via
|
|
85
|
+
* {@link module:HashSet.beginMutation}, {@link module:HashSet.endMutation}, and
|
|
86
|
+
* {@link module:HashSet.mutate} methods) when you need temporary mutability
|
|
87
|
+
* within an otherwise immutable context - this approach might be sufficient
|
|
88
|
+
* for many use cases without requiring a separate `MutableHashSet`
|
|
89
|
+
* - `MutableHashSet` is often useful for local operations where the mutability is
|
|
90
|
+
* contained and doesn't leak into the broader application
|
|
91
|
+
*
|
|
92
|
+
* @module MutableHashSet
|
|
93
|
+
* @since 2.0.0
|
|
94
|
+
*/
|
|
95
|
+
import * as Dual from "./Function.js"
|
|
96
|
+
import { format, type Inspectable, NodeInspectSymbol, toJSON } from "./Inspectable.js"
|
|
97
|
+
import * as MutableHashMap from "./MutableHashMap.js"
|
|
98
|
+
import type { Pipeable } from "./Pipeable.js"
|
|
99
|
+
import { pipeArguments } from "./Pipeable.js"
|
|
100
|
+
|
|
101
|
+
const TypeId: unique symbol = Symbol.for("effect/MutableHashSet") as TypeId
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @since 2.0.0
|
|
105
|
+
* @category symbol
|
|
106
|
+
*/
|
|
107
|
+
export type TypeId = typeof TypeId
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @since 2.0.0
|
|
111
|
+
* @category models
|
|
112
|
+
*/
|
|
113
|
+
export interface MutableHashSet<out V> extends Iterable<V>, Pipeable, Inspectable {
|
|
114
|
+
readonly [TypeId]: TypeId
|
|
115
|
+
|
|
116
|
+
/** @internal */
|
|
117
|
+
readonly keyMap: MutableHashMap.MutableHashMap<V, boolean>
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const MutableHashSetProto: Omit<MutableHashSet<unknown>, "keyMap"> = {
|
|
121
|
+
[TypeId]: TypeId,
|
|
122
|
+
[Symbol.iterator](this: MutableHashSet<unknown>): Iterator<unknown> {
|
|
123
|
+
return Array.from(this.keyMap)
|
|
124
|
+
.map(([_]) => _)[Symbol.iterator]()
|
|
125
|
+
},
|
|
126
|
+
toString() {
|
|
127
|
+
return format(this.toJSON())
|
|
128
|
+
},
|
|
129
|
+
toJSON() {
|
|
130
|
+
return {
|
|
131
|
+
_id: "MutableHashSet",
|
|
132
|
+
values: Array.from(this).map(toJSON)
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
[NodeInspectSymbol]() {
|
|
136
|
+
return this.toJSON()
|
|
137
|
+
},
|
|
138
|
+
pipe() {
|
|
139
|
+
return pipeArguments(this, arguments)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const fromHashMap = <V>(
|
|
144
|
+
keyMap: MutableHashMap.MutableHashMap<V, boolean>
|
|
145
|
+
): MutableHashSet<V> => {
|
|
146
|
+
const set = Object.create(MutableHashSetProto)
|
|
147
|
+
set.keyMap = keyMap
|
|
148
|
+
return set
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Creates an empty mutable hash set.
|
|
153
|
+
*
|
|
154
|
+
* This function initializes and returns an empty `MutableHashSet` instance,
|
|
155
|
+
* which allows for efficient storage and manipulation of unique elements.
|
|
156
|
+
*
|
|
157
|
+
* Time complexity: **`O(1)`**
|
|
158
|
+
*
|
|
159
|
+
* @memberof MutableHashSet
|
|
160
|
+
* @since 2.0.0
|
|
161
|
+
* @category constructors
|
|
162
|
+
* @example
|
|
163
|
+
*
|
|
164
|
+
* ```ts
|
|
165
|
+
* import { MutableHashSet } from "effect"
|
|
166
|
+
*
|
|
167
|
+
* type T = unknown // replace with your type
|
|
168
|
+
*
|
|
169
|
+
* // in places where the type can't be inferred, replace with your type
|
|
170
|
+
* const set: MutableHashSet.MutableHashSet<T> = MutableHashSet.empty<T>()
|
|
171
|
+
* ```
|
|
172
|
+
*
|
|
173
|
+
* @template K - The type of the elements to be stored in the hash set. Defaults
|
|
174
|
+
* to `never` if not specified.
|
|
175
|
+
* @returns A new mutable instance of `MutableHashSet` containing no elements
|
|
176
|
+
* for the specified type `K`.
|
|
177
|
+
* @see Other `MutableHashSet` constructors are {@link module:MutableHashSet.make} {@link module:MutableHashSet.fromIterable}
|
|
178
|
+
*/
|
|
179
|
+
export const empty = <K = never>(): MutableHashSet<K> => fromHashMap(MutableHashMap.empty())
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Creates a new `MutableHashSet` from an iterable collection of values.
|
|
183
|
+
* Duplicate values are omitted.
|
|
184
|
+
*
|
|
185
|
+
* Time complexity: **`O(n)`** where n is the number of elements in the iterable
|
|
186
|
+
*
|
|
187
|
+
* Creating a `MutableHashSet` from an {@link Array}
|
|
188
|
+
*
|
|
189
|
+
* ```ts
|
|
190
|
+
* import { MutableHashSet } from "effect"
|
|
191
|
+
*
|
|
192
|
+
* const array: Iterable<number> = [1, 2, 3, 4, 5, 1, 2, 3] // Array<T> is also Iterable<T>
|
|
193
|
+
* const mutableHashSet: MutableHashSet.MutableHashSet<number> =
|
|
194
|
+
* MutableHashSet.fromIterable(array)
|
|
195
|
+
*
|
|
196
|
+
* console.log(
|
|
197
|
+
* // MutableHashSet.MutableHashSet<T> is also an Iterable<T>
|
|
198
|
+
* Array.from(mutableHashSet)
|
|
199
|
+
* ) // Output: [1, 2, 3, 4, 5]
|
|
200
|
+
* ```
|
|
201
|
+
*
|
|
202
|
+
* Creating a `MutableHashSet` from a {@link Set}
|
|
203
|
+
*
|
|
204
|
+
* ```ts
|
|
205
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
206
|
+
*
|
|
207
|
+
* console.log(
|
|
208
|
+
* pipe(
|
|
209
|
+
* // Set<string> is an Iterable<string>
|
|
210
|
+
* new Set(["apple", "banana", "orange", "apple"]),
|
|
211
|
+
* // constructs MutableHashSet from an Iterable Set
|
|
212
|
+
* MutableHashSet.fromIterable,
|
|
213
|
+
* // since MutableHashSet it is itself an Iterable, we can pass it to other functions expecting an Iterable
|
|
214
|
+
* Array.from
|
|
215
|
+
* )
|
|
216
|
+
* ) // Output: ["apple", "banana", "orange"]
|
|
217
|
+
* ```
|
|
218
|
+
*
|
|
219
|
+
* Creating a `MutableHashSet` from a {@link Generator}
|
|
220
|
+
*
|
|
221
|
+
* ```ts
|
|
222
|
+
* import { MutableHashSet } from "effect"
|
|
223
|
+
*
|
|
224
|
+
* // Generator functions return iterables
|
|
225
|
+
* function* fibonacci(n: number): Generator<number, void, never> {
|
|
226
|
+
* let [a, b] = [0, 1]
|
|
227
|
+
* for (let i = 0; i < n; i++) {
|
|
228
|
+
* yield a
|
|
229
|
+
* ;[a, b] = [b, a + b]
|
|
230
|
+
* }
|
|
231
|
+
* }
|
|
232
|
+
*
|
|
233
|
+
* // Create a MutableHashSet from the first 10 Fibonacci numbers
|
|
234
|
+
* const fibonacciSet = MutableHashSet.fromIterable(fibonacci(10))
|
|
235
|
+
*
|
|
236
|
+
* console.log(Array.from(fibonacciSet))
|
|
237
|
+
* // Outputs: [0, 1, 2, 3, 5, 8, 13, 21, 34] but in unsorted order
|
|
238
|
+
* ```
|
|
239
|
+
*
|
|
240
|
+
* Creating a `MutableHashSet` from another {@link module:MutableHashSet}
|
|
241
|
+
*
|
|
242
|
+
* ```ts
|
|
243
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
244
|
+
*
|
|
245
|
+
* console.log(
|
|
246
|
+
* pipe(
|
|
247
|
+
* MutableHashSet.make(1, 2, 3, 4),
|
|
248
|
+
* MutableHashSet.fromIterable,
|
|
249
|
+
* Array.from
|
|
250
|
+
* )
|
|
251
|
+
* ) // Output: [1, 2, 3, 4]
|
|
252
|
+
* ```
|
|
253
|
+
*
|
|
254
|
+
* Creating a `MutableHashSet` from an {@link module:HashSet}
|
|
255
|
+
*
|
|
256
|
+
* ```ts
|
|
257
|
+
* import { HashSet, MutableHashSet, pipe } from "effect"
|
|
258
|
+
*
|
|
259
|
+
* console.log(
|
|
260
|
+
* pipe(
|
|
261
|
+
* HashSet.make(1, 2, 3, 4), // it works also with its immutable HashSet sibling
|
|
262
|
+
* MutableHashSet.fromIterable,
|
|
263
|
+
* Array.from
|
|
264
|
+
* )
|
|
265
|
+
* ) // Output: [1, 2, 3, 4]
|
|
266
|
+
* ```
|
|
267
|
+
*
|
|
268
|
+
* Creating a `MutableHashSet` from other Effect's data structures like
|
|
269
|
+
* {@link Chunk}
|
|
270
|
+
*
|
|
271
|
+
* ```ts
|
|
272
|
+
* import { Chunk, MutableHashSet, pipe } from "effect"
|
|
273
|
+
*
|
|
274
|
+
* console.log(
|
|
275
|
+
* pipe(
|
|
276
|
+
* Chunk.make(1, 2, 3, 4), // Chunk is also an Iterable<T>
|
|
277
|
+
* MutableHashSet.fromIterable,
|
|
278
|
+
* Array.from
|
|
279
|
+
* )
|
|
280
|
+
* ) // Outputs: [1, 2, 3, 4]
|
|
281
|
+
* ```
|
|
282
|
+
*
|
|
283
|
+
* @memberof MutableHashSet
|
|
284
|
+
* @since 2.0.0
|
|
285
|
+
* @category constructors
|
|
286
|
+
* @template K - The type of elements to be stored in the resulting
|
|
287
|
+
* `MutableHashSet`.
|
|
288
|
+
* @param keys - An `Iterable` collection containing the keys to be added to the
|
|
289
|
+
* `MutableHashSet`.
|
|
290
|
+
* @returns A new `MutableHashSet` containing just the unique elements from the
|
|
291
|
+
* provided iterable.
|
|
292
|
+
* @see Other `MutableHashSet` constructors are {@link module:MutableHashSet.empty} {@link module:MutableHashSet.make}
|
|
293
|
+
*/
|
|
294
|
+
export const fromIterable = <K = never>(keys: Iterable<K>): MutableHashSet<K> =>
|
|
295
|
+
fromHashMap(
|
|
296
|
+
MutableHashMap.fromIterable(Array.from(keys).map((k) => [k, true]))
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Construct a new `MutableHashSet` from a variable number of values.
|
|
301
|
+
*
|
|
302
|
+
* Time complexity: **`O(n)`** where n is the number of elements
|
|
303
|
+
*
|
|
304
|
+
* @memberof MutableHashSet
|
|
305
|
+
* @since 2.0.0
|
|
306
|
+
* @category constructors
|
|
307
|
+
* @example
|
|
308
|
+
*
|
|
309
|
+
* ```ts
|
|
310
|
+
* import { Equal, Hash, MutableHashSet } from "effect"
|
|
311
|
+
* import assert from "node:assert/strict"
|
|
312
|
+
*
|
|
313
|
+
* class Character implements Equal.Equal {
|
|
314
|
+
* readonly name: string
|
|
315
|
+
* readonly trait: string
|
|
316
|
+
*
|
|
317
|
+
* constructor(name: string, trait: string) {
|
|
318
|
+
* this.name = name
|
|
319
|
+
* this.trait = trait
|
|
320
|
+
* }
|
|
321
|
+
*
|
|
322
|
+
* // Define equality based on name, and trait
|
|
323
|
+
* [Equal.symbol](that: Equal.Equal): boolean {
|
|
324
|
+
* if (that instanceof Character) {
|
|
325
|
+
* return (
|
|
326
|
+
* Equal.equals(this.name, that.name) &&
|
|
327
|
+
* Equal.equals(this.trait, that.trait)
|
|
328
|
+
* )
|
|
329
|
+
* }
|
|
330
|
+
* return false
|
|
331
|
+
* }
|
|
332
|
+
*
|
|
333
|
+
* // Generate a hash code based on the sum of the character's name and trait
|
|
334
|
+
* [Hash.symbol](): number {
|
|
335
|
+
* return Hash.hash(this.name + this.trait)
|
|
336
|
+
* }
|
|
337
|
+
*
|
|
338
|
+
* static readonly of = (name: string, trait: string): Character => {
|
|
339
|
+
* return new Character(name, trait)
|
|
340
|
+
* }
|
|
341
|
+
* }
|
|
342
|
+
*
|
|
343
|
+
* const mutableCharacterHashSet = MutableHashSet.make(
|
|
344
|
+
* Character.of("Alice", "Curious"),
|
|
345
|
+
* Character.of("Alice", "Curious"),
|
|
346
|
+
* Character.of("White Rabbit", "Always late"),
|
|
347
|
+
* Character.of("Mad Hatter", "Tea enthusiast")
|
|
348
|
+
* )
|
|
349
|
+
*
|
|
350
|
+
* assert.equal(
|
|
351
|
+
* MutableHashSet.has(
|
|
352
|
+
* mutableCharacterHashSet,
|
|
353
|
+
* Character.of("Alice", "Curious")
|
|
354
|
+
* ),
|
|
355
|
+
* true
|
|
356
|
+
* )
|
|
357
|
+
* assert.equal(
|
|
358
|
+
* MutableHashSet.has(
|
|
359
|
+
* mutableCharacterHashSet,
|
|
360
|
+
* Character.of("Fluffy", "Kind")
|
|
361
|
+
* ),
|
|
362
|
+
* false
|
|
363
|
+
* )
|
|
364
|
+
* ```
|
|
365
|
+
*
|
|
366
|
+
* @see Other `MutableHashSet` constructors are {@link module:MutableHashSet.fromIterable} {@link module:MutableHashSet.empty}
|
|
367
|
+
*/
|
|
368
|
+
export const make = <Keys extends ReadonlyArray<unknown>>(
|
|
369
|
+
...keys: Keys
|
|
370
|
+
): MutableHashSet<Keys[number]> => fromIterable(keys)
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* **Checks** whether the `MutableHashSet` contains the given element, and
|
|
374
|
+
* **adds** it if not.
|
|
375
|
+
*
|
|
376
|
+
* Time complexity: **`O(1)`** average
|
|
377
|
+
*
|
|
378
|
+
* **Syntax**
|
|
379
|
+
*
|
|
380
|
+
* ```ts
|
|
381
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
382
|
+
*
|
|
383
|
+
* // with data-last, a.k.a. pipeable API
|
|
384
|
+
* pipe(
|
|
385
|
+
* MutableHashSet.empty(),
|
|
386
|
+
* MutableHashSet.add(0),
|
|
387
|
+
* MutableHashSet.add(0)
|
|
388
|
+
* )
|
|
389
|
+
*
|
|
390
|
+
* // or piped with the pipe function
|
|
391
|
+
* MutableHashSet.empty().pipe(MutableHashSet.add(0))
|
|
392
|
+
*
|
|
393
|
+
* // or with data-first API
|
|
394
|
+
* MutableHashSet.add(MutableHashSet.empty(), 0)
|
|
395
|
+
* ```
|
|
396
|
+
*
|
|
397
|
+
* @memberof MutableHashSet
|
|
398
|
+
* @since 2.0.0
|
|
399
|
+
* @category elements
|
|
400
|
+
* @see Other `MutableHashSet` elements are {@link module:MutableHashSet.remove} {@link module:MutableHashSet.size} {@link module:MutableHashSet.clear} {@link module:MutableHashSet.has}
|
|
401
|
+
*/
|
|
402
|
+
export const add: {
|
|
403
|
+
/**
|
|
404
|
+
* `data-last` a.k.a. `pipeable` API
|
|
405
|
+
*
|
|
406
|
+
* ```ts
|
|
407
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
408
|
+
* import assert from "node:assert/strict"
|
|
409
|
+
*
|
|
410
|
+
* const mutableHashSet = pipe(
|
|
411
|
+
* MutableHashSet.empty<number>(), // MutableHashSet.MutableHashSet<number>
|
|
412
|
+
* MutableHashSet.add(0),
|
|
413
|
+
* MutableHashSet.add(1),
|
|
414
|
+
* MutableHashSet.add(1),
|
|
415
|
+
* MutableHashSet.add(2)
|
|
416
|
+
* )
|
|
417
|
+
*
|
|
418
|
+
* assert.deepStrictEqual(
|
|
419
|
+
* Array.from(mutableHashSet), // remember that MutableHashSet is also an Iterable
|
|
420
|
+
* Array.of(0, 1, 2)
|
|
421
|
+
* )
|
|
422
|
+
* ```
|
|
423
|
+
*
|
|
424
|
+
* @template V - The type of elements stored in the `MutableHashSet`.
|
|
425
|
+
* @param key - The key to be added to the `MutableHashSet` if not already
|
|
426
|
+
* present.
|
|
427
|
+
* @returns A function that accepts a `MutableHashSet` and returns the
|
|
428
|
+
* reference of the updated `MutableHashSet` including the key.
|
|
429
|
+
*/
|
|
430
|
+
<V>(key: V): (self: MutableHashSet<V>) => MutableHashSet<V>
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* `data-first` API
|
|
434
|
+
*
|
|
435
|
+
* ```ts
|
|
436
|
+
* import { MutableHashSet } from "effect"
|
|
437
|
+
* import assert from "node:assert/strict"
|
|
438
|
+
*
|
|
439
|
+
* const empty = MutableHashSet.empty<number>()
|
|
440
|
+
* const withZero = MutableHashSet.add(empty, 0)
|
|
441
|
+
* const withOne = MutableHashSet.add(withZero, 1)
|
|
442
|
+
* const withTwo = MutableHashSet.add(withOne, 2)
|
|
443
|
+
* const withTwoTwo = MutableHashSet.add(withTwo, 2)
|
|
444
|
+
*
|
|
445
|
+
* assert(Object.is(withTwoTwo, empty)) // proof that it does mutate the original set
|
|
446
|
+
*
|
|
447
|
+
* assert.deepStrictEqual(
|
|
448
|
+
* Array.from(withTwoTwo), // remember that MutableHashSet is also an Iterable
|
|
449
|
+
* Array.of(0, 1, 2)
|
|
450
|
+
* )
|
|
451
|
+
* ```
|
|
452
|
+
*
|
|
453
|
+
* @template V - The type of elements stored in the `MutableHashSet`.
|
|
454
|
+
* @param self - The `MutableHashSet` instance from which the key should be
|
|
455
|
+
* added to.
|
|
456
|
+
* @param key - The key to be added to the `MutableHashSet` if not already
|
|
457
|
+
* present.
|
|
458
|
+
* @returns The reference of the updated `MutableHashSet` including the key.
|
|
459
|
+
*/
|
|
460
|
+
<V>(self: MutableHashSet<V>, key: V): MutableHashSet<V>
|
|
461
|
+
} = Dual.dual<
|
|
462
|
+
<V>(key: V) => (self: MutableHashSet<V>) => MutableHashSet<V>,
|
|
463
|
+
<V>(self: MutableHashSet<V>, key: V) => MutableHashSet<V>
|
|
464
|
+
>(2, (self, key) => (MutableHashMap.set(self.keyMap, key, true), self))
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Checks if the specified value exists in the `MutableHashSet`.
|
|
468
|
+
*
|
|
469
|
+
* Time complexity: `O(1)` average
|
|
470
|
+
*
|
|
471
|
+
* **Syntax**
|
|
472
|
+
*
|
|
473
|
+
* ```ts
|
|
474
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
475
|
+
* import assert from "node:assert/strict"
|
|
476
|
+
*
|
|
477
|
+
* assert.equal(
|
|
478
|
+
* // with `data-last`, a.k.a. `pipeable` API
|
|
479
|
+
* pipe(MutableHashSet.make(0, 1, 2), MutableHashSet.has(3)),
|
|
480
|
+
* false
|
|
481
|
+
* )
|
|
482
|
+
*
|
|
483
|
+
* assert.equal(
|
|
484
|
+
* // or piped with the pipe function
|
|
485
|
+
* MutableHashSet.make(0, 1, 2).pipe(MutableHashSet.has(3)),
|
|
486
|
+
* false
|
|
487
|
+
* )
|
|
488
|
+
*
|
|
489
|
+
* assert.equal(
|
|
490
|
+
* // or with `data-first` API
|
|
491
|
+
* MutableHashSet.has(MutableHashSet.make(0, 1, 2), 3),
|
|
492
|
+
* false
|
|
493
|
+
* )
|
|
494
|
+
* ```
|
|
495
|
+
*
|
|
496
|
+
* @memberof MutableHashSet
|
|
497
|
+
* @since 2.0.0
|
|
498
|
+
* @category elements
|
|
499
|
+
* @see Other `MutableHashSet` elements are {@link module:MutableHashSet.add} {@link module:MutableHashSet.remove} {@link module:MutableHashSet.size} {@link module:MutableHashSet.clear}
|
|
500
|
+
*/
|
|
501
|
+
export const has: {
|
|
502
|
+
/**
|
|
503
|
+
* `data-last` a.k.a. `pipeable` API
|
|
504
|
+
*
|
|
505
|
+
* ```ts
|
|
506
|
+
* import * as assert from "node:assert/strict"
|
|
507
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
508
|
+
*
|
|
509
|
+
* const set = MutableHashSet.make(0, 1, 2)
|
|
510
|
+
*
|
|
511
|
+
* assert.equal(pipe(set, MutableHashSet.has(0)), true)
|
|
512
|
+
* assert.equal(pipe(set, MutableHashSet.has(1)), true)
|
|
513
|
+
* assert.equal(pipe(set, MutableHashSet.has(2)), true)
|
|
514
|
+
* assert.equal(pipe(set, MutableHashSet.has(3)), false)
|
|
515
|
+
* ```
|
|
516
|
+
*/
|
|
517
|
+
<V>(key: V): (self: MutableHashSet<V>) => boolean
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* `data-first` API
|
|
521
|
+
*
|
|
522
|
+
* ```ts
|
|
523
|
+
* import * as assert from "node:assert/strict"
|
|
524
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
525
|
+
*
|
|
526
|
+
* const set = MutableHashSet.make(0, 1, 2)
|
|
527
|
+
*
|
|
528
|
+
* assert.equal(MutableHashSet.has(set, 0), true)
|
|
529
|
+
* assert.equal(MutableHashSet.has(set, 1), true)
|
|
530
|
+
* assert.equal(MutableHashSet.has(set, 2), true)
|
|
531
|
+
* assert.equal(MutableHashSet.has(set, 3), false)
|
|
532
|
+
* ```
|
|
533
|
+
*/
|
|
534
|
+
<V>(self: MutableHashSet<V>, key: V): boolean
|
|
535
|
+
} = Dual.dual<
|
|
536
|
+
<V>(key: V) => (self: MutableHashSet<V>) => boolean,
|
|
537
|
+
<V>(self: MutableHashSet<V>, key: V) => boolean
|
|
538
|
+
>(2, (self, key) => MutableHashMap.has(self.keyMap, key))
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Removes a value from the `MutableHashSet`.
|
|
542
|
+
*
|
|
543
|
+
* Time complexity: **`O(1)`** average
|
|
544
|
+
*
|
|
545
|
+
* **Syntax**
|
|
546
|
+
*
|
|
547
|
+
* ```ts
|
|
548
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
549
|
+
* import assert from "node:assert/strict"
|
|
550
|
+
*
|
|
551
|
+
* assert.equal(
|
|
552
|
+
* // with `data-last`, a.k.a. `pipeable` API
|
|
553
|
+
* pipe(
|
|
554
|
+
* MutableHashSet.make(0, 1, 2),
|
|
555
|
+
* MutableHashSet.remove(0),
|
|
556
|
+
* MutableHashSet.has(0)
|
|
557
|
+
* ),
|
|
558
|
+
* false
|
|
559
|
+
* )
|
|
560
|
+
*
|
|
561
|
+
* assert.equal(
|
|
562
|
+
* // or piped with the pipe function
|
|
563
|
+
* MutableHashSet.make(0, 1, 2).pipe(
|
|
564
|
+
* MutableHashSet.remove(0),
|
|
565
|
+
* MutableHashSet.has(0)
|
|
566
|
+
* ),
|
|
567
|
+
* false
|
|
568
|
+
* )
|
|
569
|
+
*
|
|
570
|
+
* assert.equal(
|
|
571
|
+
* // or with `data-first` API
|
|
572
|
+
* MutableHashSet.remove(MutableHashSet.make(0, 1, 2), 0).pipe(
|
|
573
|
+
* MutableHashSet.has(0)
|
|
574
|
+
* ),
|
|
575
|
+
* false
|
|
576
|
+
* )
|
|
577
|
+
* ```
|
|
578
|
+
*
|
|
579
|
+
* @memberof MutableHashSet
|
|
580
|
+
* @since 2.0.0
|
|
581
|
+
* @category elements
|
|
582
|
+
* @see Other `MutableHashSet` elements are {@link module:MutableHashSet.add} {@link module:MutableHashSet.has} {@link module:MutableHashSet.size} {@link module:MutableHashSet.clear}
|
|
583
|
+
*/
|
|
584
|
+
export const remove: {
|
|
585
|
+
/**
|
|
586
|
+
* `data-last` a.k.a. `pipeable` API
|
|
587
|
+
*
|
|
588
|
+
* ```ts
|
|
589
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
590
|
+
* import assert from "node:assert/strict"
|
|
591
|
+
*
|
|
592
|
+
* const set: MutableHashSet.MutableHashSet<number> = MutableHashSet.make(
|
|
593
|
+
* 0,
|
|
594
|
+
* 1,
|
|
595
|
+
* 2
|
|
596
|
+
* )
|
|
597
|
+
* const result: MutableHashSet.MutableHashSet<number> = pipe(
|
|
598
|
+
* set,
|
|
599
|
+
* MutableHashSet.remove(0)
|
|
600
|
+
* )
|
|
601
|
+
*
|
|
602
|
+
* assert(Object.is(set, result)) // set and result have the same identity
|
|
603
|
+
* assert.equal(pipe(result, MutableHashSet.has(0)), false) // it has correctly removed 0
|
|
604
|
+
* assert.equal(pipe(set, MutableHashSet.has(0)), false) // another proof that we are mutating the original MutableHashSet
|
|
605
|
+
* assert.equal(pipe(result, MutableHashSet.has(1)), true)
|
|
606
|
+
* assert.equal(pipe(result, MutableHashSet.has(2)), true)
|
|
607
|
+
* ```
|
|
608
|
+
*
|
|
609
|
+
* @template V - The type of the elements in the `MutableHashSet`.
|
|
610
|
+
* @param key - The key to be removed from the `MutableHashSet`.
|
|
611
|
+
* @returns A function that takes a `MutableHashSet` as input and returns the
|
|
612
|
+
* reference to the same `MutableHashSet` with the specified key removed.
|
|
613
|
+
*/
|
|
614
|
+
<V>(key: V): (self: MutableHashSet<V>) => MutableHashSet<V>
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* `data-first` API
|
|
618
|
+
*
|
|
619
|
+
* ```ts
|
|
620
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
621
|
+
* import assert from "node:assert/strict"
|
|
622
|
+
*
|
|
623
|
+
* const set = MutableHashSet.make(0, 1, 2)
|
|
624
|
+
* const result = MutableHashSet.remove(set, 0)
|
|
625
|
+
*
|
|
626
|
+
* assert(Object.is(set, result)) // set and result have the same identity
|
|
627
|
+
* assert.equal(MutableHashSet.has(result, 0), false) // it has correctly removed 0
|
|
628
|
+
* assert.equal(MutableHashSet.has(set, 0), false) // it mutates the original MutableHashSet
|
|
629
|
+
* assert.equal(MutableHashSet.has(result, 1), true)
|
|
630
|
+
* assert.equal(MutableHashSet.has(result, 2), true)
|
|
631
|
+
* ```
|
|
632
|
+
*
|
|
633
|
+
* @template V - The type of the elements in the `MutableHashSet`.
|
|
634
|
+
* @param self - The `MutableHashSet` to which the key will be removed from.
|
|
635
|
+
* @param key - The value to be removed from the `MutableHashSet` if present.
|
|
636
|
+
* @returns The reference to the updated `MutableHashSet`.
|
|
637
|
+
*/
|
|
638
|
+
<V>(self: MutableHashSet<V>, key: V): MutableHashSet<V>
|
|
639
|
+
} = Dual.dual<
|
|
640
|
+
<V>(key: V) => (self: MutableHashSet<V>) => MutableHashSet<V>,
|
|
641
|
+
<V>(self: MutableHashSet<V>, key: V) => MutableHashSet<V>
|
|
642
|
+
>(2, (self, key) => (MutableHashMap.remove(self.keyMap, key), self))
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Calculates the number of values in the `HashSet`.
|
|
646
|
+
*
|
|
647
|
+
* Time complexity: **`O(1)`**
|
|
648
|
+
*
|
|
649
|
+
* @memberof MutableHashSet
|
|
650
|
+
* @since 2.0.0
|
|
651
|
+
* @category elements
|
|
652
|
+
* @example
|
|
653
|
+
*
|
|
654
|
+
* ```ts
|
|
655
|
+
* import { MutableHashSet } from "effect"
|
|
656
|
+
* import assert from "node:assert/strict"
|
|
657
|
+
*
|
|
658
|
+
* assert.equal(MutableHashSet.size(MutableHashSet.empty()), 0)
|
|
659
|
+
*
|
|
660
|
+
* assert.equal(
|
|
661
|
+
* MutableHashSet.size(MutableHashSet.make(1, 2, 2, 3, 4, 3)),
|
|
662
|
+
* 4
|
|
663
|
+
* )
|
|
664
|
+
* ```
|
|
665
|
+
*
|
|
666
|
+
* @template V - The type of the elements to be stored in the `MutableHashSet`.
|
|
667
|
+
* @param self - The `MutableHashSet` instance for which the size is to be
|
|
668
|
+
* determined.
|
|
669
|
+
* @returns The total number of elements within the `MutableHashSet`.
|
|
670
|
+
* @see Other `MutableHashSet` elements are {@link module:MutableHashSet.add} {@link module:MutableHashSet.has} {@link module:MutableHashSet.remove} {@link module:MutableHashSet.clear}
|
|
671
|
+
*/
|
|
672
|
+
export const size = <V>(self: MutableHashSet<V>): number => MutableHashMap.size(self.keyMap)
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* Removes all values from the `MutableHashSet`.
|
|
676
|
+
*
|
|
677
|
+
* This function operates by delegating the clearing action to the underlying
|
|
678
|
+
* key map associated with the given `MutableHashSet`. It ensures that the hash
|
|
679
|
+
* set becomes empty while maintaining its existence and structure.
|
|
680
|
+
*
|
|
681
|
+
* @memberof MutableHashSet
|
|
682
|
+
* @since 2.0.0
|
|
683
|
+
* @category elements
|
|
684
|
+
* @example
|
|
685
|
+
*
|
|
686
|
+
* ```ts
|
|
687
|
+
* import { MutableHashSet, pipe } from "effect"
|
|
688
|
+
* import assert from "node:assert/strict"
|
|
689
|
+
*
|
|
690
|
+
* assert.deepStrictEqual(
|
|
691
|
+
* pipe(
|
|
692
|
+
* MutableHashSet.make(1, 2, 3, 4),
|
|
693
|
+
* MutableHashSet.clear,
|
|
694
|
+
* MutableHashSet.size
|
|
695
|
+
* ),
|
|
696
|
+
* 0
|
|
697
|
+
* )
|
|
698
|
+
* ```
|
|
699
|
+
*
|
|
700
|
+
* @param self - The `MutableHashSet` to clear.
|
|
701
|
+
* @returns The same `MutableHashSet` after all elements have been removed.
|
|
702
|
+
* @see Other `MutableHashSet` elements are {@link module:MutableHashSet.add} {@link module:MutableHashSet.has} {@link module:MutableHashSet.remove} {@link module:MutableHashSet.size}
|
|
703
|
+
*/
|
|
704
|
+
export const clear = <V>(self: MutableHashSet<V>): MutableHashSet<V> => (
|
|
705
|
+
MutableHashMap.clear(self.keyMap), self
|
|
706
|
+
)
|