@clayroach/effect 3.19.14-source-capture.6 → 3.19.14-source-capture.8
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/dist/cjs/Utils.js +1 -1
- package/dist/cjs/Utils.js.map +1 -1
- package/dist/cjs/internal/clock.js +1 -1
- package/dist/cjs/internal/clock.js.map +1 -1
- package/dist/esm/Utils.js +1 -1
- package/dist/esm/Utils.js.map +1 -1
- package/dist/esm/internal/clock.js +1 -1
- package/dist/esm/internal/clock.js.map +1 -1
- package/package.json +1 -1
- package/src/Arbitrary.ts +0 -1101
- package/src/Array.ts +0 -3589
- package/src/BigDecimal.ts +0 -1349
- package/src/BigInt.ts +0 -643
- package/src/Boolean.ts +0 -287
- package/src/Brand.ts +0 -360
- package/src/Cache.ts +0 -281
- package/src/Cause.ts +0 -1555
- package/src/Channel.ts +0 -2355
- package/src/ChildExecutorDecision.ts +0 -146
- package/src/Chunk.ts +0 -1495
- package/src/Clock.ts +0 -111
- package/src/Config.ts +0 -542
- package/src/ConfigError.ts +0 -270
- package/src/ConfigProvider.ts +0 -333
- package/src/ConfigProviderPathPatch.ts +0 -100
- package/src/Console.ts +0 -226
- package/src/Context.ts +0 -585
- package/src/Cron.ts +0 -706
- package/src/Data.ts +0 -596
- package/src/DateTime.ts +0 -1686
- package/src/DefaultServices.ts +0 -34
- package/src/Deferred.ts +0 -301
- package/src/Differ.ts +0 -450
- package/src/Duration.ts +0 -1000
- package/src/Effect.ts +0 -14839
- package/src/Effectable.ts +0 -107
- package/src/Either.ts +0 -1040
- package/src/Encoding.ts +0 -195
- package/src/Equal.ts +0 -98
- package/src/Equivalence.ts +0 -235
- package/src/ExecutionPlan.ts +0 -308
- package/src/ExecutionStrategy.ts +0 -119
- package/src/Exit.ts +0 -467
- package/src/FastCheck.ts +0 -9
- package/src/Fiber.ts +0 -744
- package/src/FiberHandle.ts +0 -540
- package/src/FiberId.ts +0 -195
- package/src/FiberMap.ts +0 -656
- package/src/FiberRef.ts +0 -431
- package/src/FiberRefs.ts +0 -204
- package/src/FiberRefsPatch.ts +0 -105
- package/src/FiberSet.ts +0 -491
- package/src/FiberStatus.ts +0 -108
- package/src/Function.ts +0 -1222
- package/src/GlobalValue.ts +0 -53
- package/src/Graph.ts +0 -3732
- package/src/GroupBy.ts +0 -103
- package/src/HKT.ts +0 -45
- package/src/Hash.ts +0 -195
- package/src/HashMap.ts +0 -519
- package/src/HashRing.ts +0 -317
- package/src/HashSet.ts +0 -2346
- package/src/Inspectable.ts +0 -287
- package/src/Iterable.ts +0 -1119
- package/src/JSONSchema.ts +0 -1044
- package/src/KeyedPool.ts +0 -167
- package/src/Layer.ts +0 -1251
- package/src/LayerMap.ts +0 -436
- package/src/List.ts +0 -977
- package/src/LogLevel.ts +0 -285
- package/src/LogSpan.ts +0 -25
- package/src/Logger.ts +0 -702
- package/src/Mailbox.ts +0 -268
- package/src/ManagedRuntime.ts +0 -180
- package/src/Match.ts +0 -1477
- package/src/MergeDecision.ts +0 -95
- package/src/MergeState.ts +0 -172
- package/src/MergeStrategy.ts +0 -107
- package/src/Metric.ts +0 -780
- package/src/MetricBoundaries.ts +0 -69
- package/src/MetricHook.ts +0 -151
- package/src/MetricKey.ts +0 -224
- package/src/MetricKeyType.ts +0 -262
- package/src/MetricLabel.ts +0 -47
- package/src/MetricPair.ts +0 -71
- package/src/MetricPolling.ts +0 -148
- package/src/MetricRegistry.ts +0 -48
- package/src/MetricState.ts +0 -257
- package/src/Micro.ts +0 -4405
- package/src/ModuleVersion.ts +0 -18
- package/src/MutableHashMap.ts +0 -411
- package/src/MutableHashSet.ts +0 -706
- package/src/MutableList.ts +0 -297
- package/src/MutableQueue.ts +0 -227
- package/src/MutableRef.ts +0 -202
- package/src/NonEmptyIterable.ts +0 -32
- package/src/Number.ts +0 -1071
- package/src/Option.ts +0 -2170
- package/src/Order.ts +0 -373
- package/src/Ordering.ts +0 -111
- package/src/ParseResult.ts +0 -2031
- package/src/PartitionedSemaphore.ts +0 -200
- package/src/Pipeable.ts +0 -566
- package/src/Pool.ts +0 -204
- package/src/Predicate.ts +0 -1405
- package/src/Pretty.ts +0 -205
- package/src/PrimaryKey.ts +0 -23
- package/src/PubSub.ts +0 -182
- package/src/Queue.ts +0 -644
- package/src/Random.ts +0 -204
- package/src/RateLimiter.ts +0 -138
- package/src/RcMap.ts +0 -141
- package/src/RcRef.ts +0 -122
- package/src/Readable.ts +0 -93
- package/src/Record.ts +0 -1274
- package/src/RedBlackTree.ts +0 -421
- package/src/Redacted.ts +0 -144
- package/src/Ref.ts +0 -180
- package/src/RegExp.ts +0 -38
- package/src/Reloadable.ts +0 -127
- package/src/Request.ts +0 -347
- package/src/RequestBlock.ts +0 -118
- package/src/RequestResolver.ts +0 -366
- package/src/Resource.ts +0 -119
- package/src/Runtime.ts +0 -383
- package/src/RuntimeFlags.ts +0 -368
- package/src/RuntimeFlagsPatch.ts +0 -183
- package/src/STM.ts +0 -2045
- package/src/Schedule.ts +0 -2219
- package/src/ScheduleDecision.ts +0 -62
- package/src/ScheduleInterval.ts +0 -151
- package/src/ScheduleIntervals.ts +0 -122
- package/src/Scheduler.ts +0 -353
- package/src/Schema.ts +0 -10914
- package/src/SchemaAST.ts +0 -3043
- package/src/Scope.ts +0 -204
- package/src/ScopedCache.ts +0 -151
- package/src/ScopedRef.ts +0 -117
- package/src/Secret.ts +0 -88
- package/src/SingleProducerAsyncInput.ts +0 -67
- package/src/Sink.ts +0 -1461
- package/src/SortedMap.ts +0 -287
- package/src/SortedSet.ts +0 -390
- package/src/Stream.ts +0 -6468
- package/src/StreamEmit.ts +0 -136
- package/src/StreamHaltStrategy.ts +0 -123
- package/src/Streamable.ts +0 -45
- package/src/String.ts +0 -778
- package/src/Struct.ts +0 -243
- package/src/Subscribable.ts +0 -100
- package/src/SubscriptionRef.ts +0 -298
- package/src/Supervisor.ts +0 -240
- package/src/Symbol.ts +0 -29
- package/src/SynchronizedRef.ts +0 -270
- package/src/TArray.ts +0 -495
- package/src/TDeferred.ts +0 -100
- package/src/TMap.ts +0 -515
- package/src/TPriorityQueue.ts +0 -223
- package/src/TPubSub.ts +0 -200
- package/src/TQueue.ts +0 -432
- package/src/TRandom.ts +0 -129
- package/src/TReentrantLock.ts +0 -224
- package/src/TRef.ts +0 -178
- package/src/TSemaphore.ts +0 -129
- package/src/TSet.ts +0 -365
- package/src/TSubscriptionRef.ts +0 -192
- package/src/Take.ts +0 -258
- package/src/TestAnnotation.ts +0 -158
- package/src/TestAnnotationMap.ts +0 -119
- package/src/TestAnnotations.ts +0 -117
- package/src/TestClock.ts +0 -556
- package/src/TestConfig.ts +0 -47
- package/src/TestContext.ts +0 -36
- package/src/TestLive.ts +0 -53
- package/src/TestServices.ts +0 -390
- package/src/TestSized.ts +0 -55
- package/src/Tracer.ts +0 -198
- package/src/Trie.ts +0 -840
- package/src/Tuple.ts +0 -305
- package/src/Types.ts +0 -353
- package/src/Unify.ts +0 -113
- package/src/UpstreamPullRequest.ts +0 -117
- package/src/UpstreamPullStrategy.ts +0 -121
- package/src/Utils.ts +0 -809
- package/src/index.ts +0 -1561
- package/src/internal/array.ts +0 -8
- package/src/internal/blockedRequests.ts +0 -520
- package/src/internal/cache.ts +0 -733
- package/src/internal/cause.ts +0 -1050
- package/src/internal/channel/channelExecutor.ts +0 -1200
- package/src/internal/channel/channelState.ts +0 -134
- package/src/internal/channel/childExecutorDecision.ts +0 -96
- package/src/internal/channel/continuation.ts +0 -200
- package/src/internal/channel/mergeDecision.ts +0 -113
- package/src/internal/channel/mergeState.ts +0 -120
- package/src/internal/channel/mergeStrategy.ts +0 -72
- package/src/internal/channel/singleProducerAsyncInput.ts +0 -259
- package/src/internal/channel/subexecutor.ts +0 -229
- package/src/internal/channel/upstreamPullRequest.ts +0 -84
- package/src/internal/channel/upstreamPullStrategy.ts +0 -87
- package/src/internal/channel.ts +0 -2603
- package/src/internal/clock.ts +0 -95
- package/src/internal/completedRequestMap.ts +0 -9
- package/src/internal/concurrency.ts +0 -54
- package/src/internal/config.ts +0 -716
- package/src/internal/configError.ts +0 -304
- package/src/internal/configProvider/pathPatch.ts +0 -97
- package/src/internal/configProvider.ts +0 -799
- package/src/internal/console.ts +0 -153
- package/src/internal/context.ts +0 -337
- package/src/internal/core-effect.ts +0 -2293
- package/src/internal/core-stream.ts +0 -998
- package/src/internal/core.ts +0 -3273
- package/src/internal/data.ts +0 -36
- package/src/internal/dataSource.ts +0 -327
- package/src/internal/dateTime.ts +0 -1277
- package/src/internal/defaultServices/console.ts +0 -100
- package/src/internal/defaultServices.ts +0 -163
- package/src/internal/deferred.ts +0 -46
- package/src/internal/differ/chunkPatch.ts +0 -211
- package/src/internal/differ/contextPatch.ts +0 -232
- package/src/internal/differ/hashMapPatch.ts +0 -220
- package/src/internal/differ/hashSetPatch.ts +0 -176
- package/src/internal/differ/orPatch.ts +0 -311
- package/src/internal/differ/readonlyArrayPatch.ts +0 -210
- package/src/internal/differ.ts +0 -200
- package/src/internal/doNotation.ts +0 -80
- package/src/internal/effect/circular.ts +0 -905
- package/src/internal/effectable.ts +0 -131
- package/src/internal/either.ts +0 -110
- package/src/internal/encoding/base64.ts +0 -286
- package/src/internal/encoding/base64Url.ts +0 -29
- package/src/internal/encoding/common.ts +0 -51
- package/src/internal/encoding/hex.ts +0 -315
- package/src/internal/errors.ts +0 -7
- package/src/internal/executionPlan.ts +0 -114
- package/src/internal/executionStrategy.ts +0 -74
- package/src/internal/fiber.ts +0 -388
- package/src/internal/fiberId.ts +0 -267
- package/src/internal/fiberMessage.ts +0 -82
- package/src/internal/fiberRefs/patch.ts +0 -144
- package/src/internal/fiberRefs.ts +0 -297
- package/src/internal/fiberRuntime.ts +0 -3915
- package/src/internal/fiberScope.ts +0 -71
- package/src/internal/fiberStatus.ts +0 -119
- package/src/internal/groupBy.ts +0 -530
- package/src/internal/hashMap/array.ts +0 -49
- package/src/internal/hashMap/bitwise.ts +0 -32
- package/src/internal/hashMap/config.ts +0 -14
- package/src/internal/hashMap/keySet.ts +0 -8
- package/src/internal/hashMap/node.ts +0 -391
- package/src/internal/hashMap.ts +0 -586
- package/src/internal/hashSet.ts +0 -323
- package/src/internal/keyedPool.ts +0 -244
- package/src/internal/layer/circular.ts +0 -228
- package/src/internal/layer.ts +0 -1487
- package/src/internal/logSpan.ts +0 -20
- package/src/internal/logger-circular.ts +0 -24
- package/src/internal/logger.ts +0 -485
- package/src/internal/mailbox.ts +0 -561
- package/src/internal/managedRuntime/circular.ts +0 -6
- package/src/internal/managedRuntime.ts +0 -134
- package/src/internal/matcher.ts +0 -652
- package/src/internal/metric/boundaries.ts +0 -75
- package/src/internal/metric/hook.ts +0 -483
- package/src/internal/metric/key.ts +0 -167
- package/src/internal/metric/keyType.ts +0 -238
- package/src/internal/metric/label.ts +0 -41
- package/src/internal/metric/pair.ts +0 -48
- package/src/internal/metric/polling.ts +0 -149
- package/src/internal/metric/registry.ts +0 -187
- package/src/internal/metric/state.ts +0 -290
- package/src/internal/metric.ts +0 -577
- package/src/internal/opCodes/cause.ts +0 -35
- package/src/internal/opCodes/channel.ts +0 -83
- package/src/internal/opCodes/channelChildExecutorDecision.ts +0 -17
- package/src/internal/opCodes/channelMergeDecision.ts +0 -11
- package/src/internal/opCodes/channelMergeState.ts +0 -17
- package/src/internal/opCodes/channelMergeStrategy.ts +0 -11
- package/src/internal/opCodes/channelState.ts +0 -23
- package/src/internal/opCodes/channelUpstreamPullRequest.ts +0 -11
- package/src/internal/opCodes/channelUpstreamPullStrategy.ts +0 -11
- package/src/internal/opCodes/config.ts +0 -65
- package/src/internal/opCodes/configError.ts +0 -35
- package/src/internal/opCodes/continuation.ts +0 -11
- package/src/internal/opCodes/deferred.ts +0 -11
- package/src/internal/opCodes/effect.ts +0 -89
- package/src/internal/opCodes/layer.ts +0 -59
- package/src/internal/opCodes/streamHaltStrategy.ts +0 -23
- package/src/internal/option.ts +0 -80
- package/src/internal/pool.ts +0 -432
- package/src/internal/pubsub.ts +0 -1762
- package/src/internal/query.ts +0 -204
- package/src/internal/queue.ts +0 -766
- package/src/internal/random.ts +0 -161
- package/src/internal/rateLimiter.ts +0 -93
- package/src/internal/rcMap.ts +0 -285
- package/src/internal/rcRef.ts +0 -192
- package/src/internal/redBlackTree/iterator.ts +0 -200
- package/src/internal/redBlackTree/node.ts +0 -68
- package/src/internal/redBlackTree.ts +0 -1245
- package/src/internal/redacted.ts +0 -73
- package/src/internal/ref.ts +0 -171
- package/src/internal/reloadable.ts +0 -140
- package/src/internal/request.ts +0 -177
- package/src/internal/resource.ts +0 -76
- package/src/internal/ringBuffer.ts +0 -68
- package/src/internal/runtime.ts +0 -558
- package/src/internal/runtimeFlags.ts +0 -188
- package/src/internal/runtimeFlagsPatch.ts +0 -103
- package/src/internal/schedule/decision.ts +0 -47
- package/src/internal/schedule/interval.ts +0 -101
- package/src/internal/schedule/intervals.ts +0 -180
- package/src/internal/schedule.ts +0 -2199
- package/src/internal/schema/errors.ts +0 -191
- package/src/internal/schema/schemaId.ts +0 -106
- package/src/internal/schema/util.ts +0 -50
- package/src/internal/scopedCache.ts +0 -644
- package/src/internal/scopedRef.ts +0 -118
- package/src/internal/secret.ts +0 -89
- package/src/internal/singleShotGen.ts +0 -35
- package/src/internal/sink.ts +0 -2120
- package/src/internal/stack.ts +0 -10
- package/src/internal/stm/core.ts +0 -817
- package/src/internal/stm/entry.ts +0 -59
- package/src/internal/stm/journal.ts +0 -123
- package/src/internal/stm/opCodes/stm.ts +0 -71
- package/src/internal/stm/opCodes/stmState.ts +0 -17
- package/src/internal/stm/opCodes/strategy.ts +0 -17
- package/src/internal/stm/opCodes/tExit.ts +0 -29
- package/src/internal/stm/opCodes/tryCommit.ts +0 -11
- package/src/internal/stm/stm.ts +0 -1453
- package/src/internal/stm/stmState.ts +0 -136
- package/src/internal/stm/tArray.ts +0 -550
- package/src/internal/stm/tDeferred.ts +0 -81
- package/src/internal/stm/tExit.ts +0 -190
- package/src/internal/stm/tMap.ts +0 -824
- package/src/internal/stm/tPriorityQueue.ts +0 -267
- package/src/internal/stm/tPubSub.ts +0 -551
- package/src/internal/stm/tQueue.ts +0 -393
- package/src/internal/stm/tRandom.ts +0 -140
- package/src/internal/stm/tReentrantLock.ts +0 -352
- package/src/internal/stm/tRef.ts +0 -195
- package/src/internal/stm/tSemaphore.ts +0 -113
- package/src/internal/stm/tSet.ts +0 -259
- package/src/internal/stm/tSubscriptionRef.ts +0 -286
- package/src/internal/stm/tryCommit.ts +0 -34
- package/src/internal/stm/txnId.ts +0 -14
- package/src/internal/stm/versioned.ts +0 -4
- package/src/internal/stream/debounceState.ts +0 -57
- package/src/internal/stream/emit.ts +0 -123
- package/src/internal/stream/haltStrategy.ts +0 -94
- package/src/internal/stream/handoff.ts +0 -187
- package/src/internal/stream/handoffSignal.ts +0 -59
- package/src/internal/stream/pull.ts +0 -34
- package/src/internal/stream/sinkEndReason.ts +0 -30
- package/src/internal/stream/zipAllState.ts +0 -88
- package/src/internal/stream/zipChunksState.ts +0 -56
- package/src/internal/stream.ts +0 -8801
- package/src/internal/string-utils.ts +0 -107
- package/src/internal/subscriptionRef.ts +0 -138
- package/src/internal/supervisor/patch.ts +0 -190
- package/src/internal/supervisor.ts +0 -303
- package/src/internal/synchronizedRef.ts +0 -114
- package/src/internal/take.ts +0 -199
- package/src/internal/testing/sleep.ts +0 -27
- package/src/internal/testing/suspendedWarningData.ts +0 -85
- package/src/internal/testing/warningData.ts +0 -94
- package/src/internal/tracer.ts +0 -293
- package/src/internal/trie.ts +0 -722
- package/src/internal/version.ts +0 -7
package/src/FiberMap.ts
DELETED
|
@@ -1,656 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @since 2.0.0
|
|
3
|
-
*/
|
|
4
|
-
import type { NoSuchElementException } from "./Cause.js"
|
|
5
|
-
import * as Cause from "./Cause.js"
|
|
6
|
-
import * as Deferred from "./Deferred.js"
|
|
7
|
-
import * as Effect from "./Effect.js"
|
|
8
|
-
import * as Exit from "./Exit.js"
|
|
9
|
-
import * as Fiber from "./Fiber.js"
|
|
10
|
-
import * as FiberId from "./FiberId.js"
|
|
11
|
-
import { constFalse, constVoid, dual } from "./Function.js"
|
|
12
|
-
import * as HashSet from "./HashSet.js"
|
|
13
|
-
import * as Inspectable from "./Inspectable.js"
|
|
14
|
-
import * as Iterable from "./Iterable.js"
|
|
15
|
-
import * as MutableHashMap from "./MutableHashMap.js"
|
|
16
|
-
import * as Option from "./Option.js"
|
|
17
|
-
import { type Pipeable, pipeArguments } from "./Pipeable.js"
|
|
18
|
-
import * as Predicate from "./Predicate.js"
|
|
19
|
-
import * as Runtime from "./Runtime.js"
|
|
20
|
-
import type * as Scope from "./Scope.js"
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @since 2.0.0
|
|
24
|
-
* @categories type ids
|
|
25
|
-
*/
|
|
26
|
-
export const TypeId: unique symbol = Symbol.for("effect/FiberMap")
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @since 2.0.0
|
|
30
|
-
* @categories type ids
|
|
31
|
-
*/
|
|
32
|
-
export type TypeId = typeof TypeId
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @since 2.0.0
|
|
36
|
-
* @categories models
|
|
37
|
-
*/
|
|
38
|
-
export interface FiberMap<in out K, out A = unknown, out E = unknown>
|
|
39
|
-
extends Pipeable, Inspectable.Inspectable, Iterable<[K, Fiber.RuntimeFiber<A, E>]>
|
|
40
|
-
{
|
|
41
|
-
readonly [TypeId]: TypeId
|
|
42
|
-
readonly deferred: Deferred.Deferred<void, unknown>
|
|
43
|
-
/** @internal */
|
|
44
|
-
state: {
|
|
45
|
-
readonly _tag: "Open"
|
|
46
|
-
readonly backing: MutableHashMap.MutableHashMap<K, Fiber.RuntimeFiber<A, E>>
|
|
47
|
-
} | {
|
|
48
|
-
readonly _tag: "Closed"
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* @since 2.0.0
|
|
54
|
-
* @categories refinements
|
|
55
|
-
*/
|
|
56
|
-
export const isFiberMap = (u: unknown): u is FiberMap<unknown> => Predicate.hasProperty(u, TypeId)
|
|
57
|
-
|
|
58
|
-
const Proto = {
|
|
59
|
-
[TypeId]: TypeId,
|
|
60
|
-
[Symbol.iterator](this: FiberMap<unknown>) {
|
|
61
|
-
if (this.state._tag === "Closed") {
|
|
62
|
-
return Iterable.empty()
|
|
63
|
-
}
|
|
64
|
-
return this.state.backing[Symbol.iterator]()
|
|
65
|
-
},
|
|
66
|
-
toString(this: FiberMap<unknown>) {
|
|
67
|
-
return Inspectable.format(this.toJSON())
|
|
68
|
-
},
|
|
69
|
-
toJSON(this: FiberMap<unknown>) {
|
|
70
|
-
return {
|
|
71
|
-
_id: "FiberMap",
|
|
72
|
-
state: this.state
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
[Inspectable.NodeInspectSymbol](this: FiberMap<unknown>) {
|
|
76
|
-
return this.toJSON()
|
|
77
|
-
},
|
|
78
|
-
pipe() {
|
|
79
|
-
return pipeArguments(this, arguments)
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const unsafeMake = <K, A = unknown, E = unknown>(
|
|
84
|
-
backing: MutableHashMap.MutableHashMap<K, Fiber.RuntimeFiber<A, E>>,
|
|
85
|
-
deferred: Deferred.Deferred<void, E>
|
|
86
|
-
): FiberMap<K, A, E> => {
|
|
87
|
-
const self = Object.create(Proto)
|
|
88
|
-
self.state = { _tag: "Open", backing }
|
|
89
|
-
self.deferred = deferred
|
|
90
|
-
return self
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* A FiberMap can be used to store a collection of fibers, indexed by some key.
|
|
95
|
-
* When the associated Scope is closed, all fibers in the map will be interrupted.
|
|
96
|
-
*
|
|
97
|
-
* You can add fibers to the map using `FiberMap.set` or `FiberMap.run`, and the fibers will
|
|
98
|
-
* be automatically removed from the FiberMap when they complete.
|
|
99
|
-
*
|
|
100
|
-
* @example
|
|
101
|
-
* ```ts
|
|
102
|
-
* import { Effect, FiberMap } from "effect"
|
|
103
|
-
*
|
|
104
|
-
* Effect.gen(function*() {
|
|
105
|
-
* const map = yield* FiberMap.make<string>()
|
|
106
|
-
*
|
|
107
|
-
* // run some effects and add the fibers to the map
|
|
108
|
-
* yield* FiberMap.run(map, "fiber a", Effect.never)
|
|
109
|
-
* yield* FiberMap.run(map, "fiber b", Effect.never)
|
|
110
|
-
*
|
|
111
|
-
* yield* Effect.sleep(1000)
|
|
112
|
-
* }).pipe(
|
|
113
|
-
* Effect.scoped // The fibers will be interrupted when the scope is closed
|
|
114
|
-
* )
|
|
115
|
-
* ```
|
|
116
|
-
*
|
|
117
|
-
* @since 2.0.0
|
|
118
|
-
* @categories constructors
|
|
119
|
-
*/
|
|
120
|
-
export const make = <K, A = unknown, E = unknown>(): Effect.Effect<FiberMap<K, A, E>, never, Scope.Scope> =>
|
|
121
|
-
Effect.acquireRelease(
|
|
122
|
-
Effect.map(Deferred.make<void, E>(), (deferred) =>
|
|
123
|
-
unsafeMake<K, A, E>(
|
|
124
|
-
MutableHashMap.empty(),
|
|
125
|
-
deferred
|
|
126
|
-
)),
|
|
127
|
-
(map) =>
|
|
128
|
-
Effect.withFiberRuntime((parent) => {
|
|
129
|
-
const state = map.state
|
|
130
|
-
if (state._tag === "Closed") return Effect.void
|
|
131
|
-
map.state = { _tag: "Closed" }
|
|
132
|
-
return Fiber.interruptAllAs(
|
|
133
|
-
Iterable.map(state.backing, ([, fiber]) => fiber),
|
|
134
|
-
FiberId.combine(parent.id(), internalFiberId)
|
|
135
|
-
).pipe(
|
|
136
|
-
Effect.intoDeferred(map.deferred)
|
|
137
|
-
)
|
|
138
|
-
})
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Create an Effect run function that is backed by a FiberMap.
|
|
143
|
-
*
|
|
144
|
-
* @since 2.0.0
|
|
145
|
-
* @categories constructors
|
|
146
|
-
*/
|
|
147
|
-
export const makeRuntime = <R, K, E = unknown, A = unknown>(): Effect.Effect<
|
|
148
|
-
<XE extends E, XA extends A>(
|
|
149
|
-
key: K,
|
|
150
|
-
effect: Effect.Effect<XA, XE, R>,
|
|
151
|
-
options?:
|
|
152
|
-
| Runtime.RunForkOptions & {
|
|
153
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
154
|
-
}
|
|
155
|
-
| undefined
|
|
156
|
-
) => Fiber.RuntimeFiber<XA, XE>,
|
|
157
|
-
never,
|
|
158
|
-
Scope.Scope | R
|
|
159
|
-
> =>
|
|
160
|
-
Effect.flatMap(
|
|
161
|
-
make<K, A, E>(),
|
|
162
|
-
(self) => runtime(self)<R>()
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Create an Effect run function that is backed by a FiberMap.
|
|
167
|
-
*
|
|
168
|
-
* @since 3.13.0
|
|
169
|
-
* @categories constructors
|
|
170
|
-
*/
|
|
171
|
-
export const makeRuntimePromise = <R, K, A = unknown, E = unknown>(): Effect.Effect<
|
|
172
|
-
<XE extends E, XA extends A>(
|
|
173
|
-
key: K,
|
|
174
|
-
effect: Effect.Effect<XA, XE, R>,
|
|
175
|
-
options?:
|
|
176
|
-
| Runtime.RunForkOptions & {
|
|
177
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
178
|
-
}
|
|
179
|
-
| undefined
|
|
180
|
-
) => Promise<XA>,
|
|
181
|
-
never,
|
|
182
|
-
Scope.Scope | R
|
|
183
|
-
> =>
|
|
184
|
-
Effect.flatMap(
|
|
185
|
-
make<K, A, E>(),
|
|
186
|
-
(self) => runtimePromise(self)<R>()
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
const internalFiberIdId = -1
|
|
190
|
-
const internalFiberId = FiberId.make(internalFiberIdId, 0)
|
|
191
|
-
const isInternalInterruption = Cause.reduceWithContext(undefined, {
|
|
192
|
-
emptyCase: constFalse,
|
|
193
|
-
failCase: constFalse,
|
|
194
|
-
dieCase: constFalse,
|
|
195
|
-
interruptCase: (_, fiberId) => HashSet.has(FiberId.ids(fiberId), internalFiberIdId),
|
|
196
|
-
sequentialCase: (_, left, right) => left || right,
|
|
197
|
-
parallelCase: (_, left, right) => left || right
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Add a fiber to the FiberMap. When the fiber completes, it will be removed from the FiberMap.
|
|
202
|
-
* If the key already exists in the FiberMap, the previous fiber will be interrupted.
|
|
203
|
-
*
|
|
204
|
-
* @since 2.0.0
|
|
205
|
-
* @categories combinators
|
|
206
|
-
*/
|
|
207
|
-
export const unsafeSet: {
|
|
208
|
-
<K, A, E, XE extends E, XA extends A>(
|
|
209
|
-
key: K,
|
|
210
|
-
fiber: Fiber.RuntimeFiber<XA, XE>,
|
|
211
|
-
options?: {
|
|
212
|
-
readonly interruptAs?: FiberId.FiberId | undefined
|
|
213
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
214
|
-
readonly propagateInterruption?: boolean | undefined
|
|
215
|
-
} | undefined
|
|
216
|
-
): (self: FiberMap<K, A, E>) => void
|
|
217
|
-
<K, A, E, XE extends E, XA extends A>(
|
|
218
|
-
self: FiberMap<K, A, E>,
|
|
219
|
-
key: K,
|
|
220
|
-
fiber: Fiber.RuntimeFiber<XA, XE>,
|
|
221
|
-
options?: {
|
|
222
|
-
readonly interruptAs?: FiberId.FiberId | undefined
|
|
223
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
224
|
-
readonly propagateInterruption?: boolean | undefined
|
|
225
|
-
} | undefined
|
|
226
|
-
): void
|
|
227
|
-
} = dual((args) => isFiberMap(args[0]), <K, A, E, XE extends E, XA extends A>(
|
|
228
|
-
self: FiberMap<K, A, E>,
|
|
229
|
-
key: K,
|
|
230
|
-
fiber: Fiber.RuntimeFiber<XA, XE>,
|
|
231
|
-
options?: {
|
|
232
|
-
readonly interruptAs?: FiberId.FiberId | undefined
|
|
233
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
234
|
-
readonly propagateInterruption?: boolean | undefined
|
|
235
|
-
} | undefined
|
|
236
|
-
): void => {
|
|
237
|
-
if (self.state._tag === "Closed") {
|
|
238
|
-
fiber.unsafeInterruptAsFork(FiberId.combine(options?.interruptAs ?? FiberId.none, internalFiberId))
|
|
239
|
-
return
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
const previous = MutableHashMap.get(self.state.backing, key)
|
|
243
|
-
if (previous._tag === "Some") {
|
|
244
|
-
if (options?.onlyIfMissing === true) {
|
|
245
|
-
fiber.unsafeInterruptAsFork(FiberId.combine(options?.interruptAs ?? FiberId.none, internalFiberId))
|
|
246
|
-
return
|
|
247
|
-
} else if (previous.value === fiber) {
|
|
248
|
-
return
|
|
249
|
-
}
|
|
250
|
-
previous.value.unsafeInterruptAsFork(FiberId.combine(options?.interruptAs ?? FiberId.none, internalFiberId))
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
MutableHashMap.set(self.state.backing, key, fiber)
|
|
254
|
-
fiber.addObserver((exit) => {
|
|
255
|
-
if (self.state._tag === "Closed") {
|
|
256
|
-
return
|
|
257
|
-
}
|
|
258
|
-
const current = MutableHashMap.get(self.state.backing, key)
|
|
259
|
-
if (Option.isSome(current) && fiber === current.value) {
|
|
260
|
-
MutableHashMap.remove(self.state.backing, key)
|
|
261
|
-
}
|
|
262
|
-
if (
|
|
263
|
-
Exit.isFailure(exit) &&
|
|
264
|
-
(
|
|
265
|
-
options?.propagateInterruption === true ?
|
|
266
|
-
!isInternalInterruption(exit.cause) :
|
|
267
|
-
!Cause.isInterruptedOnly(exit.cause)
|
|
268
|
-
)
|
|
269
|
-
) {
|
|
270
|
-
Deferred.unsafeDone(self.deferred, exit as any)
|
|
271
|
-
}
|
|
272
|
-
})
|
|
273
|
-
})
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Add a fiber to the FiberMap. When the fiber completes, it will be removed from the FiberMap.
|
|
277
|
-
* If the key already exists in the FiberMap, the previous fiber will be interrupted.
|
|
278
|
-
*
|
|
279
|
-
* @since 2.0.0
|
|
280
|
-
* @categories combinators
|
|
281
|
-
*/
|
|
282
|
-
export const set: {
|
|
283
|
-
<K, A, E, XE extends E, XA extends A>(
|
|
284
|
-
key: K,
|
|
285
|
-
fiber: Fiber.RuntimeFiber<XA, XE>,
|
|
286
|
-
options?: {
|
|
287
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
288
|
-
readonly propagateInterruption?: boolean | undefined
|
|
289
|
-
} | undefined
|
|
290
|
-
): (self: FiberMap<K, A, E>) => Effect.Effect<void>
|
|
291
|
-
<K, A, E, XE extends E, XA extends A>(
|
|
292
|
-
self: FiberMap<K, A, E>,
|
|
293
|
-
key: K,
|
|
294
|
-
fiber: Fiber.RuntimeFiber<XA, XE>,
|
|
295
|
-
options?: {
|
|
296
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
297
|
-
readonly propagateInterruption?: boolean | undefined
|
|
298
|
-
} | undefined
|
|
299
|
-
): Effect.Effect<void>
|
|
300
|
-
} = dual((args) => isFiberMap(args[0]), <K, A, E, XE extends E, XA extends A>(
|
|
301
|
-
self: FiberMap<K, A, E>,
|
|
302
|
-
key: K,
|
|
303
|
-
fiber: Fiber.RuntimeFiber<XA, XE>,
|
|
304
|
-
options?: {
|
|
305
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
306
|
-
readonly propagateInterruption?: boolean | undefined
|
|
307
|
-
} | undefined
|
|
308
|
-
): Effect.Effect<void> =>
|
|
309
|
-
Effect.fiberIdWith(
|
|
310
|
-
(fiberId) =>
|
|
311
|
-
Effect.sync(() =>
|
|
312
|
-
unsafeSet(self, key, fiber, {
|
|
313
|
-
...options,
|
|
314
|
-
interruptAs: fiberId
|
|
315
|
-
})
|
|
316
|
-
)
|
|
317
|
-
))
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* Retrieve a fiber from the FiberMap.
|
|
321
|
-
*
|
|
322
|
-
* @since 2.0.0
|
|
323
|
-
* @categories combinators
|
|
324
|
-
*/
|
|
325
|
-
export const unsafeGet: {
|
|
326
|
-
<K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Option.Option<Fiber.RuntimeFiber<A, E>>
|
|
327
|
-
<K, A, E>(self: FiberMap<K, A, E>, key: K): Option.Option<Fiber.RuntimeFiber<A, E>>
|
|
328
|
-
} = dual<
|
|
329
|
-
<K>(
|
|
330
|
-
key: K
|
|
331
|
-
) => <A, E>(self: FiberMap<K, A, E>) => Option.Option<Fiber.RuntimeFiber<A, E>>,
|
|
332
|
-
<K, A, E>(
|
|
333
|
-
self: FiberMap<K, A, E>,
|
|
334
|
-
key: K
|
|
335
|
-
) => Option.Option<Fiber.RuntimeFiber<A, E>>
|
|
336
|
-
>(2, (self, key) => self.state._tag === "Closed" ? Option.none() : MutableHashMap.get(self.state.backing, key))
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Retrieve a fiber from the FiberMap.
|
|
340
|
-
*
|
|
341
|
-
* @since 2.0.0
|
|
342
|
-
* @categories combinators
|
|
343
|
-
*/
|
|
344
|
-
export const get: {
|
|
345
|
-
<K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>
|
|
346
|
-
<K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>
|
|
347
|
-
} = dual<
|
|
348
|
-
<K>(
|
|
349
|
-
key: K
|
|
350
|
-
) => <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>,
|
|
351
|
-
<K, A, E>(
|
|
352
|
-
self: FiberMap<K, A, E>,
|
|
353
|
-
key: K
|
|
354
|
-
) => Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>
|
|
355
|
-
>(2, (self, key) => Effect.suspend(() => unsafeGet(self, key)))
|
|
356
|
-
|
|
357
|
-
/**
|
|
358
|
-
* Check if a key exists in the FiberMap.
|
|
359
|
-
*
|
|
360
|
-
* @since 2.0.0
|
|
361
|
-
* @categories combinators
|
|
362
|
-
*/
|
|
363
|
-
export const unsafeHas: {
|
|
364
|
-
<K>(key: K): <A, E>(self: FiberMap<K, A, E>) => boolean
|
|
365
|
-
<K, A, E>(self: FiberMap<K, A, E>, key: K): boolean
|
|
366
|
-
} = dual(
|
|
367
|
-
2,
|
|
368
|
-
<K, A, E>(self: FiberMap<K, A, E>, key: K): boolean =>
|
|
369
|
-
self.state._tag === "Closed" ? false : MutableHashMap.has(self.state.backing, key)
|
|
370
|
-
)
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Check if a key exists in the FiberMap.
|
|
374
|
-
*
|
|
375
|
-
* @since 2.0.0
|
|
376
|
-
* @categories combinators
|
|
377
|
-
*/
|
|
378
|
-
export const has: {
|
|
379
|
-
<K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<boolean>
|
|
380
|
-
<K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<boolean>
|
|
381
|
-
} = dual(
|
|
382
|
-
2,
|
|
383
|
-
<K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<boolean> => Effect.sync(() => unsafeHas(self, key))
|
|
384
|
-
)
|
|
385
|
-
|
|
386
|
-
/**
|
|
387
|
-
* Remove a fiber from the FiberMap, interrupting it if it exists.
|
|
388
|
-
*
|
|
389
|
-
* @since 2.0.0
|
|
390
|
-
* @categories combinators
|
|
391
|
-
*/
|
|
392
|
-
export const remove: {
|
|
393
|
-
<K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<void>
|
|
394
|
-
<K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<void>
|
|
395
|
-
} = dual<
|
|
396
|
-
<K>(
|
|
397
|
-
key: K
|
|
398
|
-
) => <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<void>,
|
|
399
|
-
<K, A, E>(
|
|
400
|
-
self: FiberMap<K, A, E>,
|
|
401
|
-
key: K
|
|
402
|
-
) => Effect.Effect<void>
|
|
403
|
-
>(2, (self, key) =>
|
|
404
|
-
Effect.withFiberRuntime((removeFiber) => {
|
|
405
|
-
if (self.state._tag === "Closed") {
|
|
406
|
-
return Effect.void
|
|
407
|
-
}
|
|
408
|
-
const fiber = MutableHashMap.get(self.state.backing, key)
|
|
409
|
-
if (fiber._tag === "None") {
|
|
410
|
-
return Effect.void
|
|
411
|
-
}
|
|
412
|
-
// will be removed by the observer
|
|
413
|
-
return Fiber.interruptAs(fiber.value, FiberId.combine(removeFiber.id(), internalFiberId))
|
|
414
|
-
}))
|
|
415
|
-
|
|
416
|
-
/**
|
|
417
|
-
* @since 2.0.0
|
|
418
|
-
* @categories combinators
|
|
419
|
-
*/
|
|
420
|
-
export const clear = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<void> =>
|
|
421
|
-
Effect.withFiberRuntime((clearFiber) => {
|
|
422
|
-
if (self.state._tag === "Closed") {
|
|
423
|
-
return Effect.void
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
return Effect.forEach(self.state.backing, ([, fiber]) =>
|
|
427
|
-
// will be removed by the observer
|
|
428
|
-
Fiber.interruptAs(fiber, FiberId.combine(clearFiber.id(), internalFiberId)))
|
|
429
|
-
})
|
|
430
|
-
|
|
431
|
-
const constInterruptedFiber = (function() {
|
|
432
|
-
let fiber: Fiber.RuntimeFiber<never, never> | undefined = undefined
|
|
433
|
-
return () => {
|
|
434
|
-
if (fiber === undefined) {
|
|
435
|
-
fiber = Effect.runFork(Effect.interrupt)
|
|
436
|
-
}
|
|
437
|
-
return fiber
|
|
438
|
-
}
|
|
439
|
-
})()
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* Run an Effect and add the forked fiber to the FiberMap.
|
|
443
|
-
* When the fiber completes, it will be removed from the FiberMap.
|
|
444
|
-
*
|
|
445
|
-
* @since 2.0.0
|
|
446
|
-
* @categories combinators
|
|
447
|
-
*/
|
|
448
|
-
export const run: {
|
|
449
|
-
<K, A, E>(
|
|
450
|
-
self: FiberMap<K, A, E>,
|
|
451
|
-
key: K,
|
|
452
|
-
options?: {
|
|
453
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
454
|
-
readonly propagateInterruption?: boolean | undefined
|
|
455
|
-
} | undefined
|
|
456
|
-
): <R, XE extends E, XA extends A>(
|
|
457
|
-
effect: Effect.Effect<XA, XE, R>
|
|
458
|
-
) => Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R>
|
|
459
|
-
<K, A, E, R, XE extends E, XA extends A>(
|
|
460
|
-
self: FiberMap<K, A, E>,
|
|
461
|
-
key: K,
|
|
462
|
-
effect: Effect.Effect<XA, XE, R>,
|
|
463
|
-
options?: {
|
|
464
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
465
|
-
readonly propagateInterruption?: boolean | undefined
|
|
466
|
-
} | undefined
|
|
467
|
-
): Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R>
|
|
468
|
-
} = function() {
|
|
469
|
-
const self = arguments[0]
|
|
470
|
-
if (Effect.isEffect(arguments[2])) {
|
|
471
|
-
return runImpl(self, arguments[1], arguments[2], arguments[3]) as any
|
|
472
|
-
}
|
|
473
|
-
const key = arguments[1]
|
|
474
|
-
const options = arguments[2]
|
|
475
|
-
return (effect: Effect.Effect<any, any, any>) => runImpl(self, key, effect, options)
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
const runImpl = <K, A, E, R, XE extends E, XA extends A>(
|
|
479
|
-
self: FiberMap<K, A, E>,
|
|
480
|
-
key: K,
|
|
481
|
-
effect: Effect.Effect<XA, XE, R>,
|
|
482
|
-
options?: {
|
|
483
|
-
readonly onlyIfMissing?: boolean
|
|
484
|
-
readonly propagateInterruption?: boolean | undefined
|
|
485
|
-
}
|
|
486
|
-
) =>
|
|
487
|
-
Effect.withFiberRuntime((parent) => {
|
|
488
|
-
if (self.state._tag === "Closed") {
|
|
489
|
-
return Effect.interrupt
|
|
490
|
-
} else if (options?.onlyIfMissing === true && unsafeHas(self, key)) {
|
|
491
|
-
return Effect.sync(constInterruptedFiber)
|
|
492
|
-
}
|
|
493
|
-
const runtime = Runtime.make<R>({
|
|
494
|
-
context: parent.currentContext as any,
|
|
495
|
-
fiberRefs: parent.getFiberRefs(),
|
|
496
|
-
runtimeFlags: Runtime.defaultRuntime.runtimeFlags
|
|
497
|
-
})
|
|
498
|
-
const fiber = Runtime.runFork(runtime)(effect)
|
|
499
|
-
unsafeSet(self, key, fiber, { ...options, interruptAs: parent.id() })
|
|
500
|
-
return Effect.succeed(fiber)
|
|
501
|
-
})
|
|
502
|
-
|
|
503
|
-
/**
|
|
504
|
-
* Capture a Runtime and use it to fork Effect's, adding the forked fibers to the FiberMap.
|
|
505
|
-
*
|
|
506
|
-
* @example
|
|
507
|
-
* ```ts
|
|
508
|
-
* import { Context, Effect, FiberMap } from "effect"
|
|
509
|
-
*
|
|
510
|
-
* interface Users {
|
|
511
|
-
* readonly _: unique symbol
|
|
512
|
-
* }
|
|
513
|
-
* const Users = Context.GenericTag<Users, {
|
|
514
|
-
* getAll: Effect.Effect<Array<unknown>>
|
|
515
|
-
* }>("Users")
|
|
516
|
-
*
|
|
517
|
-
* Effect.gen(function*() {
|
|
518
|
-
* const map = yield* FiberMap.make<string>()
|
|
519
|
-
* const run = yield* FiberMap.runtime(map)<Users>()
|
|
520
|
-
*
|
|
521
|
-
* // run some effects and add the fibers to the map
|
|
522
|
-
* run("effect-a", Effect.andThen(Users, _ => _.getAll))
|
|
523
|
-
* run("effect-b", Effect.andThen(Users, _ => _.getAll))
|
|
524
|
-
* }).pipe(
|
|
525
|
-
* Effect.scoped // The fibers will be interrupted when the scope is closed
|
|
526
|
-
* )
|
|
527
|
-
* ```
|
|
528
|
-
*
|
|
529
|
-
* @since 2.0.0
|
|
530
|
-
* @categories combinators
|
|
531
|
-
*/
|
|
532
|
-
export const runtime: <K, A, E>(
|
|
533
|
-
self: FiberMap<K, A, E>
|
|
534
|
-
) => <R = never>() => Effect.Effect<
|
|
535
|
-
<XE extends E, XA extends A>(
|
|
536
|
-
key: K,
|
|
537
|
-
effect: Effect.Effect<XA, XE, R>,
|
|
538
|
-
options?:
|
|
539
|
-
| Runtime.RunForkOptions & {
|
|
540
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
541
|
-
readonly propagateInterruption?: boolean | undefined
|
|
542
|
-
}
|
|
543
|
-
| undefined
|
|
544
|
-
) => Fiber.RuntimeFiber<XA, XE>,
|
|
545
|
-
never,
|
|
546
|
-
R
|
|
547
|
-
> = <K, A, E>(self: FiberMap<K, A, E>) => <R>() =>
|
|
548
|
-
Effect.map(
|
|
549
|
-
Effect.runtime<R>(),
|
|
550
|
-
(runtime) => {
|
|
551
|
-
const runFork = Runtime.runFork(runtime)
|
|
552
|
-
return <XE extends E, XA extends A>(
|
|
553
|
-
key: K,
|
|
554
|
-
effect: Effect.Effect<XA, XE, R>,
|
|
555
|
-
options?:
|
|
556
|
-
| Runtime.RunForkOptions & {
|
|
557
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
558
|
-
readonly propagateInterruption?: boolean | undefined
|
|
559
|
-
}
|
|
560
|
-
| undefined
|
|
561
|
-
) => {
|
|
562
|
-
if (self.state._tag === "Closed") {
|
|
563
|
-
return constInterruptedFiber()
|
|
564
|
-
} else if (options?.onlyIfMissing === true && unsafeHas(self, key)) {
|
|
565
|
-
return constInterruptedFiber()
|
|
566
|
-
}
|
|
567
|
-
const fiber = runFork(effect, options)
|
|
568
|
-
unsafeSet(self, key, fiber, options)
|
|
569
|
-
return fiber
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
)
|
|
573
|
-
|
|
574
|
-
/**
|
|
575
|
-
* Capture a Runtime and use it to fork Effect's, adding the forked fibers to the FiberMap.
|
|
576
|
-
*
|
|
577
|
-
* @since 3.13.0
|
|
578
|
-
* @categories combinators
|
|
579
|
-
*/
|
|
580
|
-
export const runtimePromise = <K, A, E>(self: FiberMap<K, A, E>): <R = never>() => Effect.Effect<
|
|
581
|
-
<XE extends E, XA extends A>(
|
|
582
|
-
key: K,
|
|
583
|
-
effect: Effect.Effect<XA, XE, R>,
|
|
584
|
-
options?:
|
|
585
|
-
| Runtime.RunForkOptions & {
|
|
586
|
-
readonly onlyIfMissing?: boolean | undefined
|
|
587
|
-
readonly propagateInterruption?: boolean | undefined
|
|
588
|
-
}
|
|
589
|
-
| undefined
|
|
590
|
-
) => Promise<XA>,
|
|
591
|
-
never,
|
|
592
|
-
R
|
|
593
|
-
> =>
|
|
594
|
-
<R>() =>
|
|
595
|
-
Effect.map(
|
|
596
|
-
runtime(self)<R>(),
|
|
597
|
-
(runFork) =>
|
|
598
|
-
<XE extends E, XA extends A>(
|
|
599
|
-
key: K,
|
|
600
|
-
effect: Effect.Effect<XA, XE, R>,
|
|
601
|
-
options?:
|
|
602
|
-
| Runtime.RunForkOptions & { readonly propagateInterruption?: boolean | undefined }
|
|
603
|
-
| undefined
|
|
604
|
-
): Promise<XA> =>
|
|
605
|
-
new Promise((resolve, reject) =>
|
|
606
|
-
runFork(key, effect, options).addObserver((exit) => {
|
|
607
|
-
if (Exit.isSuccess(exit)) {
|
|
608
|
-
resolve(exit.value)
|
|
609
|
-
} else {
|
|
610
|
-
reject(Cause.squash(exit.cause))
|
|
611
|
-
}
|
|
612
|
-
})
|
|
613
|
-
)
|
|
614
|
-
)
|
|
615
|
-
|
|
616
|
-
/**
|
|
617
|
-
* @since 2.0.0
|
|
618
|
-
* @categories combinators
|
|
619
|
-
*/
|
|
620
|
-
export const size = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<number> =>
|
|
621
|
-
Effect.sync(() => self.state._tag === "Closed" ? 0 : MutableHashMap.size(self.state.backing))
|
|
622
|
-
|
|
623
|
-
/**
|
|
624
|
-
* Join all fibers in the FiberMap. If any of the Fiber's in the map terminate with a failure,
|
|
625
|
-
* the returned Effect will terminate with the first failure that occurred.
|
|
626
|
-
*
|
|
627
|
-
* @since 2.0.0
|
|
628
|
-
* @categories combinators
|
|
629
|
-
* @example
|
|
630
|
-
* ```ts
|
|
631
|
-
* import { Effect, FiberMap } from "effect";
|
|
632
|
-
*
|
|
633
|
-
* Effect.gen(function* (_) {
|
|
634
|
-
* const map = yield* _(FiberMap.make());
|
|
635
|
-
* yield* _(FiberMap.set(map, "a", Effect.runFork(Effect.fail("error"))));
|
|
636
|
-
*
|
|
637
|
-
* // parent fiber will fail with "error"
|
|
638
|
-
* yield* _(FiberMap.join(map));
|
|
639
|
-
* });
|
|
640
|
-
* ```
|
|
641
|
-
*/
|
|
642
|
-
export const join = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<void, E> =>
|
|
643
|
-
Deferred.await(self.deferred as Deferred.Deferred<void, E>)
|
|
644
|
-
|
|
645
|
-
/**
|
|
646
|
-
* Wait for the FiberMap to be empty.
|
|
647
|
-
*
|
|
648
|
-
* @since 3.13.0
|
|
649
|
-
* @categories combinators
|
|
650
|
-
*/
|
|
651
|
-
export const awaitEmpty = <K, A, E>(self: FiberMap<K, A, E>): Effect.Effect<void, E> =>
|
|
652
|
-
Effect.whileLoop({
|
|
653
|
-
while: () => self.state._tag === "Open" && MutableHashMap.size(self.state.backing) > 0,
|
|
654
|
-
body: () => Fiber.await(Iterable.unsafeHead(self)[1]),
|
|
655
|
-
step: constVoid
|
|
656
|
-
})
|