effect 2.0.0-next.44 → 2.0.0-next.46
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/Bigint/dist/effect-Bigint.cjs.dev.js +125 -1
- package/Bigint/dist/effect-Bigint.cjs.mjs +6 -1
- package/Bigint/dist/effect-Bigint.cjs.prod.js +125 -1
- package/Bigint/dist/effect-Bigint.esm.js +111 -2
- package/Boolean/dist/effect-Boolean.cjs.dev.js +1 -1
- package/Boolean/dist/effect-Boolean.cjs.prod.js +1 -1
- package/Boolean/dist/effect-Boolean.esm.js +1 -1
- package/Brand/dist/effect-Brand.cjs.dev.js +3 -3
- package/Brand/dist/effect-Brand.cjs.prod.js +3 -3
- package/Cache/dist/effect-Cache.cjs.dev.js +32 -32
- package/Cache/dist/effect-Cache.cjs.prod.js +32 -32
- package/Cause/dist/effect-Cause.cjs.dev.js +17 -17
- package/Cause/dist/effect-Cause.cjs.mjs +1 -1
- package/Cause/dist/effect-Cause.cjs.prod.js +17 -17
- package/Cause/dist/effect-Cause.esm.js +4 -4
- package/Channel/dist/effect-Channel.cjs.dev.js +50 -50
- package/Channel/dist/effect-Channel.cjs.mjs +3 -3
- package/Channel/dist/effect-Channel.cjs.prod.js +50 -50
- package/Channel/dist/effect-Channel.esm.js +8 -8
- package/ChannelSingleProducerAsyncInput/dist/effect-ChannelSingleProducerAsyncInput.cjs.dev.js +36 -36
- package/ChannelSingleProducerAsyncInput/dist/effect-ChannelSingleProducerAsyncInput.cjs.prod.js +36 -36
- package/Chunk/dist/effect-Chunk.cjs.dev.js +3 -3
- package/Chunk/dist/effect-Chunk.cjs.prod.js +3 -3
- package/Clock/dist/effect-Clock.cjs.dev.js +16 -16
- package/Clock/dist/effect-Clock.cjs.prod.js +16 -16
- package/Config/dist/effect-Config.cjs.dev.js +11 -11
- package/Config/dist/effect-Config.cjs.prod.js +11 -11
- package/ConfigError/dist/effect-ConfigError.cjs.dev.js +4 -4
- package/ConfigError/dist/effect-ConfigError.cjs.prod.js +4 -4
- package/ConfigProvider/dist/effect-ConfigProvider.cjs.dev.js +17 -17
- package/ConfigProvider/dist/effect-ConfigProvider.cjs.prod.js +17 -17
- package/ConfigProviderPathPatch/dist/effect-ConfigProviderPathPatch.cjs.dev.js +5 -5
- package/ConfigProviderPathPatch/dist/effect-ConfigProviderPathPatch.cjs.prod.js +5 -5
- package/ConfigSecret/dist/effect-ConfigSecret.cjs.dev.js +4 -4
- package/ConfigSecret/dist/effect-ConfigSecret.cjs.prod.js +4 -4
- package/Console/dist/effect-Console.cjs.dev.js +35 -35
- package/Console/dist/effect-Console.cjs.prod.js +35 -35
- package/Context/dist/effect-Context.cjs.dev.js +3 -8
- package/Context/dist/effect-Context.cjs.prod.js +3 -8
- package/Data/dist/effect-Data.cjs.dev.js +141 -54
- package/Data/dist/effect-Data.cjs.mjs +2 -0
- package/Data/dist/effect-Data.cjs.prod.js +141 -54
- package/Data/dist/effect-Data.esm.js +51 -3
- package/DefaultServices/dist/effect-DefaultServices.cjs.dev.js +16 -16
- package/DefaultServices/dist/effect-DefaultServices.cjs.prod.js +16 -16
- package/Deferred/dist/effect-Deferred.cjs.dev.js +8 -8
- package/Deferred/dist/effect-Deferred.cjs.prod.js +8 -8
- package/Differ/dist/effect-Differ.cjs.dev.js +11 -11
- package/Differ/dist/effect-Differ.cjs.prod.js +11 -11
- package/Duration/dist/effect-Duration.cjs.dev.js +3 -3
- package/Duration/dist/effect-Duration.cjs.prod.js +3 -3
- package/Effect/dist/effect-Effect.cjs.dev.js +44 -44
- package/Effect/dist/effect-Effect.cjs.prod.js +44 -44
- package/Effectable/dist/effect-Effectable.cjs.dev.js +24 -14
- package/Effectable/dist/effect-Effectable.cjs.mjs +5 -4
- package/Effectable/dist/effect-Effectable.cjs.prod.js +24 -14
- package/Effectable/dist/effect-Effectable.esm.js +15 -5
- package/Either/dist/effect-Either.cjs.dev.js +3 -3
- package/Either/dist/effect-Either.cjs.prod.js +3 -3
- package/Encoding/dist/effect-Encoding.cjs.dev.js +3 -3
- package/Encoding/dist/effect-Encoding.cjs.prod.js +3 -3
- package/ExecutionStrategy/dist/effect-ExecutionStrategy.cjs.dev.js +2 -2
- package/ExecutionStrategy/dist/effect-ExecutionStrategy.cjs.prod.js +2 -2
- package/Exit/dist/effect-Exit.cjs.dev.js +8 -8
- package/Exit/dist/effect-Exit.cjs.prod.js +8 -8
- package/Fiber/dist/effect-Fiber.cjs.dev.js +29 -29
- package/Fiber/dist/effect-Fiber.cjs.prod.js +29 -29
- package/FiberId/dist/effect-FiberId.cjs.dev.js +5 -5
- package/FiberId/dist/effect-FiberId.cjs.prod.js +5 -5
- package/FiberRef/dist/effect-FiberRef.cjs.dev.js +29 -29
- package/FiberRef/dist/effect-FiberRef.cjs.prod.js +29 -29
- package/FiberRefs/dist/effect-FiberRefs.cjs.dev.js +9 -9
- package/FiberRefs/dist/effect-FiberRefs.cjs.prod.js +9 -9
- package/FiberRefsPatch/dist/effect-FiberRefsPatch.cjs.dev.js +10 -10
- package/FiberRefsPatch/dist/effect-FiberRefsPatch.cjs.prod.js +10 -10
- package/GroupBy/dist/effect-GroupBy.cjs.dev.js +42 -42
- package/GroupBy/dist/effect-GroupBy.cjs.prod.js +42 -42
- package/HashMap/dist/effect-HashMap.cjs.dev.js +20 -20
- package/HashMap/dist/effect-HashMap.cjs.prod.js +20 -20
- package/HashSet/dist/effect-HashSet.cjs.dev.js +20 -20
- package/HashSet/dist/effect-HashSet.cjs.prod.js +20 -20
- package/KeyedPool/dist/effect-KeyedPool.cjs.dev.js +33 -33
- package/KeyedPool/dist/effect-KeyedPool.cjs.prod.js +33 -33
- package/Layer/dist/effect-Layer.cjs.dev.js +32 -32
- package/Layer/dist/effect-Layer.cjs.prod.js +32 -32
- package/List/dist/effect-List.cjs.dev.js +3 -3
- package/List/dist/effect-List.cjs.prod.js +3 -3
- package/LogLevel/dist/effect-LogLevel.cjs.dev.js +8 -8
- package/LogLevel/dist/effect-LogLevel.cjs.prod.js +8 -8
- package/Logger/dist/effect-Logger.cjs.dev.js +33 -33
- package/Logger/dist/effect-Logger.cjs.prod.js +33 -33
- package/Metric/dist/effect-Metric.cjs.dev.js +27 -27
- package/Metric/dist/effect-Metric.cjs.prod.js +27 -27
- package/MetricBoundaries/dist/effect-MetricBoundaries.cjs.dev.js +4 -4
- package/MetricBoundaries/dist/effect-MetricBoundaries.cjs.prod.js +4 -4
- package/MetricHook/dist/effect-MetricHook.cjs.dev.js +6 -6
- package/MetricHook/dist/effect-MetricHook.cjs.prod.js +6 -6
- package/MetricKey/dist/effect-MetricKey.cjs.dev.js +6 -6
- package/MetricKey/dist/effect-MetricKey.cjs.prod.js +6 -6
- package/MetricKeyType/dist/effect-MetricKeyType.cjs.dev.js +4 -4
- package/MetricKeyType/dist/effect-MetricKeyType.cjs.prod.js +4 -4
- package/MetricPolling/dist/effect-MetricPolling.cjs.dev.js +30 -30
- package/MetricPolling/dist/effect-MetricPolling.cjs.prod.js +30 -30
- package/MetricRegistry/dist/effect-MetricRegistry.cjs.dev.js +8 -8
- package/MetricRegistry/dist/effect-MetricRegistry.cjs.prod.js +8 -8
- package/MetricState/dist/effect-MetricState.cjs.dev.js +1 -1
- package/MetricState/dist/effect-MetricState.cjs.prod.js +1 -1
- package/MutableHashMap/dist/effect-MutableHashMap.cjs.dev.js +4 -4
- package/MutableHashMap/dist/effect-MutableHashMap.cjs.prod.js +4 -4
- package/MutableHashSet/dist/effect-MutableHashSet.cjs.dev.js +4 -4
- package/MutableHashSet/dist/effect-MutableHashSet.cjs.prod.js +4 -4
- package/MutableQueue/dist/effect-MutableQueue.cjs.dev.js +3 -3
- package/MutableQueue/dist/effect-MutableQueue.cjs.prod.js +3 -3
- package/Number/dist/effect-Number.cjs.dev.js +1 -1
- package/Number/dist/effect-Number.cjs.prod.js +1 -1
- package/Number/dist/effect-Number.esm.js +1 -1
- package/Option/dist/effect-Option.cjs.dev.js +9 -9
- package/Option/dist/effect-Option.cjs.prod.js +9 -9
- package/Pool/dist/effect-Pool.cjs.dev.js +31 -31
- package/Pool/dist/effect-Pool.cjs.prod.js +31 -31
- package/PubSub/dist/effect-PubSub.cjs.d.mts +2 -0
- package/PubSub/dist/effect-PubSub.cjs.d.mts.map +1 -0
- package/PubSub/dist/effect-PubSub.cjs.d.ts +2 -0
- package/PubSub/dist/effect-PubSub.cjs.d.ts.map +1 -0
- package/{Hub/dist/effect-Hub.cjs.dev.js → PubSub/dist/effect-PubSub.cjs.dev.js} +163 -163
- package/PubSub/dist/effect-PubSub.cjs.js +7 -0
- package/{Hub/dist/effect-Hub.cjs.mjs → PubSub/dist/effect-PubSub.cjs.mjs} +1 -1
- package/{Hub/dist/effect-Hub.cjs.prod.js → PubSub/dist/effect-PubSub.cjs.prod.js} +163 -163
- package/{Hub/dist/effect-Hub.esm.js → PubSub/dist/effect-PubSub.esm.js} +15 -15
- package/PubSub/package.json +4 -0
- package/Queue/dist/effect-Queue.cjs.dev.js +28 -28
- package/Queue/dist/effect-Queue.cjs.prod.js +28 -28
- package/README.md +5 -5
- package/Random/dist/effect-Random.cjs.dev.js +16 -16
- package/Random/dist/effect-Random.cjs.prod.js +16 -16
- package/ReadonlyArray/dist/effect-ReadonlyArray.cjs.dev.js +3 -3
- package/ReadonlyArray/dist/effect-ReadonlyArray.cjs.prod.js +3 -3
- package/ReadonlyRecord/dist/effect-ReadonlyRecord.cjs.dev.js +3 -3
- package/ReadonlyRecord/dist/effect-ReadonlyRecord.cjs.prod.js +3 -3
- package/RedBlackTree/dist/effect-RedBlackTree.cjs.dev.js +4 -4
- package/RedBlackTree/dist/effect-RedBlackTree.cjs.prod.js +4 -4
- package/Ref/dist/effect-Ref.cjs.dev.js +9 -9
- package/Ref/dist/effect-Ref.cjs.prod.js +9 -9
- package/Reloadable/dist/effect-Reloadable.cjs.dev.js +44 -44
- package/Reloadable/dist/effect-Reloadable.cjs.prod.js +44 -44
- package/Request/dist/effect-Request.cjs.dev.js +29 -29
- package/Request/dist/effect-Request.cjs.prod.js +29 -29
- package/RequestBlock/dist/effect-RequestBlock.cjs.dev.js +36 -36
- package/RequestBlock/dist/effect-RequestBlock.cjs.prod.js +36 -36
- package/RequestResolver/dist/effect-RequestResolver.cjs.dev.js +38 -38
- package/RequestResolver/dist/effect-RequestResolver.cjs.prod.js +38 -38
- package/Resource/dist/effect-Resource.cjs.dev.js +34 -34
- package/Resource/dist/effect-Resource.cjs.prod.js +34 -34
- package/Runtime/dist/effect-Runtime.cjs.dev.js +34 -34
- package/Runtime/dist/effect-Runtime.cjs.prod.js +34 -34
- package/RuntimeFlags/dist/effect-RuntimeFlags.cjs.dev.js +33 -33
- package/RuntimeFlags/dist/effect-RuntimeFlags.cjs.prod.js +33 -33
- package/RuntimeFlagsPatch/dist/effect-RuntimeFlagsPatch.cjs.dev.js +6 -6
- package/RuntimeFlagsPatch/dist/effect-RuntimeFlagsPatch.cjs.prod.js +6 -6
- package/STM/dist/effect-STM.cjs.dev.js +48 -48
- package/STM/dist/effect-STM.cjs.prod.js +48 -48
- package/Schedule/dist/effect-Schedule.cjs.dev.js +19 -19
- package/Schedule/dist/effect-Schedule.cjs.prod.js +19 -19
- package/ScheduleDecision/dist/effect-ScheduleDecision.cjs.dev.js +3 -3
- package/ScheduleDecision/dist/effect-ScheduleDecision.cjs.prod.js +3 -3
- package/ScheduleInterval/dist/effect-ScheduleInterval.cjs.dev.js +3 -3
- package/ScheduleInterval/dist/effect-ScheduleInterval.cjs.prod.js +3 -3
- package/ScheduleIntervals/dist/effect-ScheduleIntervals.cjs.dev.js +3 -3
- package/ScheduleIntervals/dist/effect-ScheduleIntervals.cjs.prod.js +3 -3
- package/Scheduler/dist/effect-Scheduler.cjs.dev.js +8 -8
- package/Scheduler/dist/effect-Scheduler.cjs.prod.js +8 -8
- package/Scope/dist/effect-Scope.cjs.dev.js +27 -27
- package/Scope/dist/effect-Scope.cjs.prod.js +27 -27
- package/ScopedCache/dist/effect-ScopedCache.cjs.dev.js +78 -61
- package/ScopedCache/dist/effect-ScopedCache.cjs.prod.js +78 -61
- package/ScopedRef/dist/effect-ScopedRef.cjs.dev.js +34 -34
- package/ScopedRef/dist/effect-ScopedRef.cjs.prod.js +34 -34
- package/Sink/dist/effect-Sink.cjs.dev.js +43 -43
- package/Sink/dist/effect-Sink.cjs.mjs +1 -1
- package/Sink/dist/effect-Sink.cjs.prod.js +43 -43
- package/Sink/dist/effect-Sink.esm.js +5 -5
- package/SortedMap/dist/effect-SortedMap.cjs.dev.js +3 -3
- package/SortedMap/dist/effect-SortedMap.cjs.prod.js +3 -3
- package/SortedSet/dist/effect-SortedSet.cjs.dev.js +3 -3
- package/SortedSet/dist/effect-SortedSet.cjs.prod.js +3 -3
- package/Stream/dist/effect-Stream.cjs.dev.js +60 -60
- package/Stream/dist/effect-Stream.cjs.mjs +5 -5
- package/Stream/dist/effect-Stream.cjs.prod.js +60 -60
- package/Stream/dist/effect-Stream.esm.js +15 -15
- package/Streamable/dist/effect-Streamable.cjs.d.mts +2 -0
- package/Streamable/dist/effect-Streamable.cjs.d.mts.map +1 -0
- package/Streamable/dist/effect-Streamable.cjs.d.ts +2 -0
- package/Streamable/dist/effect-Streamable.cjs.d.ts.map +1 -0
- package/Streamable/dist/effect-Streamable.cjs.dev.js +152 -0
- package/Streamable/dist/effect-Streamable.cjs.js +7 -0
- package/Streamable/dist/effect-Streamable.cjs.mjs +3 -0
- package/Streamable/dist/effect-Streamable.cjs.prod.js +152 -0
- package/Streamable/dist/effect-Streamable.esm.js +42 -0
- package/Streamable/package.json +4 -0
- package/String/dist/effect-String.cjs.dev.js +4 -4
- package/String/dist/effect-String.cjs.prod.js +4 -4
- package/String/dist/effect-String.esm.js +1 -1
- package/SubscriptionRef/dist/effect-SubscriptionRef.cjs.dev.js +48 -48
- package/SubscriptionRef/dist/effect-SubscriptionRef.cjs.prod.js +48 -48
- package/Supervisor/dist/effect-Supervisor.cjs.dev.js +34 -34
- package/Supervisor/dist/effect-Supervisor.cjs.prod.js +34 -34
- package/SynchronizedRef/dist/effect-SynchronizedRef.cjs.dev.js +30 -30
- package/SynchronizedRef/dist/effect-SynchronizedRef.cjs.prod.js +30 -30
- package/TArray/dist/effect-TArray.cjs.dev.js +46 -46
- package/TArray/dist/effect-TArray.cjs.prod.js +46 -46
- package/TDeferred/dist/effect-TDeferred.cjs.dev.js +45 -45
- package/TDeferred/dist/effect-TDeferred.cjs.prod.js +45 -45
- package/TMap/dist/effect-TMap.cjs.dev.js +47 -47
- package/TMap/dist/effect-TMap.cjs.prod.js +47 -47
- package/TPriorityQueue/dist/effect-TPriorityQueue.cjs.dev.js +44 -44
- package/TPriorityQueue/dist/effect-TPriorityQueue.cjs.prod.js +44 -44
- package/TPubSub/dist/effect-TPubSub.cjs.d.mts +2 -0
- package/TPubSub/dist/effect-TPubSub.cjs.d.mts.map +1 -0
- package/TPubSub/dist/effect-TPubSub.cjs.d.ts +2 -0
- package/TPubSub/dist/effect-TPubSub.cjs.d.ts.map +1 -0
- package/{THub/dist/effect-THub.cjs.dev.js → TPubSub/dist/effect-TPubSub.cjs.dev.js} +101 -101
- package/TPubSub/dist/effect-TPubSub.cjs.js +7 -0
- package/{THub/dist/effect-THub.cjs.mjs → TPubSub/dist/effect-TPubSub.cjs.mjs} +2 -2
- package/{THub/dist/effect-THub.cjs.prod.js → TPubSub/dist/effect-TPubSub.cjs.prod.js} +101 -101
- package/TPubSub/dist/effect-TPubSub.esm.js +157 -0
- package/TPubSub/package.json +4 -0
- package/TQueue/dist/effect-TQueue.cjs.dev.js +46 -46
- package/TQueue/dist/effect-TQueue.cjs.prod.js +46 -46
- package/TRandom/dist/effect-TRandom.cjs.dev.js +50 -50
- package/TRandom/dist/effect-TRandom.cjs.prod.js +50 -50
- package/TReentrantLock/dist/effect-TReentrantLock.cjs.dev.js +46 -46
- package/TReentrantLock/dist/effect-TReentrantLock.cjs.prod.js +46 -46
- package/TRef/dist/effect-TRef.cjs.dev.js +44 -44
- package/TRef/dist/effect-TRef.cjs.prod.js +44 -44
- package/TSemaphore/dist/effect-TSemaphore.cjs.dev.js +45 -45
- package/TSemaphore/dist/effect-TSemaphore.cjs.prod.js +45 -45
- package/TSet/dist/effect-TSet.cjs.dev.js +47 -47
- package/TSet/dist/effect-TSet.cjs.prod.js +47 -47
- package/Take/dist/effect-Take.cjs.dev.js +36 -36
- package/Take/dist/effect-Take.cjs.prod.js +36 -36
- package/TestAnnotation/dist/effect-TestAnnotation.cjs.dev.js +8 -8
- package/TestAnnotation/dist/effect-TestAnnotation.cjs.prod.js +8 -8
- package/TestAnnotations/dist/effect-TestAnnotations.cjs.dev.js +25 -25
- package/TestAnnotations/dist/effect-TestAnnotations.cjs.prod.js +25 -25
- package/TestClock/dist/effect-TestClock.cjs.dev.js +46 -46
- package/TestClock/dist/effect-TestClock.cjs.prod.js +46 -46
- package/TestConfig/dist/effect-TestConfig.cjs.dev.js +3 -8
- package/TestConfig/dist/effect-TestConfig.cjs.prod.js +3 -8
- package/TestContext/dist/effect-TestContext.cjs.dev.js +37 -37
- package/TestContext/dist/effect-TestContext.cjs.prod.js +37 -37
- package/TestLive/dist/effect-TestLive.cjs.dev.js +17 -17
- package/TestLive/dist/effect-TestLive.cjs.prod.js +17 -17
- package/TestServices/dist/effect-TestServices.cjs.dev.js +42 -42
- package/TestServices/dist/effect-TestServices.cjs.prod.js +42 -42
- package/TestSized/dist/effect-TestSized.cjs.dev.js +11 -11
- package/TestSized/dist/effect-TestSized.cjs.prod.js +11 -11
- package/Tracer/dist/effect-Tracer.cjs.dev.js +16 -16
- package/Tracer/dist/effect-Tracer.cjs.prod.js +16 -16
- package/dist/{Context-01a123ac.cjs.prod.js → Context-9fe5eb16.cjs.prod.js} +5 -5
- package/dist/{Context-593661f6.cjs.dev.js → Context-da73ddfa.cjs.dev.js} +5 -5
- package/dist/{Effectable-2f022879.cjs.dev.js → Effectable-7314aed8.cjs.dev.js} +63 -10
- package/dist/{Effectable-cd8f3a96.cjs.prod.js → Effectable-c4c14a2b.cjs.prod.js} +63 -10
- package/dist/{Either-7a881c7a.cjs.prod.js → Either-d43f082c.cjs.prod.js} +6 -79
- package/dist/{Either-12bbe00c.cjs.dev.js → Either-fa0ef1d9.cjs.dev.js} +6 -79
- package/dist/{ExecutionStrategy-14d3053a.cjs.prod.js → ExecutionStrategy-4808fe5d.cjs.prod.js} +2 -2
- package/dist/{ExecutionStrategy-70f1a920.cjs.dev.js → ExecutionStrategy-7d9d457b.cjs.dev.js} +2 -2
- package/dist/{HashSet-0b4ff1e4.cjs.dev.js → HashSet-5963ad6b.cjs.dev.js} +32 -32
- package/dist/{HashSet-6257b66d.cjs.prod.js → HashSet-ac02a3e1.cjs.prod.js} +32 -32
- package/dist/Option-463b42e6.cjs.dev.js +81 -0
- package/dist/Option-935e5d7c.cjs.prod.js +81 -0
- package/dist/{Ref-a3a4e50d.cjs.prod.js → Ref-4014b526.cjs.prod.js} +1 -1
- package/dist/{Ref-74b592a4.cjs.dev.js → Ref-acdee7ef.cjs.dev.js} +1 -1
- package/dist/{cache-75fbef45.cjs.prod.js → cache-5c7d77e4.cjs.prod.js} +17 -17
- package/dist/{cache-e1ea3923.cjs.dev.js → cache-7eed9d33.cjs.dev.js} +17 -17
- package/dist/{circular-6f16b226.cjs.prod.js → circular-1f481ffb.cjs.prod.js} +33 -33
- package/dist/{circular-f406f9a4.cjs.prod.js → circular-9e10a5a7.cjs.prod.js} +6 -6
- package/dist/{circular-58ff5e9c.cjs.dev.js → circular-c2dbce1a.cjs.dev.js} +33 -33
- package/dist/{circular-30564534.cjs.dev.js → circular-c8b65bdb.cjs.dev.js} +6 -6
- package/dist/{config-80900693.cjs.dev.js → config-3b7935a3.cjs.dev.js} +3 -3
- package/dist/{config-d0ddc159.cjs.prod.js → config-5ba54da1.cjs.prod.js} +3 -3
- package/dist/{configProvider-93617d6d.cjs.prod.js → configProvider-b6b20998.cjs.prod.js} +29 -29
- package/dist/{configProvider-ce43fdbf.cjs.dev.js → configProvider-f34a82f1.cjs.dev.js} +29 -29
- package/dist/{core-0b0539de.cjs.prod.js → core-07202cc0.cjs.prod.js} +711 -726
- package/dist/{core-60ca562a.cjs.prod.js → core-7411d1e1.cjs.prod.js} +3 -3
- package/dist/{core-b4d7b4f5.cjs.dev.js → core-b7401357.cjs.dev.js} +711 -726
- package/dist/{core-13f8a866.cjs.dev.js → core-c5747f88.cjs.dev.js} +3 -3
- package/dist/{core-effect-892f3686.cjs.dev.js → core-effect-1c564d42.cjs.dev.js} +77 -75
- package/dist/{core-effect-c65770cd.cjs.prod.js → core-effect-9201ea63.cjs.prod.js} +77 -75
- package/dist/{dataSource-3ba9e4d3.cjs.dev.js → dataSource-b5eda714.cjs.dev.js} +2 -2
- package/dist/{dataSource-7df3a5f6.cjs.prod.js → dataSource-b83bc277.cjs.prod.js} +2 -2
- package/dist/declarations/src/Bigint.d.ts +92 -1
- package/dist/declarations/src/Bigint.d.ts.map +1 -1
- package/dist/declarations/src/Boolean.d.ts +1 -1
- package/dist/declarations/src/Cause.d.ts +6 -6
- package/dist/declarations/src/Cause.d.ts.map +1 -1
- package/dist/declarations/src/Channel.d.ts +7 -7
- package/dist/declarations/src/Channel.d.ts.map +1 -1
- package/dist/declarations/src/Data.d.ts +30 -0
- package/dist/declarations/src/Data.d.ts.map +1 -1
- package/dist/declarations/src/Effect.d.ts +4 -2
- package/dist/declarations/src/Effect.d.ts.map +1 -1
- package/dist/declarations/src/Effectable.d.ts +14 -4
- package/dist/declarations/src/Effectable.d.ts.map +1 -1
- package/dist/declarations/src/Metric.d.ts +31 -7
- package/dist/declarations/src/Metric.d.ts.map +1 -1
- package/dist/declarations/src/MetricHook.d.ts +7 -4
- package/dist/declarations/src/MetricHook.d.ts.map +1 -1
- package/dist/declarations/src/MetricKey.d.ts +24 -4
- package/dist/declarations/src/MetricKey.d.ts.map +1 -1
- package/dist/declarations/src/MetricKeyType.d.ts +9 -6
- package/dist/declarations/src/MetricKeyType.d.ts.map +1 -1
- package/dist/declarations/src/MetricRegistry.d.ts +2 -2
- package/dist/declarations/src/MetricRegistry.d.ts.map +1 -1
- package/dist/declarations/src/MetricState.d.ts +15 -9
- package/dist/declarations/src/MetricState.d.ts.map +1 -1
- package/dist/declarations/src/Number.d.ts +1 -1
- package/dist/declarations/src/{Hub.d.ts → PubSub.d.ts} +38 -38
- package/dist/declarations/src/PubSub.d.ts.map +1 -0
- package/dist/declarations/src/Sink.d.ts +4 -4
- package/dist/declarations/src/Sink.d.ts.map +1 -1
- package/dist/declarations/src/Stream.d.ts +24 -24
- package/dist/declarations/src/Stream.d.ts.map +1 -1
- package/dist/declarations/src/Streamable.d.ts +27 -0
- package/dist/declarations/src/Streamable.d.ts.map +1 -0
- package/dist/declarations/src/String.d.ts +1 -1
- package/dist/declarations/src/SubscriptionRef.d.ts.map +1 -1
- package/dist/declarations/src/TPubSub.d.ts +146 -0
- package/dist/declarations/src/TPubSub.d.ts.map +1 -0
- package/dist/declarations/src/index.d.ts +15 -15
- package/dist/declarations/src/index.d.ts.map +1 -1
- package/dist/{defaultServices-5530ff0e.cjs.dev.js → defaultServices-755d5b46.cjs.dev.js} +6 -6
- package/dist/{defaultServices-086b8ac9.cjs.prod.js → defaultServices-9d7ce86f.cjs.prod.js} +6 -6
- package/dist/effect.cjs.dev.js +9 -9
- package/dist/effect.cjs.mjs +3 -3
- package/dist/effect.cjs.prod.js +9 -9
- package/dist/effect.esm.js +6 -6
- package/dist/{fiber-1bfb4c1d.cjs.dev.js → fiber-5156eff2.cjs.dev.js} +12 -12
- package/dist/{fiber-2eb0a4c1.cjs.prod.js → fiber-9519d109.cjs.prod.js} +12 -12
- package/dist/{fiberRefs-be6b6a70.cjs.prod.js → fiberRefs-558c17e6.cjs.prod.js} +1 -1
- package/dist/{fiberRefs-be4fae6a.cjs.dev.js → fiberRefs-98b71233.cjs.dev.js} +1 -1
- package/dist/{fiberRuntime-2d31e120.cjs.prod.js → fiberRuntime-31ae011f.cjs.prod.js} +99 -100
- package/dist/{fiberRuntime-c7280769.cjs.dev.js → fiberRuntime-d3872282.cjs.dev.js} +99 -100
- package/dist/{groupBy-0702739b.cjs.prod.js → groupBy-724f64ef.cjs.prod.js} +4 -4
- package/dist/{groupBy-7f852bf3.cjs.dev.js → groupBy-862cc2da.cjs.dev.js} +4 -4
- package/dist/{hook-e72b20fd.cjs.dev.js → hook-8cefc909.cjs.dev.js} +8 -4
- package/dist/{hook-470b717e.cjs.prod.js → hook-98ce30e4.cjs.prod.js} +8 -4
- package/dist/{key-f0a1408a.cjs.dev.js → key-198b6670.cjs.dev.js} +3 -3
- package/dist/{key-378a6a2c.cjs.prod.js → key-eb8a12b2.cjs.prod.js} +3 -3
- package/dist/{keyType-cf67c69c.cjs.prod.js → keyType-0c5e6178.cjs.prod.js} +9 -2
- package/dist/{keyType-55f27f07.cjs.dev.js → keyType-7c164b82.cjs.dev.js} +9 -2
- package/dist/{layer-b42e8022.cjs.dev.js → layer-29574350.cjs.dev.js} +33 -33
- package/dist/{layer-d103b49b.cjs.prod.js → layer-51ff4846.cjs.prod.js} +33 -33
- package/dist/{patch-a1b2802f.cjs.dev.js → patch-0220a642.cjs.dev.js} +1 -1
- package/dist/{patch-c4d6c61e.cjs.prod.js → patch-7c559bb2.cjs.prod.js} +1 -1
- package/dist/{pathPatch-15c8d723.cjs.prod.js → pathPatch-b56a4da2.cjs.prod.js} +1 -1
- package/dist/{pathPatch-d9d41297.cjs.dev.js → pathPatch-fab016f1.cjs.dev.js} +1 -1
- package/dist/{pool-ef44ba82.cjs.dev.js → pool-3211287f.cjs.dev.js} +31 -31
- package/dist/{pool-e414eb88.cjs.prod.js → pool-f77d7705.cjs.prod.js} +31 -31
- package/dist/{query-1d0157db.cjs.prod.js → query-a52b25f0.cjs.prod.js} +11 -11
- package/dist/{query-54337864.cjs.dev.js → query-c36decd5.cjs.dev.js} +11 -11
- package/dist/{queue-27ac9d98.cjs.prod.js → queue-315ea45d.cjs.prod.js} +22 -22
- package/dist/{queue-533d70d4.cjs.dev.js → queue-7a223c44.cjs.dev.js} +22 -22
- package/dist/{registry-1099de3f.cjs.dev.js → registry-62ff192e.cjs.dev.js} +4 -4
- package/dist/{registry-013ecdde.cjs.prod.js → registry-d5258dff.cjs.prod.js} +4 -4
- package/dist/{runtime-ea174155.cjs.prod.js → runtime-005f8a9b.cjs.prod.js} +7 -7
- package/dist/{runtime-afad6a9b.cjs.dev.js → runtime-57c8ddf8.cjs.dev.js} +7 -7
- package/dist/{schedule-1d92198c.cjs.prod.js → schedule-8cdf6bf1.cjs.prod.js} +40 -40
- package/dist/{schedule-e0f55cab.cjs.dev.js → schedule-e7a9f93f.cjs.dev.js} +40 -40
- package/dist/scopedRef-789d7fef.cjs.prod.js +55 -0
- package/dist/scopedRef-eb19c7a6.cjs.dev.js +55 -0
- package/dist/{singleProducerAsyncInput-4105a342.cjs.dev.js → singleProducerAsyncInput-9ff8389b.cjs.dev.js} +1 -1
- package/dist/{singleProducerAsyncInput-21463e16.cjs.prod.js → singleProducerAsyncInput-f9b258b1.cjs.prod.js} +1 -1
- package/dist/{sink-9129504b.cjs.prod.js → sink-572d8981.cjs.prod.js} +17 -17
- package/dist/{sink-ee393b63.cjs.dev.js → sink-8d3427e7.cjs.dev.js} +17 -17
- package/dist/{state-dd1bd066.cjs.prod.js → state-0bdf02b7.cjs.prod.js} +2 -6
- package/dist/{state-8fbec044.cjs.dev.js → state-931050c4.cjs.dev.js} +2 -6
- package/dist/{stm-537da66b.cjs.dev.js → stm-8aca0022.cjs.dev.js} +3 -3
- package/dist/{stm-5043c3cb.cjs.prod.js → stm-f250b596.cjs.prod.js} +3 -3
- package/dist/{stream-c7eda5bc.cjs.dev.js → stream-34d80d2c.cjs.dev.js} +31 -28
- package/dist/{stream-13637643.cjs.prod.js → stream-ea4f4d44.cjs.prod.js} +31 -28
- package/dist/{synchronizedRef-37e32854.cjs.dev.js → synchronizedRef-a12fd967.cjs.dev.js} +6 -6
- package/dist/{synchronizedRef-b4cde4de.cjs.prod.js → synchronizedRef-ed8aa6ac.cjs.prod.js} +6 -6
- package/dist/{tArray-df1bae1c.cjs.dev.js → tArray-17f078f2.cjs.dev.js} +3 -3
- package/dist/{tArray-d5476a2d.cjs.prod.js → tArray-d184e22f.cjs.prod.js} +3 -3
- package/dist/{tMap-a3e14c05.cjs.dev.js → tMap-1a5aa78b.cjs.dev.js} +4 -4
- package/dist/{tMap-20ef43ea.cjs.prod.js → tMap-e219f30e.cjs.prod.js} +4 -4
- package/dist/{tQueue-bd3cf539.cjs.dev.js → tQueue-0a4fc773.cjs.dev.js} +3 -3
- package/dist/{tQueue-c02c22bd.cjs.prod.js → tQueue-47129ad0.cjs.prod.js} +3 -3
- package/dist/{tRef-49e44dde.cjs.prod.js → tRef-ab4c5713.cjs.prod.js} +1 -1
- package/dist/{tRef-75dd04b3.cjs.dev.js → tRef-b860ef05.cjs.dev.js} +1 -1
- package/internal/Context.esm.js +4 -4
- package/internal/Data.esm.js +4 -1
- package/internal/Differ/ChunkPatch.esm.js +1 -1
- package/internal/Differ/ContextPatch.esm.js +1 -1
- package/internal/Differ/HashMapPatch.esm.js +1 -1
- package/internal/Differ/HashSetPatch.esm.js +1 -1
- package/internal/Differ/OrPatch.esm.js +1 -1
- package/internal/Effectable.esm.js +9 -9
- package/internal/Either.esm.js +3 -3
- package/internal/Option.esm.js +3 -3
- package/internal/cache.esm.js +1 -1
- package/internal/cause.esm.js +6 -21
- package/internal/channel.esm.js +5 -5
- package/internal/core-effect.esm.js +6 -4
- package/internal/fiberRuntime.esm.js +3 -3
- package/internal/layer.esm.js +1 -1
- package/internal/metric/hook.esm.js +7 -3
- package/internal/metric/key.esm.js +2 -2
- package/internal/metric/keyType.esm.js +9 -2
- package/internal/metric/registry.esm.js +2 -2
- package/internal/metric/state.esm.js +2 -6
- package/internal/metric.esm.js +3 -3
- package/internal/{hub.esm.js → pubsub.esm.js} +108 -108
- package/internal/request.esm.js +1 -1
- package/internal/sink.esm.js +8 -8
- package/internal/stm/{tHub.esm.js → tPubSub.esm.js} +30 -30
- package/internal/stream.esm.js +23 -20
- package/internal/subscriptionRef.esm.js +8 -8
- package/package.json +66 -211
- package/src/.index.ts +30 -0
- package/src/Bigint.ts +497 -0
- package/src/Boolean.ts +261 -0
- package/src/Brand.ts +336 -0
- package/src/Cache.ts +250 -0
- package/src/Cause.ts +813 -0
- package/src/Channel.ts +2244 -0
- package/src/ChannelChildExecutorDecision.ts +138 -0
- package/src/ChannelMergeDecision.ts +94 -0
- package/src/ChannelMergeState.ts +166 -0
- package/src/ChannelMergeStrategy.ts +107 -0
- package/src/ChannelSingleProducerAsyncInput.ts +68 -0
- package/src/ChannelUpstreamPullRequest.ts +110 -0
- package/src/ChannelUpstreamPullStrategy.ts +120 -0
- package/src/Chunk.ts +1314 -0
- package/src/Clock.ts +111 -0
- package/src/Config.ts +447 -0
- package/src/ConfigError.ts +267 -0
- package/src/ConfigProvider.ts +296 -0
- package/src/ConfigProviderPathPatch.ts +100 -0
- package/src/ConfigSecret.ts +76 -0
- package/src/Console.ts +222 -0
- package/src/Context.ts +365 -0
- package/src/Data.ts +367 -0
- package/src/DefaultServices.ts +34 -0
- package/src/Deferred.ts +283 -0
- package/src/Differ.ts +406 -0
- package/src/Duration.ts +558 -0
- package/src/Effect.ts +5177 -0
- package/src/Effectable.ts +107 -0
- package/src/Either.ts +593 -0
- package/src/Encoding.ts +130 -0
- package/src/Equal.ts +64 -0
- package/src/Equivalence.ts +235 -0
- package/src/ExecutionStrategy.ts +111 -0
- package/src/Exit.ts +464 -0
- package/src/Fiber.ts +650 -0
- package/src/FiberId.ts +187 -0
- package/src/FiberRef.ts +399 -0
- package/src/FiberRefs.ts +160 -0
- package/src/FiberRefsPatch.ts +105 -0
- package/src/FiberStatus.ts +108 -0
- package/src/Function.ts +834 -0
- package/src/GlobalValue.ts +20 -0
- package/src/GroupBy.ts +102 -0
- package/src/HKT.ts +44 -0
- package/src/Hash.ts +162 -0
- package/src/HashMap.ts +373 -0
- package/src/HashSet.ts +300 -0
- package/src/Inspectable.ts +45 -0
- package/src/KeyedPool.ts +160 -0
- package/src/Layer.ts +866 -0
- package/src/List.ts +942 -0
- package/src/LogLevel.ts +266 -0
- package/src/LogSpan.ts +25 -0
- package/src/Logger.ts +321 -0
- package/src/Metric.ts +657 -0
- package/src/MetricBoundaries.ts +70 -0
- package/src/MetricHook.ts +139 -0
- package/src/MetricKey.ts +227 -0
- package/src/MetricKeyType.ts +257 -0
- package/src/MetricLabel.ts +47 -0
- package/src/MetricPair.ts +70 -0
- package/src/MetricPolling.ts +136 -0
- package/src/MetricRegistry.ts +47 -0
- package/src/MetricState.ts +256 -0
- package/src/MutableHashMap.ts +187 -0
- package/src/MutableHashSet.ts +118 -0
- package/src/MutableList.ts +289 -0
- package/src/MutableQueue.ts +227 -0
- package/src/MutableRef.ts +204 -0
- package/src/NonEmptyIterable.ts +30 -0
- package/src/Number.ts +406 -0
- package/src/Option.ts +1307 -0
- package/src/Order.ts +328 -0
- package/src/Ordering.ts +112 -0
- package/src/Pipeable.ts +318 -0
- package/src/Pool.ts +148 -0
- package/src/Predicate.ts +704 -0
- package/src/PubSub.ts +175 -0
- package/src/Queue.ts +575 -0
- package/src/Random.ts +115 -0
- package/src/ReadonlyArray.ts +2017 -0
- package/src/ReadonlyRecord.ts +641 -0
- package/src/RedBlackTree.ts +415 -0
- package/src/Ref.ts +159 -0
- package/src/Reloadable.ts +136 -0
- package/src/Request.ts +285 -0
- package/src/RequestBlock.ts +157 -0
- package/src/RequestResolver.ts +305 -0
- package/src/Resource.ts +97 -0
- package/src/Runtime.ts +216 -0
- package/src/RuntimeFlags.ts +336 -0
- package/src/RuntimeFlagsPatch.ts +183 -0
- package/src/STM.ts +2076 -0
- package/src/Schedule.ts +1396 -0
- package/src/ScheduleDecision.ts +62 -0
- package/src/ScheduleInterval.ts +151 -0
- package/src/ScheduleIntervals.ts +122 -0
- package/src/Scheduler.ts +359 -0
- package/src/Scope.ts +171 -0
- package/src/ScopedCache.ts +148 -0
- package/src/ScopedRef.ts +95 -0
- package/src/Sink.ts +1431 -0
- package/src/SortedMap.ts +229 -0
- package/src/SortedSet.ts +385 -0
- package/src/Stream.ts +4540 -0
- package/src/StreamEmit.ts +83 -0
- package/src/StreamHaltStrategy.ts +111 -0
- package/src/Streamable.ts +42 -0
- package/src/String.ts +682 -0
- package/src/Struct.ts +151 -0
- package/src/SubscriptionRef.ts +273 -0
- package/src/Supervisor.ts +239 -0
- package/src/Symbol.ts +28 -0
- package/src/SynchronizedRef.ts +249 -0
- package/src/TArray.ts +494 -0
- package/src/TDeferred.ts +99 -0
- package/src/TMap.ts +510 -0
- package/src/TPriorityQueue.ts +223 -0
- package/src/TPubSub.ts +187 -0
- package/src/TQueue.ts +431 -0
- package/src/TRandom.ts +129 -0
- package/src/TReentrantLock.ts +224 -0
- package/src/TRef.ts +176 -0
- package/src/TSemaphore.ts +129 -0
- package/src/TSet.ts +349 -0
- package/src/Take.ts +257 -0
- package/src/TestAnnotation.ts +166 -0
- package/src/TestAnnotationMap.ts +124 -0
- package/src/TestAnnotations.ts +113 -0
- package/src/TestClock.ts +552 -0
- package/src/TestConfig.ts +49 -0
- package/src/TestContext.ts +35 -0
- package/src/TestLive.ts +55 -0
- package/src/TestServices.ts +392 -0
- package/src/TestSized.ts +55 -0
- package/src/Tracer.ts +119 -0
- package/src/Tuple.ts +204 -0
- package/src/Types.ts +123 -0
- package/src/Unify.ts +118 -0
- package/src/Utils.ts +699 -0
- package/src/index.ts +840 -0
- package/src/internal/Common.ts +56 -0
- package/src/internal/Context.ts +252 -0
- package/src/internal/Data.ts +55 -0
- package/src/internal/Differ/ChunkPatch.ts +209 -0
- package/src/internal/Differ/ContextPatch.ts +229 -0
- package/src/internal/Differ/HashMapPatch.ts +217 -0
- package/src/internal/Differ/HashSetPatch.ts +174 -0
- package/src/internal/Differ/OrPatch.ts +296 -0
- package/src/internal/Differ.ts +184 -0
- package/src/internal/Effectable.ts +92 -0
- package/src/internal/Either.ts +107 -0
- package/src/internal/Encoding/Base64.ts +282 -0
- package/src/internal/Encoding/Base64Url.ts +28 -0
- package/src/internal/Encoding/Common.ts +24 -0
- package/src/internal/Encoding/Hex.ts +315 -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 +390 -0
- package/src/internal/HashMap.ts +533 -0
- package/src/internal/HashSet.ts +319 -0
- package/src/internal/Iterable.ts +54 -0
- package/src/internal/Option.ts +79 -0
- package/src/internal/ReadonlyArray.ts +8 -0
- package/src/internal/RedBlackTree/iterator.ts +207 -0
- package/src/internal/RedBlackTree/node.ts +48 -0
- package/src/internal/RedBlackTree.ts +1195 -0
- package/src/internal/Stack.ts +4 -0
- package/src/internal/blockedRequests.ts +512 -0
- package/src/internal/cache.ts +714 -0
- package/src/internal/cause.ts +1205 -0
- package/src/internal/channel/channelExecutor.ts +1193 -0
- package/src/internal/channel/channelState.ts +132 -0
- package/src/internal/channel/childExecutorDecision.ts +95 -0
- package/src/internal/channel/continuation.ts +171 -0
- package/src/internal/channel/mergeDecision.ts +115 -0
- package/src/internal/channel/mergeState.ts +120 -0
- package/src/internal/channel/mergeStrategy.ts +72 -0
- package/src/internal/channel/singleProducerAsyncInput.ts +261 -0
- package/src/internal/channel/subexecutor.ts +229 -0
- package/src/internal/channel/upstreamPullRequest.ts +83 -0
- package/src/internal/channel/upstreamPullStrategy.ts +86 -0
- package/src/internal/channel.ts +2516 -0
- package/src/internal/clock.ts +97 -0
- package/src/internal/completedRequestMap.ts +9 -0
- package/src/internal/concurrency.ts +83 -0
- package/src/internal/config.ts +598 -0
- package/src/internal/configError.ts +291 -0
- package/src/internal/configProvider/pathPatch.ts +97 -0
- package/src/internal/configProvider.ts +692 -0
- package/src/internal/configSecret.ts +71 -0
- package/src/internal/console.ts +136 -0
- package/src/internal/core-effect.ts +2146 -0
- package/src/internal/core-stream.ts +999 -0
- package/src/internal/core.ts +2765 -0
- package/src/internal/dataSource.ts +258 -0
- package/src/internal/defaultServices/console.ts +97 -0
- package/src/internal/defaultServices.ts +140 -0
- package/src/internal/deferred.ts +44 -0
- package/src/internal/effect/circular.ts +664 -0
- package/src/internal/executionStrategy.ts +72 -0
- package/src/internal/fiber.ts +350 -0
- package/src/internal/fiberId.ts +270 -0
- package/src/internal/fiberMessage.ts +85 -0
- package/src/internal/fiberRefs/patch.ts +144 -0
- package/src/internal/fiberRefs.ts +239 -0
- package/src/internal/fiberRuntime.ts +3477 -0
- package/src/internal/fiberScope.ts +72 -0
- package/src/internal/fiberStatus.ts +118 -0
- package/src/internal/groupBy.ts +516 -0
- package/src/internal/keyedPool.ts +240 -0
- package/src/internal/layer/circular.ts +203 -0
- package/src/internal/layer.ts +1230 -0
- package/src/internal/logSpan.ts +15 -0
- package/src/internal/logger-circular.ts +24 -0
- package/src/internal/logger.ts +307 -0
- package/src/internal/metric/boundaries.ts +72 -0
- package/src/internal/metric/hook.ts +459 -0
- package/src/internal/metric/key.ts +173 -0
- package/src/internal/metric/keyType.ts +263 -0
- package/src/internal/metric/label.ts +44 -0
- package/src/internal/metric/pair.ts +48 -0
- package/src/internal/metric/polling.ts +143 -0
- package/src/internal/metric/registry.ts +188 -0
- package/src/internal/metric/state.ts +286 -0
- package/src/internal/metric.ts +522 -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 +83 -0
- package/src/internal/opCodes/layer.ts +53 -0
- package/src/internal/opCodes/streamHaltStrategy.ts +23 -0
- package/src/internal/pool.ts +499 -0
- package/src/internal/pubsub.ts +1557 -0
- package/src/internal/query.ts +199 -0
- package/src/internal/queue.ts +729 -0
- package/src/internal/random.ts +88 -0
- package/src/internal/ref.ts +164 -0
- package/src/internal/reloadable.ts +164 -0
- package/src/internal/request.ts +137 -0
- package/src/internal/resource.ts +64 -0
- package/src/internal/ringBuffer.ts +68 -0
- package/src/internal/runtime.ts +348 -0
- package/src/internal/runtimeFlags.ts +176 -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 +179 -0
- package/src/internal/schedule.ts +2096 -0
- package/src/internal/scopedCache.ts +634 -0
- package/src/internal/scopedRef.ts +133 -0
- package/src/internal/singleShotGen.ts +35 -0
- package/src/internal/sink.ts +2118 -0
- package/src/internal/stm/core.ts +804 -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/entry.ts +59 -0
- package/src/internal/stm/stm/journal.ts +123 -0
- package/src/internal/stm/stm/opCodes/stm.ts +71 -0
- package/src/internal/stm/stm/opCodes/stmState.ts +17 -0
- package/src/internal/stm/stm/opCodes/strategy.ts +17 -0
- package/src/internal/stm/stm/opCodes/tExit.ts +29 -0
- package/src/internal/stm/stm/opCodes/tryCommit.ts +11 -0
- package/src/internal/stm/stm/stmState.ts +130 -0
- package/src/internal/stm/stm/tExit.ts +180 -0
- package/src/internal/stm/stm/tryCommit.ts +34 -0
- package/src/internal/stm/stm/txnId.ts +14 -0
- package/src/internal/stm/stm/versioned.ts +4 -0
- package/src/internal/stm/stm.ts +1491 -0
- package/src/internal/stm/tArray.ts +550 -0
- package/src/internal/stm/tDeferred.ts +79 -0
- package/src/internal/stm/tMap.ts +824 -0
- package/src/internal/stm/tPriorityQueue.ts +259 -0
- package/src/internal/stm/tPubSub.ts +542 -0
- package/src/internal/stm/tQueue.ts +400 -0
- package/src/internal/stm/tRandom.ts +140 -0
- package/src/internal/stm/tReentrantLock.ts +352 -0
- package/src/internal/stm/tRef.ts +190 -0
- package/src/internal/stm/tSemaphore.ts +113 -0
- package/src/internal/stm/tSet.ts +237 -0
- package/src/internal/stream/debounceState.ts +57 -0
- package/src/internal/stream/emit.ts +46 -0
- package/src/internal/stream/haltStrategy.ts +85 -0
- package/src/internal/stream/handoff.ts +185 -0
- package/src/internal/stream/handoffSignal.ts +59 -0
- package/src/internal/stream/pull.ts +35 -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 +8089 -0
- package/src/internal/string-utils.ts +107 -0
- package/src/internal/subscriptionRef.ts +133 -0
- package/src/internal/supervisor/patch.ts +190 -0
- package/src/internal/supervisor.ts +301 -0
- package/src/internal/synchronizedRef.ts +115 -0
- package/src/internal/take.ts +198 -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/timeout.ts +23 -0
- package/src/internal/tracer.ts +74 -0
- package/Error/dist/effect-Error.cjs.d.mts +0 -2
- package/Error/dist/effect-Error.cjs.d.mts.map +0 -1
- package/Error/dist/effect-Error.cjs.d.ts +0 -2
- package/Error/dist/effect-Error.cjs.d.ts.map +0 -1
- package/Error/dist/effect-Error.cjs.dev.js +0 -140
- package/Error/dist/effect-Error.cjs.js +0 -7
- package/Error/dist/effect-Error.cjs.mjs +0 -4
- package/Error/dist/effect-Error.cjs.prod.js +0 -140
- package/Error/dist/effect-Error.esm.js +0 -47
- package/Error/package.json +0 -4
- package/Hub/dist/effect-Hub.cjs.d.mts +0 -2
- package/Hub/dist/effect-Hub.cjs.d.mts.map +0 -1
- package/Hub/dist/effect-Hub.cjs.d.ts +0 -2
- package/Hub/dist/effect-Hub.cjs.d.ts.map +0 -1
- package/Hub/dist/effect-Hub.cjs.js +0 -7
- package/Hub/package.json +0 -4
- package/THub/dist/effect-THub.cjs.d.mts +0 -2
- package/THub/dist/effect-THub.cjs.d.mts.map +0 -1
- package/THub/dist/effect-THub.cjs.d.ts +0 -2
- package/THub/dist/effect-THub.cjs.d.ts.map +0 -1
- package/THub/dist/effect-THub.cjs.js +0 -7
- package/THub/dist/effect-THub.esm.js +0 -157
- package/THub/package.json +0 -4
- package/dist/declarations/src/Error.d.ts +0 -37
- package/dist/declarations/src/Error.d.ts.map +0 -1
- package/dist/declarations/src/Hub.d.ts.map +0 -1
- package/dist/declarations/src/THub.d.ts +0 -146
- package/dist/declarations/src/THub.d.ts.map +0 -1
- package/dist/scopedRef-1c2c9acf.cjs.prod.js +0 -55
- package/dist/scopedRef-ab4c58b0.cjs.dev.js +0 -55
- /package/dist/{FiberId-e594f6e8.cjs.prod.js → FiberId-1d7ac632.cjs.prod.js} +0 -0
- /package/dist/{FiberId-557db880.cjs.dev.js → FiberId-d88ddce6.cjs.dev.js} +0 -0
- /package/dist/{RuntimeFlagsPatch-ea268c50.cjs.dev.js → RuntimeFlagsPatch-69102b03.cjs.dev.js} +0 -0
- /package/dist/{RuntimeFlagsPatch-e2769b87.cjs.prod.js → RuntimeFlagsPatch-866fa259.cjs.prod.js} +0 -0
- /package/dist/{boundaries-20cfad9d.cjs.prod.js → boundaries-9af538e3.cjs.prod.js} +0 -0
- /package/dist/{boundaries-3810d885.cjs.dev.js → boundaries-f212e414.cjs.dev.js} +0 -0
- /package/dist/{configError-33e55472.cjs.prod.js → configError-b43723af.cjs.prod.js} +0 -0
- /package/dist/{configError-240e9b61.cjs.dev.js → configError-d5efe9c0.cjs.dev.js} +0 -0
- /package/dist/{configSecret-e34c1b14.cjs.dev.js → configSecret-3e8ae336.cjs.dev.js} +0 -0
- /package/dist/{configSecret-d1caca55.cjs.prod.js → configSecret-e2faa181.cjs.prod.js} +0 -0
- /package/dist/{take-2af6e92a.cjs.prod.js → take-85daaf79.cjs.prod.js} +0 -0
- /package/dist/{take-df9480a8.cjs.dev.js → take-f9ef9e2e.cjs.dev.js} +0 -0
package/src/Option.ts
ADDED
|
@@ -0,0 +1,1307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 2.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Data from "./Data"
|
|
5
|
+
import type { Either } from "./Either"
|
|
6
|
+
import * as Equal from "./Equal"
|
|
7
|
+
import * as Equivalence from "./Equivalence"
|
|
8
|
+
import type { LazyArg } from "./Function"
|
|
9
|
+
import { constNull, constUndefined, dual, identity } from "./Function"
|
|
10
|
+
import type { TypeLambda } from "./HKT"
|
|
11
|
+
import type { Inspectable } from "./Inspectable"
|
|
12
|
+
import * as either from "./internal/Either"
|
|
13
|
+
import * as option from "./internal/Option"
|
|
14
|
+
import * as N from "./Number"
|
|
15
|
+
import type { Order } from "./Order"
|
|
16
|
+
import * as order from "./Order"
|
|
17
|
+
import type { Pipeable } from "./Pipeable"
|
|
18
|
+
import type { Predicate, Refinement } from "./Predicate"
|
|
19
|
+
import type * as Unify from "./Unify"
|
|
20
|
+
import * as Gen from "./Utils"
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @category models
|
|
24
|
+
* @since 2.0.0
|
|
25
|
+
*/
|
|
26
|
+
export type Option<A> = None<A> | Some<A>
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @category symbols
|
|
30
|
+
* @since 2.0.0
|
|
31
|
+
*/
|
|
32
|
+
export const TypeId = Symbol.for("effect/Option")
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @category symbols
|
|
36
|
+
* @since 2.0.0
|
|
37
|
+
*/
|
|
38
|
+
export type TypeId = typeof TypeId
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @category models
|
|
42
|
+
* @since 2.0.0
|
|
43
|
+
*/
|
|
44
|
+
export interface None<A> extends Data.Case, Pipeable, Inspectable {
|
|
45
|
+
readonly _tag: "None"
|
|
46
|
+
readonly _op: "None"
|
|
47
|
+
readonly [TypeId]: {
|
|
48
|
+
readonly _A: (_: never) => A
|
|
49
|
+
}
|
|
50
|
+
[Unify.typeSymbol]?: unknown
|
|
51
|
+
[Unify.unifySymbol]?: OptionUnify<this>
|
|
52
|
+
[Unify.blacklistSymbol]?: OptionUnifyBlacklist
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @category models
|
|
57
|
+
* @since 2.0.0
|
|
58
|
+
*/
|
|
59
|
+
export interface Some<A> extends Data.Case, Pipeable, Inspectable {
|
|
60
|
+
readonly _tag: "Some"
|
|
61
|
+
readonly _op: "Some"
|
|
62
|
+
readonly value: A
|
|
63
|
+
readonly [TypeId]: {
|
|
64
|
+
readonly _A: (_: never) => A
|
|
65
|
+
}
|
|
66
|
+
[Unify.typeSymbol]?: unknown
|
|
67
|
+
[Unify.unifySymbol]?: OptionUnify<this>
|
|
68
|
+
[Unify.blacklistSymbol]?: OptionUnifyBlacklist
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @category models
|
|
73
|
+
* @since 2.0.0
|
|
74
|
+
*/
|
|
75
|
+
export interface OptionUnify<A extends { [Unify.typeSymbol]?: any }> {
|
|
76
|
+
Option?: () => A[Unify.typeSymbol] extends Option<infer A0> | infer _ ? Option<A0> : never
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @category models
|
|
81
|
+
* @since 2.0.0
|
|
82
|
+
*/
|
|
83
|
+
export interface OptionUnifyBlacklist {}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @category type lambdas
|
|
87
|
+
* @since 2.0.0
|
|
88
|
+
*/
|
|
89
|
+
export interface OptionTypeLambda extends TypeLambda {
|
|
90
|
+
readonly type: Option<this["Target"]>
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Creates a new `Option` that represents the absence of a value.
|
|
95
|
+
*
|
|
96
|
+
* @category constructors
|
|
97
|
+
* @since 2.0.0
|
|
98
|
+
*/
|
|
99
|
+
export const none = <A = never>(): Option<A> => option.none
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Creates a new `Option` that wraps the given value.
|
|
103
|
+
*
|
|
104
|
+
* @param value - The value to wrap.
|
|
105
|
+
*
|
|
106
|
+
* @category constructors
|
|
107
|
+
* @since 2.0.0
|
|
108
|
+
*/
|
|
109
|
+
export const some: <A>(value: A) => Option<A> = option.some
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Tests if a value is a `Option`.
|
|
113
|
+
*
|
|
114
|
+
* @param input - The value to check.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* import { some, none, isOption } from 'effect/Option'
|
|
118
|
+
*
|
|
119
|
+
* assert.deepStrictEqual(isOption(some(1)), true)
|
|
120
|
+
* assert.deepStrictEqual(isOption(none()), true)
|
|
121
|
+
* assert.deepStrictEqual(isOption({}), false)
|
|
122
|
+
*
|
|
123
|
+
* @category guards
|
|
124
|
+
* @since 2.0.0
|
|
125
|
+
*/
|
|
126
|
+
export const isOption: (input: unknown) => input is Option<unknown> = option.isOption
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Determine if a `Option` is a `None`.
|
|
130
|
+
*
|
|
131
|
+
* @param self - The `Option` to check.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* import { some, none, isNone } from 'effect/Option'
|
|
135
|
+
*
|
|
136
|
+
* assert.deepStrictEqual(isNone(some(1)), false)
|
|
137
|
+
* assert.deepStrictEqual(isNone(none()), true)
|
|
138
|
+
*
|
|
139
|
+
* @category guards
|
|
140
|
+
* @since 2.0.0
|
|
141
|
+
*/
|
|
142
|
+
export const isNone: <A>(self: Option<A>) => self is None<A> = option.isNone
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Determine if a `Option` is a `Some`.
|
|
146
|
+
*
|
|
147
|
+
* @param self - The `Option` to check.
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* import { some, none, isSome } from 'effect/Option'
|
|
151
|
+
*
|
|
152
|
+
* assert.deepStrictEqual(isSome(some(1)), true)
|
|
153
|
+
* assert.deepStrictEqual(isSome(none()), false)
|
|
154
|
+
*
|
|
155
|
+
* @category guards
|
|
156
|
+
* @since 2.0.0
|
|
157
|
+
*/
|
|
158
|
+
export const isSome: <A>(self: Option<A>) => self is Some<A> = option.isSome
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Matches the given `Option` and returns either the provided `onNone` value or the result of the provided `onSome`
|
|
162
|
+
* function when passed the `Option`'s value.
|
|
163
|
+
*
|
|
164
|
+
* @param self - The `Option` to match
|
|
165
|
+
* @param onNone - The value to be returned if the `Option` is `None`
|
|
166
|
+
* @param onSome - The function to be called if the `Option` is `Some`, it will be passed the `Option`'s value and its result will be returned
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* import { some, none, match } from 'effect/Option'
|
|
170
|
+
* import { pipe } from "effect/Function"
|
|
171
|
+
*
|
|
172
|
+
* assert.deepStrictEqual(
|
|
173
|
+
* pipe(some(1), match({ onNone: () => 'a none', onSome: (a) => `a some containing ${a}` })),
|
|
174
|
+
* 'a some containing 1'
|
|
175
|
+
* )
|
|
176
|
+
*
|
|
177
|
+
* assert.deepStrictEqual(
|
|
178
|
+
* pipe(none(), match({ onNone: () => 'a none', onSome: (a) => `a some containing ${a}` })),
|
|
179
|
+
* 'a none'
|
|
180
|
+
* )
|
|
181
|
+
*
|
|
182
|
+
* @category pattern matching
|
|
183
|
+
* @since 2.0.0
|
|
184
|
+
*/
|
|
185
|
+
export const match: {
|
|
186
|
+
<B, A, C = B>(options: {
|
|
187
|
+
readonly onNone: LazyArg<B>
|
|
188
|
+
readonly onSome: (a: A) => C
|
|
189
|
+
}): (self: Option<A>) => B | C
|
|
190
|
+
<A, B, C = B>(self: Option<A>, options: {
|
|
191
|
+
readonly onNone: LazyArg<B>
|
|
192
|
+
readonly onSome: (a: A) => C
|
|
193
|
+
}): B | C
|
|
194
|
+
} = dual(
|
|
195
|
+
2,
|
|
196
|
+
<A, B, C = B>(self: Option<A>, { onNone, onSome }: {
|
|
197
|
+
readonly onNone: LazyArg<B>
|
|
198
|
+
readonly onSome: (a: A) => C
|
|
199
|
+
}): B | C => isNone(self) ? onNone() : onSome(self.value)
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Returns a type guard from a `Option` returning function.
|
|
204
|
+
* This function ensures that a type guard definition is type-safe.
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* import * as O from "effect/Option"
|
|
208
|
+
*
|
|
209
|
+
* const parsePositive = (n: number): O.Option<number> =>
|
|
210
|
+
* n > 0 ? O.some(n) : O.none()
|
|
211
|
+
*
|
|
212
|
+
* const isPositive = O.toRefinement(parsePositive)
|
|
213
|
+
*
|
|
214
|
+
* assert.deepStrictEqual(isPositive(1), true)
|
|
215
|
+
* assert.deepStrictEqual(isPositive(-1), false)
|
|
216
|
+
*
|
|
217
|
+
* @category conversions
|
|
218
|
+
* @since 2.0.0
|
|
219
|
+
*/
|
|
220
|
+
export const toRefinement = <A, B extends A>(f: (a: A) => Option<B>): (a: A) => a is B => (a: A): a is B => isSome(f(a))
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Converts an `Iterable` of values into an `Option`. Returns the first value of the `Iterable` wrapped in a `Some`
|
|
224
|
+
* if the `Iterable` is not empty, otherwise returns `None`.
|
|
225
|
+
*
|
|
226
|
+
* @param collection - The `Iterable` to be converted to an `Option`.
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* import { fromIterable, some, none } from 'effect/Option'
|
|
230
|
+
*
|
|
231
|
+
* assert.deepStrictEqual(fromIterable([1, 2, 3]), some(1))
|
|
232
|
+
* assert.deepStrictEqual(fromIterable([]), none())
|
|
233
|
+
*
|
|
234
|
+
* @category conversions
|
|
235
|
+
* @since 2.0.0
|
|
236
|
+
*/
|
|
237
|
+
export const fromIterable = <A>(collection: Iterable<A>): Option<A> => {
|
|
238
|
+
for (const a of collection) {
|
|
239
|
+
return some(a)
|
|
240
|
+
}
|
|
241
|
+
return none()
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Converts a `Either` to an `Option` discarding the error.
|
|
246
|
+
*
|
|
247
|
+
* Alias of {@link fromEither}.
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
* import * as O from "effect/Option"
|
|
251
|
+
* import * as E from "effect/Either"
|
|
252
|
+
*
|
|
253
|
+
* assert.deepStrictEqual(O.getRight(E.right('ok')), O.some('ok'))
|
|
254
|
+
* assert.deepStrictEqual(O.getRight(E.left('err')), O.none())
|
|
255
|
+
*
|
|
256
|
+
* @category conversions
|
|
257
|
+
* @since 2.0.0
|
|
258
|
+
*/
|
|
259
|
+
export const getRight: <E, A>(self: Either<E, A>) => Option<A> = either.getRight
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Converts a `Either` to an `Option` discarding the value.
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* import * as O from "effect/Option"
|
|
266
|
+
* import * as E from "effect/Either"
|
|
267
|
+
*
|
|
268
|
+
* assert.deepStrictEqual(O.getLeft(E.right("ok")), O.none())
|
|
269
|
+
* assert.deepStrictEqual(O.getLeft(E.left("a")), O.some("a"))
|
|
270
|
+
*
|
|
271
|
+
* @category conversions
|
|
272
|
+
* @since 2.0.0
|
|
273
|
+
*/
|
|
274
|
+
export const getLeft: <E, A>(self: Either<E, A>) => Option<E> = either.getLeft
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Returns the value of the `Option` if it is `Some`, otherwise returns `onNone`
|
|
278
|
+
*
|
|
279
|
+
* @param self - The `Option` to get the value of.
|
|
280
|
+
* @param onNone - Function that returns the default value to return if the `Option` is `None`.
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* import { some, none, getOrElse } from 'effect/Option'
|
|
284
|
+
* import { pipe } from "effect/Function"
|
|
285
|
+
*
|
|
286
|
+
* assert.deepStrictEqual(pipe(some(1), getOrElse(() => 0)), 1)
|
|
287
|
+
* assert.deepStrictEqual(pipe(none(), getOrElse(() => 0)), 0)
|
|
288
|
+
*
|
|
289
|
+
* @category getters
|
|
290
|
+
* @since 2.0.0
|
|
291
|
+
*/
|
|
292
|
+
export const getOrElse: {
|
|
293
|
+
<B>(onNone: LazyArg<B>): <A>(self: Option<A>) => B | A
|
|
294
|
+
<A, B>(self: Option<A>, onNone: LazyArg<B>): A | B
|
|
295
|
+
} = dual(
|
|
296
|
+
2,
|
|
297
|
+
<A, B>(self: Option<A>, onNone: LazyArg<B>): A | B => isNone(self) ? onNone() : self.value
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Returns the provided `Option` `that` if `self` is `None`, otherwise returns `self`.
|
|
302
|
+
*
|
|
303
|
+
* @param self - The first `Option` to be checked.
|
|
304
|
+
* @param that - The `Option` to return if `self` is `None`.
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* import * as O from "effect/Option"
|
|
308
|
+
* import { pipe } from "effect/Function"
|
|
309
|
+
*
|
|
310
|
+
* assert.deepStrictEqual(
|
|
311
|
+
* pipe(
|
|
312
|
+
* O.none(),
|
|
313
|
+
* O.orElse(() => O.none())
|
|
314
|
+
* ),
|
|
315
|
+
* O.none()
|
|
316
|
+
* )
|
|
317
|
+
* assert.deepStrictEqual(
|
|
318
|
+
* pipe(
|
|
319
|
+
* O.some('a'),
|
|
320
|
+
* O.orElse(() => O.none())
|
|
321
|
+
* ),
|
|
322
|
+
* O.some('a')
|
|
323
|
+
* )
|
|
324
|
+
* assert.deepStrictEqual(
|
|
325
|
+
* pipe(
|
|
326
|
+
* O.none(),
|
|
327
|
+
* O.orElse(() => O.some('b'))
|
|
328
|
+
* ),
|
|
329
|
+
* O.some('b')
|
|
330
|
+
* )
|
|
331
|
+
* assert.deepStrictEqual(
|
|
332
|
+
* pipe(
|
|
333
|
+
* O.some('a'),
|
|
334
|
+
* O.orElse(() => O.some('b'))
|
|
335
|
+
* ),
|
|
336
|
+
* O.some('a')
|
|
337
|
+
* )
|
|
338
|
+
*
|
|
339
|
+
* @category error handling
|
|
340
|
+
* @since 2.0.0
|
|
341
|
+
*/
|
|
342
|
+
export const orElse: {
|
|
343
|
+
<B>(that: LazyArg<Option<B>>): <A>(self: Option<A>) => Option<B | A>
|
|
344
|
+
<A, B>(self: Option<A>, that: LazyArg<Option<B>>): Option<A | B>
|
|
345
|
+
} = dual(
|
|
346
|
+
2,
|
|
347
|
+
<A, B>(self: Option<A>, that: LazyArg<Option<B>>): Option<A | B> => isNone(self) ? that() : self
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Similar to `orElse`, but instead of returning a simple union, it returns an `Either` object,
|
|
352
|
+
* which contains information about which of the two `Option`s has been chosen.
|
|
353
|
+
*
|
|
354
|
+
* This is useful when it's important to know whether the value was retrieved from the first `Option` or the second option.
|
|
355
|
+
*
|
|
356
|
+
* @param self - The first `Option` to be checked.
|
|
357
|
+
* @param that - The second `Option` to be considered if the first `Option` is `None`.
|
|
358
|
+
*
|
|
359
|
+
* @category error handling
|
|
360
|
+
* @since 2.0.0
|
|
361
|
+
*/
|
|
362
|
+
export const orElseEither: {
|
|
363
|
+
<B>(that: LazyArg<Option<B>>): <A>(self: Option<A>) => Option<Either<A, B>>
|
|
364
|
+
<A, B>(self: Option<A>, that: LazyArg<Option<B>>): Option<Either<A, B>>
|
|
365
|
+
} = dual(
|
|
366
|
+
2,
|
|
367
|
+
<A, B>(self: Option<A>, that: LazyArg<Option<B>>): Option<Either<A, B>> =>
|
|
368
|
+
isNone(self) ? map(that(), either.right) : map(self, either.left)
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Given an `Iterable` collection of `Option`s, returns the first `Some` found in the collection.
|
|
373
|
+
*
|
|
374
|
+
* @param collection - An iterable collection of `Option` to be searched.
|
|
375
|
+
*
|
|
376
|
+
* @example
|
|
377
|
+
* import * as O from "effect/Option"
|
|
378
|
+
*
|
|
379
|
+
* assert.deepStrictEqual(O.firstSomeOf([O.none(), O.some(1), O.some(2)]), O.some(1))
|
|
380
|
+
*
|
|
381
|
+
* @category error handling
|
|
382
|
+
* @since 2.0.0
|
|
383
|
+
*/
|
|
384
|
+
export const firstSomeOf = <A>(collection: Iterable<Option<A>>): Option<A> => {
|
|
385
|
+
let out: Option<A> = none()
|
|
386
|
+
for (out of collection) {
|
|
387
|
+
if (isSome(out)) {
|
|
388
|
+
return out
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return out
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Constructs a new `Option` from a nullable type. If the value is `null` or `undefined`, returns `None`, otherwise
|
|
396
|
+
* returns the value wrapped in a `Some`.
|
|
397
|
+
*
|
|
398
|
+
* @param nullableValue - The nullable value to be converted to an `Option`.
|
|
399
|
+
*
|
|
400
|
+
* @example
|
|
401
|
+
* import * as O from "effect/Option"
|
|
402
|
+
*
|
|
403
|
+
* assert.deepStrictEqual(O.fromNullable(undefined), O.none())
|
|
404
|
+
* assert.deepStrictEqual(O.fromNullable(null), O.none())
|
|
405
|
+
* assert.deepStrictEqual(O.fromNullable(1), O.some(1))
|
|
406
|
+
*
|
|
407
|
+
* @category conversions
|
|
408
|
+
* @since 2.0.0
|
|
409
|
+
*/
|
|
410
|
+
export const fromNullable = <A>(
|
|
411
|
+
nullableValue: A
|
|
412
|
+
): Option<
|
|
413
|
+
NonNullable<A>
|
|
414
|
+
> => (nullableValue == null ? none() : some(nullableValue as NonNullable<A>))
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* This API is useful for lifting a function that returns `null` or `undefined` into the `Option` context.
|
|
418
|
+
*
|
|
419
|
+
* @example
|
|
420
|
+
* import * as O from "effect/Option"
|
|
421
|
+
*
|
|
422
|
+
* const parse = (s: string): number | undefined => {
|
|
423
|
+
* const n = parseFloat(s)
|
|
424
|
+
* return isNaN(n) ? undefined : n
|
|
425
|
+
* }
|
|
426
|
+
*
|
|
427
|
+
* const parseOption = O.liftNullable(parse)
|
|
428
|
+
*
|
|
429
|
+
* assert.deepStrictEqual(parseOption('1'), O.some(1))
|
|
430
|
+
* assert.deepStrictEqual(parseOption('not a number'), O.none())
|
|
431
|
+
*
|
|
432
|
+
* @category conversions
|
|
433
|
+
* @since 2.0.0
|
|
434
|
+
*/
|
|
435
|
+
export const liftNullable = <A extends ReadonlyArray<unknown>, B>(
|
|
436
|
+
f: (...a: A) => B | null | undefined
|
|
437
|
+
): (...a: A) => Option<NonNullable<B>> =>
|
|
438
|
+
(...a) => fromNullable(f(...a))
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Returns the value of the `Option` if it is a `Some`, otherwise returns `null`.
|
|
442
|
+
*
|
|
443
|
+
* @param self - The `Option` to extract the value from.
|
|
444
|
+
*
|
|
445
|
+
* @example
|
|
446
|
+
* import * as O from "effect/Option"
|
|
447
|
+
*
|
|
448
|
+
* assert.deepStrictEqual(O.getOrNull(O.some(1)), 1)
|
|
449
|
+
* assert.deepStrictEqual(O.getOrNull(O.none()), null)
|
|
450
|
+
*
|
|
451
|
+
* @category getters
|
|
452
|
+
* @since 2.0.0
|
|
453
|
+
*/
|
|
454
|
+
export const getOrNull: <A>(self: Option<A>) => A | null = getOrElse(constNull)
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Returns the value of the `Option` if it is a `Some`, otherwise returns `undefined`.
|
|
458
|
+
*
|
|
459
|
+
* @param self - The `Option` to extract the value from.
|
|
460
|
+
*
|
|
461
|
+
* @example
|
|
462
|
+
* import * as O from "effect/Option"
|
|
463
|
+
*
|
|
464
|
+
* assert.deepStrictEqual(O.getOrUndefined(O.some(1)), 1)
|
|
465
|
+
* assert.deepStrictEqual(O.getOrUndefined(O.none()), undefined)
|
|
466
|
+
*
|
|
467
|
+
* @category getters
|
|
468
|
+
* @since 2.0.0
|
|
469
|
+
*/
|
|
470
|
+
export const getOrUndefined: <A>(self: Option<A>) => A | undefined = getOrElse(constUndefined)
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* A utility function that lifts a function that throws exceptions into a function that returns an `Option`.
|
|
474
|
+
*
|
|
475
|
+
* This function is useful for any function that might throw an exception, allowing the developer to handle
|
|
476
|
+
* the exception in a more functional way.
|
|
477
|
+
*
|
|
478
|
+
* @param f - the function that can throw exceptions.
|
|
479
|
+
*
|
|
480
|
+
* @example
|
|
481
|
+
* import * as O from "effect/Option"
|
|
482
|
+
*
|
|
483
|
+
* const parse = O.liftThrowable(JSON.parse)
|
|
484
|
+
*
|
|
485
|
+
* assert.deepStrictEqual(parse("1"), O.some(1))
|
|
486
|
+
* assert.deepStrictEqual(parse(""), O.none())
|
|
487
|
+
*
|
|
488
|
+
* @category conversions
|
|
489
|
+
* @since 2.0.0
|
|
490
|
+
*/
|
|
491
|
+
export const liftThrowable = <A extends ReadonlyArray<unknown>, B>(
|
|
492
|
+
f: (...a: A) => B
|
|
493
|
+
): (...a: A) => Option<B> =>
|
|
494
|
+
(...a) => {
|
|
495
|
+
try {
|
|
496
|
+
return some(f(...a))
|
|
497
|
+
} catch (e) {
|
|
498
|
+
return none()
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Extracts the value of an `Option` or throws if the `Option` is `None`.
|
|
504
|
+
*
|
|
505
|
+
* If a default error is sufficient for your use case and you don't need to configure the thrown error, see {@link getOrThrow}.
|
|
506
|
+
*
|
|
507
|
+
* @param self - The `Option` to extract the value from.
|
|
508
|
+
* @param onNone - A function that will be called if the `Option` is `None`. It returns the error to be thrown.
|
|
509
|
+
*
|
|
510
|
+
* @example
|
|
511
|
+
* import * as O from "effect/Option"
|
|
512
|
+
*
|
|
513
|
+
* assert.deepStrictEqual(
|
|
514
|
+
* O.getOrThrowWith(O.some(1), () => new Error('Unexpected None')),
|
|
515
|
+
* 1
|
|
516
|
+
* )
|
|
517
|
+
* assert.throws(() => O.getOrThrowWith(O.none(), () => new Error('Unexpected None')))
|
|
518
|
+
*
|
|
519
|
+
* @category conversions
|
|
520
|
+
* @since 2.0.0
|
|
521
|
+
*/
|
|
522
|
+
export const getOrThrowWith: {
|
|
523
|
+
(onNone: () => unknown): <A>(self: Option<A>) => A
|
|
524
|
+
<A>(self: Option<A>, onNone: () => unknown): A
|
|
525
|
+
} = dual(2, <A>(self: Option<A>, onNone: () => unknown): A => {
|
|
526
|
+
if (isSome(self)) {
|
|
527
|
+
return self.value
|
|
528
|
+
}
|
|
529
|
+
throw onNone()
|
|
530
|
+
})
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* Extracts the value of an `Option` or throws if the `Option` is `None`.
|
|
534
|
+
*
|
|
535
|
+
* The thrown error is a default error. To configure the error thrown, see {@link getOrThrowWith}.
|
|
536
|
+
*
|
|
537
|
+
* @param self - The `Option` to extract the value from.
|
|
538
|
+
* @throws `Error("getOrThrow called on a None")`
|
|
539
|
+
*
|
|
540
|
+
* @example
|
|
541
|
+
* import * as O from "effect/Option"
|
|
542
|
+
*
|
|
543
|
+
* assert.deepStrictEqual(O.getOrThrow(O.some(1)), 1)
|
|
544
|
+
* assert.throws(() => O.getOrThrow(O.none()))
|
|
545
|
+
*
|
|
546
|
+
* @category conversions
|
|
547
|
+
* @since 2.0.0
|
|
548
|
+
*/
|
|
549
|
+
export const getOrThrow: <A>(self: Option<A>) => A = getOrThrowWith(() => new Error("getOrThrow called on a None"))
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Maps the `Some` side of an `Option` value to a new `Option` value.
|
|
553
|
+
*
|
|
554
|
+
* @param self - An `Option` to map
|
|
555
|
+
* @param f - The function to map over the value of the `Option`
|
|
556
|
+
*
|
|
557
|
+
* @category transforming
|
|
558
|
+
* @since 2.0.0
|
|
559
|
+
*/
|
|
560
|
+
export const map: {
|
|
561
|
+
<A, B>(f: (a: A) => B): (self: Option<A>) => Option<B>
|
|
562
|
+
<A, B>(self: Option<A>, f: (a: A) => B): Option<B>
|
|
563
|
+
} = dual(
|
|
564
|
+
2,
|
|
565
|
+
<A, B>(self: Option<A>, f: (a: A) => B): Option<B> => isNone(self) ? none() : some(f(self.value))
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Maps the `Some` value of this `Option` to the specified constant value.
|
|
570
|
+
*
|
|
571
|
+
* @category transforming
|
|
572
|
+
* @since 2.0.0
|
|
573
|
+
*/
|
|
574
|
+
export const as: {
|
|
575
|
+
<B>(b: B): <_>(self: Option<_>) => Option<B>
|
|
576
|
+
} = dual(2, <_, B>(self: Option<_>, b: B): Option<B> => map(self, () => b))
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* Maps the `Some` value of this `Option` to the `void` constant value.
|
|
580
|
+
*
|
|
581
|
+
* This is useful when the value of the `Option` is not needed, but the presence or absence of the value is important.
|
|
582
|
+
*
|
|
583
|
+
* @category transforming
|
|
584
|
+
* @since 2.0.0
|
|
585
|
+
*/
|
|
586
|
+
export const asUnit: <_>(self: Option<_>) => Option<void> = as(undefined)
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* @since 2.0.0
|
|
590
|
+
*/
|
|
591
|
+
export const unit: Option<void> = some(undefined)
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Applies a function to the value of an `Option` and flattens the result, if the input is `Some`.
|
|
595
|
+
*
|
|
596
|
+
* @category transforming
|
|
597
|
+
* @since 2.0.0
|
|
598
|
+
*/
|
|
599
|
+
export const flatMap: {
|
|
600
|
+
<A, B>(f: (a: A) => Option<B>): (self: Option<A>) => Option<B>
|
|
601
|
+
<A, B>(self: Option<A>, f: (a: A) => Option<B>): Option<B>
|
|
602
|
+
} = dual(
|
|
603
|
+
2,
|
|
604
|
+
<A, B>(self: Option<A>, f: (a: A) => Option<B>): Option<B> => isNone(self) ? none() : f(self.value)
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* This is `flatMap` + `fromNullable`, useful when working with optional values.
|
|
609
|
+
*
|
|
610
|
+
* @example
|
|
611
|
+
* import { some, none, flatMapNullable } from 'effect/Option'
|
|
612
|
+
* import { pipe } from "effect/Function"
|
|
613
|
+
*
|
|
614
|
+
* interface Employee {
|
|
615
|
+
* company?: {
|
|
616
|
+
* address?: {
|
|
617
|
+
* street?: {
|
|
618
|
+
* name?: string
|
|
619
|
+
* }
|
|
620
|
+
* }
|
|
621
|
+
* }
|
|
622
|
+
* }
|
|
623
|
+
*
|
|
624
|
+
* const employee1: Employee = { company: { address: { street: { name: 'high street' } } } }
|
|
625
|
+
*
|
|
626
|
+
* assert.deepStrictEqual(
|
|
627
|
+
* pipe(
|
|
628
|
+
* some(employee1),
|
|
629
|
+
* flatMapNullable(employee => employee.company?.address?.street?.name),
|
|
630
|
+
* ),
|
|
631
|
+
* some('high street')
|
|
632
|
+
* )
|
|
633
|
+
*
|
|
634
|
+
* const employee2: Employee = { company: { address: { street: {} } } }
|
|
635
|
+
*
|
|
636
|
+
* assert.deepStrictEqual(
|
|
637
|
+
* pipe(
|
|
638
|
+
* some(employee2),
|
|
639
|
+
* flatMapNullable(employee => employee.company?.address?.street?.name),
|
|
640
|
+
* ),
|
|
641
|
+
* none()
|
|
642
|
+
* )
|
|
643
|
+
*
|
|
644
|
+
* @category transforming
|
|
645
|
+
* @since 2.0.0
|
|
646
|
+
*/
|
|
647
|
+
export const flatMapNullable: {
|
|
648
|
+
<A, B>(f: (a: A) => B | null | undefined): (self: Option<A>) => Option<NonNullable<B>>
|
|
649
|
+
<A, B>(self: Option<A>, f: (a: A) => B | null | undefined): Option<NonNullable<B>>
|
|
650
|
+
} = dual(
|
|
651
|
+
2,
|
|
652
|
+
<A, B>(self: Option<A>, f: (a: A) => B | null | undefined): Option<NonNullable<B>> =>
|
|
653
|
+
isNone(self) ? none() : fromNullable(f(self.value))
|
|
654
|
+
)
|
|
655
|
+
|
|
656
|
+
/**
|
|
657
|
+
* @category transforming
|
|
658
|
+
* @since 2.0.0
|
|
659
|
+
*/
|
|
660
|
+
export const flatten: <A>(self: Option<Option<A>>) => Option<A> = flatMap(identity)
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* @category transforming
|
|
664
|
+
* @since 2.0.0
|
|
665
|
+
*/
|
|
666
|
+
export const zipRight: {
|
|
667
|
+
<B>(that: Option<B>): <_>(self: Option<_>) => Option<B>
|
|
668
|
+
<_, B>(self: Option<_>, that: Option<B>): Option<B>
|
|
669
|
+
} = dual(2, <_, B>(self: Option<_>, that: Option<B>): Option<B> => flatMap(self, () => that))
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* @category transforming
|
|
673
|
+
* @since 2.0.0
|
|
674
|
+
*/
|
|
675
|
+
export const composeK: {
|
|
676
|
+
<B, C>(bfc: (b: B) => Option<C>): <A>(afb: (a: A) => Option<B>) => (a: A) => Option<C>
|
|
677
|
+
<A, B, C>(afb: (a: A) => Option<B>, bfc: (b: B) => Option<C>): (a: A) => Option<C>
|
|
678
|
+
} = dual(2, <A, B, C>(afb: (a: A) => Option<B>, bfc: (b: B) => Option<C>) => (a: A): Option<C> => flatMap(afb(a), bfc))
|
|
679
|
+
|
|
680
|
+
/**
|
|
681
|
+
* Sequences the specified `that` `Option` but ignores its value.
|
|
682
|
+
*
|
|
683
|
+
* It is useful when we want to chain multiple operations, but only care about the result of `self`.
|
|
684
|
+
*
|
|
685
|
+
* @param that - The `Option` that will be ignored in the chain and discarded
|
|
686
|
+
* @param self - The `Option` we care about
|
|
687
|
+
*
|
|
688
|
+
* @category transforming
|
|
689
|
+
* @since 2.0.0
|
|
690
|
+
*/
|
|
691
|
+
export const zipLeft: {
|
|
692
|
+
<_>(that: Option<_>): <A>(self: Option<A>) => Option<A>
|
|
693
|
+
<A, _>(self: Option<A>, that: Option<_>): Option<A>
|
|
694
|
+
} = dual(2, <A, _>(self: Option<A>, that: Option<_>): Option<A> => tap(self, () => that))
|
|
695
|
+
|
|
696
|
+
/**
|
|
697
|
+
* Applies the provided function `f` to the value of the `Option` if it is `Some` and returns the original `Option`
|
|
698
|
+
* unless `f` returns `None`, in which case it returns `None`.
|
|
699
|
+
*
|
|
700
|
+
* This function is useful for performing additional computations on the value of the input `Option` without affecting its value.
|
|
701
|
+
*
|
|
702
|
+
* @param f - Function to apply to the value of the `Option` if it is `Some`
|
|
703
|
+
* @param self - The `Option` to apply the function to
|
|
704
|
+
*
|
|
705
|
+
* @example
|
|
706
|
+
* import * as O from "effect/Option"
|
|
707
|
+
*
|
|
708
|
+
* const getInteger = (n: number) => Number.isInteger(n) ? O.some(n) : O.none()
|
|
709
|
+
*
|
|
710
|
+
* assert.deepStrictEqual(O.tap(O.none(), getInteger), O.none())
|
|
711
|
+
* assert.deepStrictEqual(O.tap(O.some(1), getInteger), O.some(1))
|
|
712
|
+
* assert.deepStrictEqual(O.tap(O.some(1.14), getInteger), O.none())
|
|
713
|
+
*
|
|
714
|
+
* @category transforming
|
|
715
|
+
* @since 2.0.0
|
|
716
|
+
*/
|
|
717
|
+
export const tap: {
|
|
718
|
+
<A, _>(f: (a: A) => Option<_>): (self: Option<A>) => Option<A>
|
|
719
|
+
<A, _>(self: Option<A>, f: (a: A) => Option<_>): Option<A>
|
|
720
|
+
} = dual(2, <A, _>(self: Option<A>, f: (a: A) => Option<_>): Option<A> => flatMap(self, (a) => map(f(a), () => a)))
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* @category combining
|
|
724
|
+
* @since 2.0.0
|
|
725
|
+
*/
|
|
726
|
+
export const product = <A, B>(self: Option<A>, that: Option<B>): Option<[A, B]> =>
|
|
727
|
+
isSome(self) && isSome(that) ? some([self.value, that.value]) : none()
|
|
728
|
+
|
|
729
|
+
/**
|
|
730
|
+
* @category combining
|
|
731
|
+
* @since 2.0.0
|
|
732
|
+
*/
|
|
733
|
+
export const productMany = <A>(
|
|
734
|
+
self: Option<A>,
|
|
735
|
+
collection: Iterable<Option<A>>
|
|
736
|
+
): Option<[A, ...Array<A>]> => {
|
|
737
|
+
if (isNone(self)) {
|
|
738
|
+
return none()
|
|
739
|
+
}
|
|
740
|
+
const out: [A, ...Array<A>] = [self.value]
|
|
741
|
+
for (const o of collection) {
|
|
742
|
+
if (isNone(o)) {
|
|
743
|
+
return none()
|
|
744
|
+
}
|
|
745
|
+
out.push(o.value)
|
|
746
|
+
}
|
|
747
|
+
return some(out)
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
/**
|
|
751
|
+
* Takes a structure of `Option`s and returns an `Option` of values with the same structure.
|
|
752
|
+
*
|
|
753
|
+
* - If a tuple is supplied, then the returned `Option` will contain a tuple with the same length.
|
|
754
|
+
* - If a struct is supplied, then the returned `Option` will contain a struct with the same keys.
|
|
755
|
+
* - If an iterable is supplied, then the returned `Option` will contain an array.
|
|
756
|
+
*
|
|
757
|
+
* @param fields - the struct of `Option`s to be sequenced.
|
|
758
|
+
*
|
|
759
|
+
* @example
|
|
760
|
+
* import * as O from "effect/Option"
|
|
761
|
+
*
|
|
762
|
+
* assert.deepStrictEqual(O.all([O.some(1), O.some(2)]), O.some([1, 2]))
|
|
763
|
+
* assert.deepStrictEqual(O.all({ a: O.some(1), b: O.some("hello") }), O.some({ a: 1, b: "hello" }))
|
|
764
|
+
* assert.deepStrictEqual(O.all({ a: O.some(1), b: O.none() }), O.none())
|
|
765
|
+
*
|
|
766
|
+
* @category combining
|
|
767
|
+
* @since 2.0.0
|
|
768
|
+
*/
|
|
769
|
+
// @ts-expect-error
|
|
770
|
+
export const all: <const I extends Iterable<Option<any>> | Record<string, Option<any>>>(
|
|
771
|
+
input: I
|
|
772
|
+
) => [I] extends [ReadonlyArray<Option<any>>] ? Option<
|
|
773
|
+
{ -readonly [K in keyof I]: [I[K]] extends [Option<infer A>] ? A : never }
|
|
774
|
+
>
|
|
775
|
+
: [I] extends [Iterable<Option<infer A>>] ? Option<Array<A>>
|
|
776
|
+
: Option<{ -readonly [K in keyof I]: [I[K]] extends [Option<infer A>] ? A : never }> = (
|
|
777
|
+
input: Iterable<Option<any>> | Record<string, Option<any>>
|
|
778
|
+
): Option<any> => {
|
|
779
|
+
if (Symbol.iterator in input) {
|
|
780
|
+
const out: Array<Option<any>> = []
|
|
781
|
+
for (const o of (input as Iterable<Option<any>>)) {
|
|
782
|
+
if (isNone(o)) {
|
|
783
|
+
return none()
|
|
784
|
+
}
|
|
785
|
+
out.push(o.value)
|
|
786
|
+
}
|
|
787
|
+
return some(out)
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
const out: Record<string, any> = {}
|
|
791
|
+
for (const key of Object.keys(input)) {
|
|
792
|
+
const o = input[key]
|
|
793
|
+
if (isNone(o)) {
|
|
794
|
+
return none()
|
|
795
|
+
}
|
|
796
|
+
out[key] = o.value
|
|
797
|
+
}
|
|
798
|
+
return some(out)
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
/**
|
|
802
|
+
* Zips two `Option` values together using a provided function, returning a new `Option` of the result.
|
|
803
|
+
*
|
|
804
|
+
* @param self - The left-hand side of the zip operation
|
|
805
|
+
* @param that - The right-hand side of the zip operation
|
|
806
|
+
* @param f - The function used to combine the values of the two `Option`s
|
|
807
|
+
*
|
|
808
|
+
* @example
|
|
809
|
+
* import * as O from "effect/Option"
|
|
810
|
+
*
|
|
811
|
+
* type Complex = [number, number]
|
|
812
|
+
*
|
|
813
|
+
* const complex = (real: number, imaginary: number): Complex => [real, imaginary]
|
|
814
|
+
*
|
|
815
|
+
* assert.deepStrictEqual(O.zipWith(O.none(), O.none(), complex), O.none())
|
|
816
|
+
* assert.deepStrictEqual(O.zipWith(O.some(1), O.none(), complex), O.none())
|
|
817
|
+
* assert.deepStrictEqual(O.zipWith(O.none(), O.some(1), complex), O.none())
|
|
818
|
+
* assert.deepStrictEqual(O.zipWith(O.some(1), O.some(2), complex), O.some([1, 2]))
|
|
819
|
+
*
|
|
820
|
+
* assert.deepStrictEqual(O.zipWith(O.some(1), complex)(O.some(2)), O.some([2, 1]))
|
|
821
|
+
*
|
|
822
|
+
* @category combining
|
|
823
|
+
* @since 2.0.0
|
|
824
|
+
*/
|
|
825
|
+
export const zipWith: {
|
|
826
|
+
<B, A, C>(that: Option<B>, f: (a: A, b: B) => C): (self: Option<A>) => Option<C>
|
|
827
|
+
<A, B, C>(self: Option<A>, that: Option<B>, f: (a: A, b: B) => C): Option<C>
|
|
828
|
+
} = dual(
|
|
829
|
+
3,
|
|
830
|
+
<A, B, C>(self: Option<A>, that: Option<B>, f: (a: A, b: B) => C): Option<C> =>
|
|
831
|
+
map(product(self, that), ([a, b]) => f(a, b))
|
|
832
|
+
)
|
|
833
|
+
|
|
834
|
+
/**
|
|
835
|
+
* @category combining
|
|
836
|
+
* @since 2.0.0
|
|
837
|
+
*/
|
|
838
|
+
export const ap: {
|
|
839
|
+
<A>(that: Option<A>): <B>(self: Option<(a: A) => B>) => Option<B>
|
|
840
|
+
<A, B>(self: Option<(a: A) => B>, that: Option<A>): Option<B>
|
|
841
|
+
} = dual(2, <A, B>(self: Option<(a: A) => B>, that: Option<A>): Option<B> => zipWith(self, that, (f, a) => f(a)))
|
|
842
|
+
|
|
843
|
+
/**
|
|
844
|
+
* Reduces an `Iterable` of `Option<A>` to a single value of type `B`, elements that are `None` are ignored.
|
|
845
|
+
*
|
|
846
|
+
* @param self - The Iterable of `Option<A>` to be reduced.
|
|
847
|
+
* @param b - The initial value of the accumulator.
|
|
848
|
+
* @param f - The reducing function that takes the current accumulator value and the unwrapped value of an `Option<A>`.
|
|
849
|
+
*
|
|
850
|
+
* @example
|
|
851
|
+
* import { some, none, reduceCompact } from 'effect/Option'
|
|
852
|
+
* import { pipe } from "effect/Function"
|
|
853
|
+
*
|
|
854
|
+
* const iterable = [some(1), none(), some(2), none()]
|
|
855
|
+
* assert.deepStrictEqual(pipe(iterable, reduceCompact(0, (b, a) => b + a)), 3)
|
|
856
|
+
*
|
|
857
|
+
* @category folding
|
|
858
|
+
* @since 2.0.0
|
|
859
|
+
*/
|
|
860
|
+
export const reduceCompact: {
|
|
861
|
+
<B, A>(b: B, f: (b: B, a: A) => B): (self: Iterable<Option<A>>) => B
|
|
862
|
+
<A, B>(self: Iterable<Option<A>>, b: B, f: (b: B, a: A) => B): B
|
|
863
|
+
} = dual(
|
|
864
|
+
3,
|
|
865
|
+
<A, B>(self: Iterable<Option<A>>, b: B, f: (b: B, a: A) => B): B => {
|
|
866
|
+
let out: B = b
|
|
867
|
+
for (const oa of self) {
|
|
868
|
+
if (isSome(oa)) {
|
|
869
|
+
out = f(out, oa.value)
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
return out
|
|
873
|
+
}
|
|
874
|
+
)
|
|
875
|
+
|
|
876
|
+
/**
|
|
877
|
+
* Transforms an `Option` into an `Array`.
|
|
878
|
+
* If the input is `None`, an empty array is returned.
|
|
879
|
+
* If the input is `Some`, the value is wrapped in an array.
|
|
880
|
+
*
|
|
881
|
+
* @param self - The `Option` to convert to an array.
|
|
882
|
+
*
|
|
883
|
+
* @example
|
|
884
|
+
* import * as O from "effect/Option"
|
|
885
|
+
*
|
|
886
|
+
* assert.deepStrictEqual(O.toArray(O.some(1)), [1])
|
|
887
|
+
* assert.deepStrictEqual(O.toArray(O.none()), [])
|
|
888
|
+
*
|
|
889
|
+
* @category conversions
|
|
890
|
+
* @since 2.0.0
|
|
891
|
+
*/
|
|
892
|
+
export const toArray = <A>(self: Option<A>): Array<A> => isNone(self) ? [] : [self.value]
|
|
893
|
+
|
|
894
|
+
/**
|
|
895
|
+
* @category filtering
|
|
896
|
+
* @since 2.0.0
|
|
897
|
+
*/
|
|
898
|
+
export const partitionMap: {
|
|
899
|
+
<A, B, C>(f: (a: A) => Either<B, C>): (self: Option<A>) => [Option<B>, Option<C>]
|
|
900
|
+
<A, B, C>(self: Option<A>, f: (a: A) => Either<B, C>): [Option<B>, Option<C>]
|
|
901
|
+
} = dual(2, <A, B, C>(
|
|
902
|
+
self: Option<A>,
|
|
903
|
+
f: (a: A) => Either<B, C>
|
|
904
|
+
): [Option<B>, Option<C>] => {
|
|
905
|
+
if (isNone(self)) {
|
|
906
|
+
return [none(), none()]
|
|
907
|
+
}
|
|
908
|
+
const e = f(self.value)
|
|
909
|
+
return either.isLeft(e) ? [some(e.left), none()] : [none(), some(e.right)]
|
|
910
|
+
})
|
|
911
|
+
|
|
912
|
+
/**
|
|
913
|
+
* Maps over the value of an `Option` and filters out `None`s.
|
|
914
|
+
*
|
|
915
|
+
* Useful when in addition to filtering you also want to change the type of the `Option`.
|
|
916
|
+
*
|
|
917
|
+
* @param self - The `Option` to map over.
|
|
918
|
+
* @param f - A function to apply to the value of the `Option`.
|
|
919
|
+
*
|
|
920
|
+
* @example
|
|
921
|
+
* import * as O from "effect/Option"
|
|
922
|
+
*
|
|
923
|
+
* const evenNumber = (n: number) => n % 2 === 0 ? O.some(n) : O.none()
|
|
924
|
+
*
|
|
925
|
+
* assert.deepStrictEqual(O.filterMap(O.none(), evenNumber), O.none())
|
|
926
|
+
* assert.deepStrictEqual(O.filterMap(O.some(3), evenNumber), O.none())
|
|
927
|
+
* assert.deepStrictEqual(O.filterMap(O.some(2), evenNumber), O.some(2))
|
|
928
|
+
*
|
|
929
|
+
* @category filtering
|
|
930
|
+
* @since 2.0.0
|
|
931
|
+
*/
|
|
932
|
+
export const filterMap: {
|
|
933
|
+
<A, B>(f: (a: A) => Option<B>): (self: Option<A>) => Option<B>
|
|
934
|
+
<A, B>(self: Option<A>, f: (a: A) => Option<B>): Option<B>
|
|
935
|
+
} = dual(
|
|
936
|
+
2,
|
|
937
|
+
<A, B>(self: Option<A>, f: (a: A) => Option<B>): Option<B> => isNone(self) ? none() : f(self.value)
|
|
938
|
+
)
|
|
939
|
+
|
|
940
|
+
/**
|
|
941
|
+
* Filters an `Option` using a predicate. If the predicate is not satisfied or the `Option` is `None` returns `None`.
|
|
942
|
+
*
|
|
943
|
+
* If you need to change the type of the `Option` in addition to filtering, see `filterMap`.
|
|
944
|
+
*
|
|
945
|
+
* @param predicate - A predicate function to apply to the `Option` value.
|
|
946
|
+
* @param fb - The `Option` to filter.
|
|
947
|
+
*
|
|
948
|
+
* @example
|
|
949
|
+
* import * as O from "effect/Option"
|
|
950
|
+
*
|
|
951
|
+
* // predicate
|
|
952
|
+
* const isEven = (n: number) => n % 2 === 0
|
|
953
|
+
*
|
|
954
|
+
* assert.deepStrictEqual(O.filter(O.none(), isEven), O.none())
|
|
955
|
+
* assert.deepStrictEqual(O.filter(O.some(3), isEven), O.none())
|
|
956
|
+
* assert.deepStrictEqual(O.filter(O.some(2), isEven), O.some(2))
|
|
957
|
+
*
|
|
958
|
+
* // refinement
|
|
959
|
+
* const isNumber = (v: unknown): v is number => typeof v === "number"
|
|
960
|
+
*
|
|
961
|
+
* assert.deepStrictEqual(O.filter(O.none(), isNumber), O.none())
|
|
962
|
+
* assert.deepStrictEqual(O.filter(O.some('hello'), isNumber), O.none())
|
|
963
|
+
* assert.deepStrictEqual(O.filter(O.some(2), isNumber), O.some(2))
|
|
964
|
+
*
|
|
965
|
+
* @category filtering
|
|
966
|
+
* @since 2.0.0
|
|
967
|
+
*/
|
|
968
|
+
export const filter: {
|
|
969
|
+
<C extends A, B extends A, A = C>(refinement: (a: A) => a is B): (self: Option<C>) => Option<B>
|
|
970
|
+
<B extends A, A = B>(predicate: (a: A) => boolean): (self: Option<B>) => Option<B>
|
|
971
|
+
<C extends A, B extends A, A = C>(self: Option<C>, refinement: (a: A) => a is B): Option<B>
|
|
972
|
+
<B extends A, A = B>(self: Option<B>, predicate: (a: A) => boolean): Option<B>
|
|
973
|
+
} = dual(
|
|
974
|
+
2,
|
|
975
|
+
<B extends A, A = B>(self: Option<B>, predicate: (a: A) => boolean): Option<B> =>
|
|
976
|
+
filterMap(self, (b) => (predicate(b) ? option.some(b) : option.none))
|
|
977
|
+
)
|
|
978
|
+
|
|
979
|
+
/**
|
|
980
|
+
* @example
|
|
981
|
+
* import { none, some, getEquivalence } from 'effect/Option'
|
|
982
|
+
* import * as N from 'effect/Number'
|
|
983
|
+
*
|
|
984
|
+
* const isEquivalent = getEquivalence(N.Equivalence)
|
|
985
|
+
* assert.deepStrictEqual(isEquivalent(none(), none()), true)
|
|
986
|
+
* assert.deepStrictEqual(isEquivalent(none(), some(1)), false)
|
|
987
|
+
* assert.deepStrictEqual(isEquivalent(some(1), none()), false)
|
|
988
|
+
* assert.deepStrictEqual(isEquivalent(some(1), some(2)), false)
|
|
989
|
+
* assert.deepStrictEqual(isEquivalent(some(1), some(1)), true)
|
|
990
|
+
*
|
|
991
|
+
* @category equivalence
|
|
992
|
+
* @since 2.0.0
|
|
993
|
+
*/
|
|
994
|
+
export const getEquivalence = <A>(isEquivalent: Equivalence.Equivalence<A>): Equivalence.Equivalence<Option<A>> =>
|
|
995
|
+
Equivalence.make((x, y) => x === y || (isNone(x) ? isNone(y) : isNone(y) ? false : isEquivalent(x.value, y.value)))
|
|
996
|
+
|
|
997
|
+
/**
|
|
998
|
+
* The `Order` instance allows `Option` values to be compared with
|
|
999
|
+
* `compare`, whenever there is an `Order` instance for
|
|
1000
|
+
* the type the `Option` contains.
|
|
1001
|
+
*
|
|
1002
|
+
* `None` is considered to be less than any `Some` value.
|
|
1003
|
+
*
|
|
1004
|
+
* @example
|
|
1005
|
+
* import { none, some, getOrder } from 'effect/Option'
|
|
1006
|
+
* import * as N from 'effect/Number'
|
|
1007
|
+
* import { pipe } from "effect/Function"
|
|
1008
|
+
*
|
|
1009
|
+
* const O = getOrder(N.Order)
|
|
1010
|
+
* assert.deepStrictEqual(O(none(), none()), 0)
|
|
1011
|
+
* assert.deepStrictEqual(O(none(), some(1)), -1)
|
|
1012
|
+
* assert.deepStrictEqual(O(some(1), none()), 1)
|
|
1013
|
+
* assert.deepStrictEqual(O(some(1), some(2)), -1)
|
|
1014
|
+
* assert.deepStrictEqual(O(some(1), some(1)), 0)
|
|
1015
|
+
*
|
|
1016
|
+
* @category sorting
|
|
1017
|
+
* @since 2.0.0
|
|
1018
|
+
*/
|
|
1019
|
+
export const getOrder = <A>(O: Order<A>): Order<Option<A>> =>
|
|
1020
|
+
order.make((self, that) => isSome(self) ? (isSome(that) ? O(self.value, that.value) : 1) : -1)
|
|
1021
|
+
|
|
1022
|
+
/**
|
|
1023
|
+
* Lifts a binary function into `Option`.
|
|
1024
|
+
*
|
|
1025
|
+
* @param f - The function to lift.
|
|
1026
|
+
*
|
|
1027
|
+
* @category lifting
|
|
1028
|
+
* @since 2.0.0
|
|
1029
|
+
*/
|
|
1030
|
+
export const lift2 = <A, B, C>(f: (a: A, b: B) => C): {
|
|
1031
|
+
(that: Option<B>): (self: Option<A>) => Option<C>
|
|
1032
|
+
(self: Option<A>, that: Option<B>): Option<C>
|
|
1033
|
+
} => dual(2, (self: Option<A>, that: Option<B>): Option<C> => zipWith(self, that, f))
|
|
1034
|
+
|
|
1035
|
+
/**
|
|
1036
|
+
* Transforms a `Predicate` function into a `Some` of the input value if the predicate returns `true` or `None`
|
|
1037
|
+
* if the predicate returns `false`.
|
|
1038
|
+
*
|
|
1039
|
+
* @param predicate - A `Predicate` function that takes in a value of type `A` and returns a boolean.
|
|
1040
|
+
*
|
|
1041
|
+
* @example
|
|
1042
|
+
* import * as O from "effect/Option"
|
|
1043
|
+
*
|
|
1044
|
+
* const getOption = O.liftPredicate((n: number) => n >= 0)
|
|
1045
|
+
*
|
|
1046
|
+
* assert.deepStrictEqual(getOption(-1), O.none())
|
|
1047
|
+
* assert.deepStrictEqual(getOption(1), O.some(1))
|
|
1048
|
+
*
|
|
1049
|
+
* @category lifting
|
|
1050
|
+
* @since 2.0.0
|
|
1051
|
+
*/
|
|
1052
|
+
export const liftPredicate: {
|
|
1053
|
+
<C extends A, B extends A, A = C>(refinement: Refinement<A, B>): (c: C) => Option<B>
|
|
1054
|
+
<B extends A, A = B>(predicate: Predicate<A>): (b: B) => Option<B>
|
|
1055
|
+
} = <B extends A, A = B>(predicate: Predicate<A>) => (b: B) => predicate(b) ? some(b) : none()
|
|
1056
|
+
|
|
1057
|
+
/**
|
|
1058
|
+
* Returns a function that checks if a `Option` contains a given value using a provided `isEquivalent` function.
|
|
1059
|
+
*
|
|
1060
|
+
* @param equivalent - An `Equivalence` instance to compare values of the `Option`.
|
|
1061
|
+
* @param self - The `Option` to apply the comparison to.
|
|
1062
|
+
* @param a - The value to compare against the `Option`.
|
|
1063
|
+
*
|
|
1064
|
+
* @example
|
|
1065
|
+
* import { some, none, containsWith } from 'effect/Option'
|
|
1066
|
+
* import { Equivalence } from 'effect/Number'
|
|
1067
|
+
* import { pipe } from "effect/Function"
|
|
1068
|
+
*
|
|
1069
|
+
* assert.deepStrictEqual(pipe(some(2), containsWith(Equivalence)(2)), true)
|
|
1070
|
+
* assert.deepStrictEqual(pipe(some(1), containsWith(Equivalence)(2)), false)
|
|
1071
|
+
* assert.deepStrictEqual(pipe(none(), containsWith(Equivalence)(2)), false)
|
|
1072
|
+
*
|
|
1073
|
+
* @category elements
|
|
1074
|
+
* @since 2.0.0
|
|
1075
|
+
*/
|
|
1076
|
+
export const containsWith = <A>(isEquivalent: (self: A, that: A) => boolean): {
|
|
1077
|
+
(a: A): (self: Option<A>) => boolean
|
|
1078
|
+
(self: Option<A>, a: A): boolean
|
|
1079
|
+
} => dual(2, (self: Option<A>, a: A): boolean => isNone(self) ? false : isEquivalent(self.value, a))
|
|
1080
|
+
|
|
1081
|
+
const _equivalence = Equal.equivalence()
|
|
1082
|
+
|
|
1083
|
+
/**
|
|
1084
|
+
* Returns a function that checks if an `Option` contains a given value using the default `Equivalence`.
|
|
1085
|
+
*
|
|
1086
|
+
* @category elements
|
|
1087
|
+
* @since 2.0.0
|
|
1088
|
+
*/
|
|
1089
|
+
export const contains: {
|
|
1090
|
+
<A>(a: A): (self: Option<A>) => boolean
|
|
1091
|
+
<A>(self: Option<A>, a: A): boolean
|
|
1092
|
+
} = containsWith(_equivalence)
|
|
1093
|
+
|
|
1094
|
+
/**
|
|
1095
|
+
* Check if a value in an `Option` type meets a certain predicate.
|
|
1096
|
+
*
|
|
1097
|
+
* @param self - The `Option` to check.
|
|
1098
|
+
* @param predicate - The condition to check.
|
|
1099
|
+
*
|
|
1100
|
+
* @example
|
|
1101
|
+
* import { some, none, exists } from 'effect/Option'
|
|
1102
|
+
* import { pipe } from "effect/Function"
|
|
1103
|
+
*
|
|
1104
|
+
* const isEven = (n: number) => n % 2 === 0
|
|
1105
|
+
*
|
|
1106
|
+
* assert.deepStrictEqual(pipe(some(2), exists(isEven)), true)
|
|
1107
|
+
* assert.deepStrictEqual(pipe(some(1), exists(isEven)), false)
|
|
1108
|
+
* assert.deepStrictEqual(pipe(none(), exists(isEven)), false)
|
|
1109
|
+
*
|
|
1110
|
+
* @since 2.0.0
|
|
1111
|
+
*/
|
|
1112
|
+
export const exists: {
|
|
1113
|
+
<A>(predicate: Predicate<A>): (self: Option<A>) => boolean
|
|
1114
|
+
<A>(self: Option<A>, predicate: Predicate<A>): boolean
|
|
1115
|
+
} = dual(
|
|
1116
|
+
2,
|
|
1117
|
+
<A>(self: Option<A>, predicate: Predicate<A>): boolean => isNone(self) ? false : predicate(self.value)
|
|
1118
|
+
)
|
|
1119
|
+
|
|
1120
|
+
// -------------------------------------------------------------------------------------
|
|
1121
|
+
// math
|
|
1122
|
+
// -------------------------------------------------------------------------------------
|
|
1123
|
+
|
|
1124
|
+
/**
|
|
1125
|
+
* @category math
|
|
1126
|
+
* @since 2.0.0
|
|
1127
|
+
*/
|
|
1128
|
+
export const sum: {
|
|
1129
|
+
(self: Option<number>, that: Option<number>): Option<number>
|
|
1130
|
+
(that: Option<number>): (self: Option<number>) => Option<number>
|
|
1131
|
+
} = lift2(N.sum)
|
|
1132
|
+
|
|
1133
|
+
/**
|
|
1134
|
+
* @category math
|
|
1135
|
+
* @since 2.0.0
|
|
1136
|
+
*/
|
|
1137
|
+
export const multiply: {
|
|
1138
|
+
(self: Option<number>, that: Option<number>): Option<number>
|
|
1139
|
+
(that: Option<number>): (self: Option<number>) => Option<number>
|
|
1140
|
+
} = lift2(N.multiply)
|
|
1141
|
+
|
|
1142
|
+
/**
|
|
1143
|
+
* @category math
|
|
1144
|
+
* @since 2.0.0
|
|
1145
|
+
*/
|
|
1146
|
+
export const subtract: {
|
|
1147
|
+
(self: Option<number>, that: Option<number>): Option<number>
|
|
1148
|
+
(that: Option<number>): (self: Option<number>) => Option<number>
|
|
1149
|
+
} = lift2(N.subtract)
|
|
1150
|
+
|
|
1151
|
+
/**
|
|
1152
|
+
* @category math
|
|
1153
|
+
* @since 2.0.0
|
|
1154
|
+
*/
|
|
1155
|
+
export const divide: {
|
|
1156
|
+
(self: Option<number>, that: Option<number>): Option<number>
|
|
1157
|
+
(that: Option<number>): (self: Option<number>) => Option<number>
|
|
1158
|
+
} = lift2(N.divide)
|
|
1159
|
+
|
|
1160
|
+
/**
|
|
1161
|
+
* Sum all numbers in an iterable of `Option<number>` ignoring the `None` values.
|
|
1162
|
+
*
|
|
1163
|
+
* @param self - The iterable of `Option<number>` to be summed.
|
|
1164
|
+
*
|
|
1165
|
+
* @example
|
|
1166
|
+
* import { sumCompact, some, none } from 'effect/Option'
|
|
1167
|
+
*
|
|
1168
|
+
* const iterable = [some(2), none(), some(3), none()]
|
|
1169
|
+
* assert.deepStrictEqual(sumCompact(iterable), 5)
|
|
1170
|
+
*
|
|
1171
|
+
* @category math
|
|
1172
|
+
* @since 2.0.0
|
|
1173
|
+
*/
|
|
1174
|
+
export const sumCompact = (self: Iterable<Option<number>>): number => {
|
|
1175
|
+
let out = 0
|
|
1176
|
+
for (const oa of self) {
|
|
1177
|
+
if (isSome(oa)) {
|
|
1178
|
+
out += oa.value
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
return out
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
/**
|
|
1185
|
+
* Multiply all numbers in an iterable of `Option<number>` ignoring the `None` values.
|
|
1186
|
+
*
|
|
1187
|
+
* @param self - The iterable of `Option<number>` to be multiplied.
|
|
1188
|
+
*
|
|
1189
|
+
* @example
|
|
1190
|
+
* import { multiplyCompact, some, none } from 'effect/Option'
|
|
1191
|
+
*
|
|
1192
|
+
* const iterable = [some(2), none(), some(3), none()]
|
|
1193
|
+
* assert.deepStrictEqual(multiplyCompact(iterable), 6)
|
|
1194
|
+
*
|
|
1195
|
+
* @category math
|
|
1196
|
+
* @since 2.0.0
|
|
1197
|
+
*/
|
|
1198
|
+
export const multiplyCompact = (self: Iterable<Option<number>>): number => {
|
|
1199
|
+
let out = 1
|
|
1200
|
+
for (const oa of self) {
|
|
1201
|
+
if (isSome(oa)) {
|
|
1202
|
+
const a: number = oa.value
|
|
1203
|
+
if (a === 0) {
|
|
1204
|
+
return 0
|
|
1205
|
+
}
|
|
1206
|
+
out *= a
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
return out
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
// -------------------------------------------------------------------------------------
|
|
1213
|
+
// do notation
|
|
1214
|
+
// -------------------------------------------------------------------------------------
|
|
1215
|
+
|
|
1216
|
+
/**
|
|
1217
|
+
* @category do notation
|
|
1218
|
+
* @since 2.0.0
|
|
1219
|
+
*/
|
|
1220
|
+
export const bindTo: {
|
|
1221
|
+
<N extends string>(name: N): <A>(self: Option<A>) => Option<{ [K in N]: A }>
|
|
1222
|
+
<A, N extends string>(self: Option<A>, name: N): Option<{ [K in N]: A }>
|
|
1223
|
+
} = dual(
|
|
1224
|
+
2,
|
|
1225
|
+
<A, N extends string>(self: Option<A>, name: N): Option<{ [K in N]: A }> => map(self, (a) => ({ [name]: a } as any))
|
|
1226
|
+
)
|
|
1227
|
+
|
|
1228
|
+
const let_: {
|
|
1229
|
+
<N extends string, A extends object, B>(
|
|
1230
|
+
name: Exclude<N, keyof A>,
|
|
1231
|
+
f: (a: A) => B
|
|
1232
|
+
): (self: Option<A>) => Option<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }>
|
|
1233
|
+
<A extends object, N extends string, B>(
|
|
1234
|
+
self: Option<A>,
|
|
1235
|
+
name: Exclude<N, keyof A>,
|
|
1236
|
+
f: (a: A) => B
|
|
1237
|
+
): Option<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }>
|
|
1238
|
+
} = dual(3, <A extends object, N extends string, B>(
|
|
1239
|
+
self: Option<A>,
|
|
1240
|
+
name: Exclude<N, keyof A>,
|
|
1241
|
+
f: (a: A) => B
|
|
1242
|
+
): Option<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }> =>
|
|
1243
|
+
map(self, (a) => Object.assign({}, a, { [name]: f(a) }) as any))
|
|
1244
|
+
|
|
1245
|
+
export {
|
|
1246
|
+
/**
|
|
1247
|
+
* @category do notation
|
|
1248
|
+
* @since 2.0.0
|
|
1249
|
+
*/
|
|
1250
|
+
let_ as let
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
/**
|
|
1254
|
+
* @category do notation
|
|
1255
|
+
* @since 2.0.0
|
|
1256
|
+
*/
|
|
1257
|
+
export const bind: {
|
|
1258
|
+
<N extends string, A extends object, B>(
|
|
1259
|
+
name: Exclude<N, keyof A>,
|
|
1260
|
+
f: (a: A) => Option<B>
|
|
1261
|
+
): (self: Option<A>) => Option<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }>
|
|
1262
|
+
<A extends object, N extends string, B>(
|
|
1263
|
+
self: Option<A>,
|
|
1264
|
+
name: Exclude<N, keyof A>,
|
|
1265
|
+
f: (a: A) => Option<B>
|
|
1266
|
+
): Option<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }>
|
|
1267
|
+
} = dual(3, <A, N extends string, B>(
|
|
1268
|
+
self: Option<A>,
|
|
1269
|
+
name: Exclude<N, keyof A>,
|
|
1270
|
+
f: (a: A) => Option<B>
|
|
1271
|
+
): Option<{ [K in keyof A | N]: K extends keyof A ? A[K] : B }> =>
|
|
1272
|
+
flatMap(self, (a) => map(f(a), (b) => Object.assign({}, a, { [name]: b }) as any)))
|
|
1273
|
+
|
|
1274
|
+
/**
|
|
1275
|
+
* @category do notation
|
|
1276
|
+
* @since 2.0.0
|
|
1277
|
+
*/
|
|
1278
|
+
export const Do: Option<{}> = some({})
|
|
1279
|
+
|
|
1280
|
+
const adapter = Gen.adapter<OptionTypeLambda>()
|
|
1281
|
+
|
|
1282
|
+
/**
|
|
1283
|
+
* @category generators
|
|
1284
|
+
* @since 2.0.0
|
|
1285
|
+
*/
|
|
1286
|
+
export const gen: Gen.Gen<OptionTypeLambda, Gen.Adapter<OptionTypeLambda>> = (f) => {
|
|
1287
|
+
const iterator = f(adapter)
|
|
1288
|
+
let state: IteratorYieldResult<any> | IteratorReturnResult<any> = iterator.next()
|
|
1289
|
+
if (state.done) {
|
|
1290
|
+
return some(void 0)
|
|
1291
|
+
} else {
|
|
1292
|
+
let current = state.value.value
|
|
1293
|
+
if (isNone(current)) {
|
|
1294
|
+
return current
|
|
1295
|
+
}
|
|
1296
|
+
while (!state.done) {
|
|
1297
|
+
state = iterator.next(current.value)
|
|
1298
|
+
if (!state.done) {
|
|
1299
|
+
current = state.value.value
|
|
1300
|
+
if (isNone(current)) {
|
|
1301
|
+
return current
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
return some(state.value)
|
|
1306
|
+
}
|
|
1307
|
+
}
|