@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
package/src/Encoding.ts
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module provides encoding & decoding functionality for:
|
|
3
|
+
*
|
|
4
|
+
* - base64 (RFC4648)
|
|
5
|
+
* - base64 (URL)
|
|
6
|
+
* - hex
|
|
7
|
+
*
|
|
8
|
+
* @since 2.0.0
|
|
9
|
+
*/
|
|
10
|
+
import * as Either from "./Either.js"
|
|
11
|
+
import * as Base64 from "./internal/encoding/base64.js"
|
|
12
|
+
import * as Base64Url from "./internal/encoding/base64Url.js"
|
|
13
|
+
import * as Common from "./internal/encoding/common.js"
|
|
14
|
+
import * as Hex from "./internal/encoding/hex.js"
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Encodes the given value into a base64 (RFC4648) `string`.
|
|
18
|
+
*
|
|
19
|
+
* @category encoding
|
|
20
|
+
* @since 2.0.0
|
|
21
|
+
*/
|
|
22
|
+
export const encodeBase64: (input: Uint8Array | string) => string = (input) =>
|
|
23
|
+
typeof input === "string" ? Base64.encode(Common.encoder.encode(input)) : Base64.encode(input)
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Decodes a base64 (RFC4648) encoded `string` into a `Uint8Array`.
|
|
27
|
+
*
|
|
28
|
+
* @category decoding
|
|
29
|
+
* @since 2.0.0
|
|
30
|
+
*/
|
|
31
|
+
export const decodeBase64 = (str: string): Either.Either<Uint8Array, DecodeException> => Base64.decode(str)
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Decodes a base64 (RFC4648) encoded `string` into a UTF-8 `string`.
|
|
35
|
+
*
|
|
36
|
+
* @category decoding
|
|
37
|
+
* @since 2.0.0
|
|
38
|
+
*/
|
|
39
|
+
export const decodeBase64String = (str: string) => Either.map(decodeBase64(str), (_) => Common.decoder.decode(_))
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Encodes the given value into a base64 (URL) `string`.
|
|
43
|
+
*
|
|
44
|
+
* @category encoding
|
|
45
|
+
* @since 2.0.0
|
|
46
|
+
*/
|
|
47
|
+
export const encodeBase64Url: (input: Uint8Array | string) => string = (input) =>
|
|
48
|
+
typeof input === "string" ? Base64Url.encode(Common.encoder.encode(input)) : Base64Url.encode(input)
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Decodes a base64 (URL) encoded `string` into a `Uint8Array`.
|
|
52
|
+
*
|
|
53
|
+
* @category decoding
|
|
54
|
+
* @since 2.0.0
|
|
55
|
+
*/
|
|
56
|
+
export const decodeBase64Url = (str: string): Either.Either<Uint8Array, DecodeException> => Base64Url.decode(str)
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Decodes a base64 (URL) encoded `string` into a UTF-8 `string`.
|
|
60
|
+
*
|
|
61
|
+
* @category decoding
|
|
62
|
+
* @since 2.0.0
|
|
63
|
+
*/
|
|
64
|
+
export const decodeBase64UrlString = (str: string) => Either.map(decodeBase64Url(str), (_) => Common.decoder.decode(_))
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Encodes the given value into a hex `string`.
|
|
68
|
+
*
|
|
69
|
+
* @category encoding
|
|
70
|
+
* @since 2.0.0
|
|
71
|
+
*/
|
|
72
|
+
export const encodeHex: (input: Uint8Array | string) => string = (input) =>
|
|
73
|
+
typeof input === "string" ? Hex.encode(Common.encoder.encode(input)) : Hex.encode(input)
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Decodes a hex encoded `string` into a `Uint8Array`.
|
|
77
|
+
*
|
|
78
|
+
* @category decoding
|
|
79
|
+
* @since 2.0.0
|
|
80
|
+
*/
|
|
81
|
+
export const decodeHex = (str: string): Either.Either<Uint8Array, DecodeException> => Hex.decode(str)
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Decodes a hex encoded `string` into a UTF-8 `string`.
|
|
85
|
+
*
|
|
86
|
+
* @category decoding
|
|
87
|
+
* @since 2.0.0
|
|
88
|
+
*/
|
|
89
|
+
export const decodeHexString = (str: string) => Either.map(decodeHex(str), (_) => Common.decoder.decode(_))
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Encodes a UTF-8 `string` into a URI component `string`.
|
|
93
|
+
*
|
|
94
|
+
* @category encoding
|
|
95
|
+
* @since 3.12.0
|
|
96
|
+
*/
|
|
97
|
+
export const encodeUriComponent = (str: string): Either.Either<string, EncodeException> =>
|
|
98
|
+
Either.try({
|
|
99
|
+
try: () => encodeURIComponent(str),
|
|
100
|
+
catch: (e) => EncodeException(str, e instanceof Error ? e.message : "Invalid input")
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Decodes a URI component `string` into a UTF-8 `string`.
|
|
105
|
+
*
|
|
106
|
+
* @category decoding
|
|
107
|
+
* @since 3.12.0
|
|
108
|
+
*/
|
|
109
|
+
export const decodeUriComponent = (str: string): Either.Either<string, DecodeException> =>
|
|
110
|
+
Either.try({
|
|
111
|
+
try: () => decodeURIComponent(str),
|
|
112
|
+
catch: (e) => DecodeException(str, e instanceof Error ? e.message : "Invalid input")
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @since 2.0.0
|
|
117
|
+
* @category symbols
|
|
118
|
+
*/
|
|
119
|
+
export const DecodeExceptionTypeId: unique symbol = Common.DecodeExceptionTypeId
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @since 2.0.0
|
|
123
|
+
* @category symbols
|
|
124
|
+
*/
|
|
125
|
+
export type DecodeExceptionTypeId = typeof DecodeExceptionTypeId
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Represents a checked exception which occurs when decoding fails.
|
|
129
|
+
*
|
|
130
|
+
* @since 2.0.0
|
|
131
|
+
* @category models
|
|
132
|
+
*/
|
|
133
|
+
export interface DecodeException {
|
|
134
|
+
readonly _tag: "DecodeException"
|
|
135
|
+
readonly [DecodeExceptionTypeId]: DecodeExceptionTypeId
|
|
136
|
+
readonly input: string
|
|
137
|
+
readonly message?: string
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Creates a checked exception which occurs when decoding fails.
|
|
142
|
+
*
|
|
143
|
+
* @since 2.0.0
|
|
144
|
+
* @category errors
|
|
145
|
+
*/
|
|
146
|
+
export const DecodeException: (input: string, message?: string) => DecodeException = Common.DecodeException
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Returns `true` if the specified value is an `DecodeException`, `false` otherwise.
|
|
150
|
+
*
|
|
151
|
+
* @since 2.0.0
|
|
152
|
+
* @category refinements
|
|
153
|
+
*/
|
|
154
|
+
export const isDecodeException: (u: unknown) => u is DecodeException = Common.isDecodeException
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @since 3.12.0
|
|
158
|
+
* @category symbols
|
|
159
|
+
*/
|
|
160
|
+
export const EncodeExceptionTypeId: unique symbol = Common.EncodeExceptionTypeId
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* @since 3.12.0
|
|
164
|
+
* @category symbols
|
|
165
|
+
*/
|
|
166
|
+
export type EncodeExceptionTypeId = typeof EncodeExceptionTypeId
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Represents a checked exception which occurs when encoding fails.
|
|
170
|
+
*
|
|
171
|
+
* @since 3.12.0
|
|
172
|
+
* @category models
|
|
173
|
+
*/
|
|
174
|
+
export interface EncodeException {
|
|
175
|
+
readonly _tag: "EncodeException"
|
|
176
|
+
readonly [EncodeExceptionTypeId]: EncodeExceptionTypeId
|
|
177
|
+
readonly input: string
|
|
178
|
+
readonly message?: string
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Creates a checked exception which occurs when encoding fails.
|
|
183
|
+
*
|
|
184
|
+
* @since 3.12.0
|
|
185
|
+
* @category errors
|
|
186
|
+
*/
|
|
187
|
+
export const EncodeException: (input: string, message?: string) => EncodeException = Common.EncodeException
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Returns `true` if the specified value is an `EncodeException`, `false` otherwise.
|
|
191
|
+
*
|
|
192
|
+
* @since 3.12.0
|
|
193
|
+
* @category refinements
|
|
194
|
+
*/
|
|
195
|
+
export const isEncodeException: (u: unknown) => u is EncodeException = Common.isEncodeException
|
package/src/Equal.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type { Equivalence } from "./Equivalence.js"
|
|
5
|
+
import * as Hash from "./Hash.js"
|
|
6
|
+
import { hasProperty } from "./Predicate.js"
|
|
7
|
+
import { structuralRegionState } from "./Utils.js"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @since 2.0.0
|
|
11
|
+
* @category symbols
|
|
12
|
+
*/
|
|
13
|
+
export const symbol: unique symbol = Symbol.for("effect/Equal")
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @since 2.0.0
|
|
17
|
+
* @category models
|
|
18
|
+
*/
|
|
19
|
+
export interface Equal extends Hash.Hash {
|
|
20
|
+
[symbol](that: Equal): boolean
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @since 2.0.0
|
|
25
|
+
* @category equality
|
|
26
|
+
*/
|
|
27
|
+
export function equals<B>(that: B): <A>(self: A) => boolean
|
|
28
|
+
export function equals<A, B>(self: A, that: B): boolean
|
|
29
|
+
export function equals(): any {
|
|
30
|
+
if (arguments.length === 1) {
|
|
31
|
+
return (self: unknown) => compareBoth(self, arguments[0])
|
|
32
|
+
}
|
|
33
|
+
return compareBoth(arguments[0], arguments[1])
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function compareBoth(self: unknown, that: unknown): boolean {
|
|
37
|
+
if (self === that) {
|
|
38
|
+
return true
|
|
39
|
+
}
|
|
40
|
+
const selfType = typeof self
|
|
41
|
+
if (selfType !== typeof that) {
|
|
42
|
+
return false
|
|
43
|
+
}
|
|
44
|
+
if (selfType === "object" || selfType === "function") {
|
|
45
|
+
if (self !== null && that !== null) {
|
|
46
|
+
if (isEqual(self) && isEqual(that)) {
|
|
47
|
+
if (Hash.hash(self) === Hash.hash(that) && self[symbol](that)) {
|
|
48
|
+
return true
|
|
49
|
+
} else {
|
|
50
|
+
return structuralRegionState.enabled && structuralRegionState.tester
|
|
51
|
+
? structuralRegionState.tester(self, that)
|
|
52
|
+
: false
|
|
53
|
+
}
|
|
54
|
+
} else if (self instanceof Date && that instanceof Date) {
|
|
55
|
+
const t1 = self.getTime()
|
|
56
|
+
const t2 = that.getTime()
|
|
57
|
+
return t1 === t2 || (Number.isNaN(t1) && Number.isNaN(t2))
|
|
58
|
+
} else if (self instanceof URL && that instanceof URL) {
|
|
59
|
+
return self.href === that.href
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (structuralRegionState.enabled) {
|
|
63
|
+
if (Array.isArray(self) && Array.isArray(that)) {
|
|
64
|
+
return self.length === that.length && self.every((v, i) => compareBoth(v, that[i]))
|
|
65
|
+
}
|
|
66
|
+
if (Object.getPrototypeOf(self) === Object.prototype && Object.getPrototypeOf(self) === Object.prototype) {
|
|
67
|
+
const keysSelf = Object.keys(self as any)
|
|
68
|
+
const keysThat = Object.keys(that as any)
|
|
69
|
+
if (keysSelf.length === keysThat.length) {
|
|
70
|
+
for (const key of keysSelf) {
|
|
71
|
+
// @ts-expect-error
|
|
72
|
+
if (!(key in that && compareBoth(self[key], that[key]))) {
|
|
73
|
+
return structuralRegionState.tester ? structuralRegionState.tester(self, that) : false
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return true
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return structuralRegionState.tester ? structuralRegionState.tester(self, that) : false
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return structuralRegionState.enabled && structuralRegionState.tester
|
|
84
|
+
? structuralRegionState.tester(self, that)
|
|
85
|
+
: false
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @since 2.0.0
|
|
90
|
+
* @category guards
|
|
91
|
+
*/
|
|
92
|
+
export const isEqual = (u: unknown): u is Equal => hasProperty(u, symbol)
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @since 2.0.0
|
|
96
|
+
* @category instances
|
|
97
|
+
*/
|
|
98
|
+
export const equivalence: <A>() => Equivalence<A> = () => equals
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module provides an implementation of the `Equivalence` type class, which defines a binary relation
|
|
3
|
+
* that is reflexive, symmetric, and transitive. In other words, it defines a notion of equivalence between values of a certain type.
|
|
4
|
+
* These properties are also known in mathematics as an "equivalence relation".
|
|
5
|
+
*
|
|
6
|
+
* @since 2.0.0
|
|
7
|
+
*/
|
|
8
|
+
import { dual } from "./Function.js"
|
|
9
|
+
import type { TypeLambda } from "./HKT.js"
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @category type class
|
|
13
|
+
* @since 2.0.0
|
|
14
|
+
*/
|
|
15
|
+
export interface Equivalence<in A> {
|
|
16
|
+
(self: A, that: A): boolean
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @category type lambdas
|
|
21
|
+
* @since 2.0.0
|
|
22
|
+
*/
|
|
23
|
+
export interface EquivalenceTypeLambda extends TypeLambda {
|
|
24
|
+
readonly type: Equivalence<this["Target"]>
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @category constructors
|
|
29
|
+
* @since 2.0.0
|
|
30
|
+
*/
|
|
31
|
+
export const make = <A>(isEquivalent: (self: A, that: A) => boolean): Equivalence<A> => (self: A, that: A): boolean =>
|
|
32
|
+
self === that || isEquivalent(self, that)
|
|
33
|
+
|
|
34
|
+
const isStrictEquivalent = (x: unknown, y: unknown) => x === y
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Return an `Equivalence` that uses strict equality (===) to compare values.
|
|
38
|
+
*
|
|
39
|
+
* @since 2.0.0
|
|
40
|
+
* @category constructors
|
|
41
|
+
*/
|
|
42
|
+
export const strict: <A>() => Equivalence<A> = () => isStrictEquivalent
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @category instances
|
|
46
|
+
* @since 2.0.0
|
|
47
|
+
*/
|
|
48
|
+
export const string: Equivalence<string> = strict()
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @category instances
|
|
52
|
+
* @since 2.0.0
|
|
53
|
+
*/
|
|
54
|
+
export const number: Equivalence<number> = strict()
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @category instances
|
|
58
|
+
* @since 2.0.0
|
|
59
|
+
*/
|
|
60
|
+
export const boolean: Equivalence<boolean> = strict()
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @category instances
|
|
64
|
+
* @since 2.0.0
|
|
65
|
+
*/
|
|
66
|
+
export const bigint: Equivalence<bigint> = strict()
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @category instances
|
|
70
|
+
* @since 2.0.0
|
|
71
|
+
*/
|
|
72
|
+
export const symbol: Equivalence<symbol> = strict()
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @category combining
|
|
76
|
+
* @since 2.0.0
|
|
77
|
+
*/
|
|
78
|
+
export const combine: {
|
|
79
|
+
<A>(that: Equivalence<A>): (self: Equivalence<A>) => Equivalence<A>
|
|
80
|
+
<A>(self: Equivalence<A>, that: Equivalence<A>): Equivalence<A>
|
|
81
|
+
} = dual(2, <A>(self: Equivalence<A>, that: Equivalence<A>): Equivalence<A> => make((x, y) => self(x, y) && that(x, y)))
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @category combining
|
|
85
|
+
* @since 2.0.0
|
|
86
|
+
*/
|
|
87
|
+
export const combineMany: {
|
|
88
|
+
<A>(collection: Iterable<Equivalence<A>>): (self: Equivalence<A>) => Equivalence<A>
|
|
89
|
+
<A>(self: Equivalence<A>, collection: Iterable<Equivalence<A>>): Equivalence<A>
|
|
90
|
+
} = dual(2, <A>(self: Equivalence<A>, collection: Iterable<Equivalence<A>>): Equivalence<A> =>
|
|
91
|
+
make((x, y) => {
|
|
92
|
+
if (!self(x, y)) {
|
|
93
|
+
return false
|
|
94
|
+
}
|
|
95
|
+
for (const equivalence of collection) {
|
|
96
|
+
if (!equivalence(x, y)) {
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return true
|
|
101
|
+
}))
|
|
102
|
+
|
|
103
|
+
const isAlwaysEquivalent: Equivalence<unknown> = (_x, _y) => true
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @category combining
|
|
107
|
+
* @since 2.0.0
|
|
108
|
+
*/
|
|
109
|
+
export const combineAll = <A>(collection: Iterable<Equivalence<A>>): Equivalence<A> =>
|
|
110
|
+
combineMany(isAlwaysEquivalent, collection)
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @category mapping
|
|
114
|
+
* @since 2.0.0
|
|
115
|
+
*/
|
|
116
|
+
export const mapInput: {
|
|
117
|
+
<B, A>(f: (b: B) => A): (self: Equivalence<A>) => Equivalence<B>
|
|
118
|
+
<A, B>(self: Equivalence<A>, f: (b: B) => A): Equivalence<B>
|
|
119
|
+
} = dual(
|
|
120
|
+
2,
|
|
121
|
+
<A, B>(self: Equivalence<A>, f: (b: B) => A): Equivalence<B> => make((x, y) => self(f(x), f(y)))
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @category instances
|
|
126
|
+
* @since 2.0.0
|
|
127
|
+
*/
|
|
128
|
+
export const Date: Equivalence<Date> = mapInput(number, (date) => date.getTime())
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @category combining
|
|
132
|
+
* @since 2.0.0
|
|
133
|
+
*/
|
|
134
|
+
export const product: {
|
|
135
|
+
<B>(that: Equivalence<B>): <A>(self: Equivalence<A>) => Equivalence<readonly [A, B]> // readonly because invariant
|
|
136
|
+
<A, B>(self: Equivalence<A>, that: Equivalence<B>): Equivalence<readonly [A, B]> // readonly because invariant
|
|
137
|
+
} = dual(
|
|
138
|
+
2,
|
|
139
|
+
<A, B>(self: Equivalence<A>, that: Equivalence<B>): Equivalence<readonly [A, B]> =>
|
|
140
|
+
make(([xa, xb], [ya, yb]) => self(xa, ya) && that(xb, yb))
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @category combining
|
|
145
|
+
* @since 2.0.0
|
|
146
|
+
*/
|
|
147
|
+
export const all = <A>(collection: Iterable<Equivalence<A>>): Equivalence<ReadonlyArray<A>> => {
|
|
148
|
+
return make((x, y) => {
|
|
149
|
+
const len = Math.min(x.length, y.length)
|
|
150
|
+
|
|
151
|
+
let collectionLength = 0
|
|
152
|
+
for (const equivalence of collection) {
|
|
153
|
+
if (collectionLength >= len) {
|
|
154
|
+
break
|
|
155
|
+
}
|
|
156
|
+
if (!equivalence(x[collectionLength], y[collectionLength])) {
|
|
157
|
+
return false
|
|
158
|
+
}
|
|
159
|
+
collectionLength++
|
|
160
|
+
}
|
|
161
|
+
return true
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @category combining
|
|
167
|
+
* @since 2.0.0
|
|
168
|
+
*/
|
|
169
|
+
export const productMany = <A>(
|
|
170
|
+
self: Equivalence<A>,
|
|
171
|
+
collection: Iterable<Equivalence<A>>
|
|
172
|
+
): Equivalence<readonly [A, ...Array<A>]> /* readonly because invariant */ => {
|
|
173
|
+
const equivalence = all(collection)
|
|
174
|
+
return make((x, y) => !self(x[0], y[0]) ? false : equivalence(x.slice(1), y.slice(1)))
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Similar to `Promise.all` but operates on `Equivalence`s.
|
|
179
|
+
*
|
|
180
|
+
* ```ts skip-type-checking
|
|
181
|
+
* [Equivalence<A>, Equivalence<B>, ...] -> Equivalence<[A, B, ...]>
|
|
182
|
+
* ```
|
|
183
|
+
*
|
|
184
|
+
* Given a tuple of `Equivalence`s returns a new `Equivalence` that compares values of a tuple
|
|
185
|
+
* by applying each `Equivalence` to the corresponding element of the tuple.
|
|
186
|
+
*
|
|
187
|
+
* @category combinators
|
|
188
|
+
* @since 2.0.0
|
|
189
|
+
*/
|
|
190
|
+
export const tuple = <T extends ReadonlyArray<Equivalence<any>>>(
|
|
191
|
+
...elements: T
|
|
192
|
+
): Equivalence<Readonly<{ [I in keyof T]: [T[I]] extends [Equivalence<infer A>] ? A : never }>> => all(elements) as any
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Creates a new `Equivalence` for an array of values based on a given `Equivalence` for the elements of the array.
|
|
196
|
+
*
|
|
197
|
+
* @category combinators
|
|
198
|
+
* @since 2.0.0
|
|
199
|
+
*/
|
|
200
|
+
export const array = <A>(item: Equivalence<A>): Equivalence<ReadonlyArray<A>> =>
|
|
201
|
+
make((self, that) => {
|
|
202
|
+
if (self.length !== that.length) {
|
|
203
|
+
return false
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
for (let i = 0; i < self.length; i++) {
|
|
207
|
+
const isEq = item(self[i], that[i])
|
|
208
|
+
if (!isEq) {
|
|
209
|
+
return false
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return true
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Given a struct of `Equivalence`s returns a new `Equivalence` that compares values of a struct
|
|
218
|
+
* by applying each `Equivalence` to the corresponding property of the struct.
|
|
219
|
+
*
|
|
220
|
+
* @category combinators
|
|
221
|
+
* @since 2.0.0
|
|
222
|
+
*/
|
|
223
|
+
export const struct = <R extends Record<string, Equivalence<any>>>(
|
|
224
|
+
fields: R
|
|
225
|
+
): Equivalence<{ readonly [K in keyof R]: [R[K]] extends [Equivalence<infer A>] ? A : never }> => {
|
|
226
|
+
const keys = Object.keys(fields)
|
|
227
|
+
return make((self, that) => {
|
|
228
|
+
for (const key of keys) {
|
|
229
|
+
if (!fields[key](self[key], that[key])) {
|
|
230
|
+
return false
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return true
|
|
234
|
+
})
|
|
235
|
+
}
|