@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/internal/cache.ts
DELETED
|
@@ -1,733 +0,0 @@
|
|
|
1
|
-
import type * as Cache from "../Cache.js"
|
|
2
|
-
import type * as Clock from "../Clock.js"
|
|
3
|
-
import * as Context from "../Context.js"
|
|
4
|
-
import * as Deferred from "../Deferred.js"
|
|
5
|
-
import * as Duration from "../Duration.js"
|
|
6
|
-
import type * as Effect from "../Effect.js"
|
|
7
|
-
import * as Either from "../Either.js"
|
|
8
|
-
import * as Equal from "../Equal.js"
|
|
9
|
-
import * as Exit from "../Exit.js"
|
|
10
|
-
import type * as FiberId from "../FiberId.js"
|
|
11
|
-
import { pipe } from "../Function.js"
|
|
12
|
-
import * as Hash from "../Hash.js"
|
|
13
|
-
import * as MutableHashMap from "../MutableHashMap.js"
|
|
14
|
-
import * as MutableQueue from "../MutableQueue.js"
|
|
15
|
-
import * as MutableRef from "../MutableRef.js"
|
|
16
|
-
import * as Option from "../Option.js"
|
|
17
|
-
import { hasProperty } from "../Predicate.js"
|
|
18
|
-
import * as effect from "./core-effect.js"
|
|
19
|
-
import * as core from "./core.js"
|
|
20
|
-
import * as Data from "./data.js"
|
|
21
|
-
import { none } from "./fiberId.js"
|
|
22
|
-
import * as fiberRuntime from "./fiberRuntime.js"
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* A `MapValue` represents a value in the cache. A value may either be
|
|
26
|
-
* `Pending` with a `Promise` that will contain the result of computing the
|
|
27
|
-
* lookup function, when it is available, or `Complete` with an `Exit` value
|
|
28
|
-
* that contains the result of computing the lookup function.
|
|
29
|
-
*
|
|
30
|
-
* @internal
|
|
31
|
-
*/
|
|
32
|
-
export type MapValue<Key, Value, Error> =
|
|
33
|
-
| Complete<Key, Value, Error>
|
|
34
|
-
| Pending<Key, Value, Error>
|
|
35
|
-
| Refreshing<Key, Value, Error>
|
|
36
|
-
|
|
37
|
-
/** @internal */
|
|
38
|
-
export interface Complete<out Key, out Value, out Error> {
|
|
39
|
-
readonly _tag: "Complete"
|
|
40
|
-
readonly key: MapKey<Key>
|
|
41
|
-
readonly exit: Exit.Exit<Value, Error>
|
|
42
|
-
readonly entryStats: Cache.EntryStats
|
|
43
|
-
readonly timeToLiveMillis: number
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** @internal */
|
|
47
|
-
export interface Pending<out Key, in out Value, in out Error> {
|
|
48
|
-
readonly _tag: "Pending"
|
|
49
|
-
readonly key: MapKey<Key>
|
|
50
|
-
readonly deferred: Deferred.Deferred<Value, Error>
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** @internal */
|
|
54
|
-
export interface Refreshing<out Key, in out Value, in out Error> {
|
|
55
|
-
readonly _tag: "Refreshing"
|
|
56
|
-
readonly deferred: Deferred.Deferred<Value, Error>
|
|
57
|
-
readonly complete: Complete<Key, Value, Error>
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** @internal */
|
|
61
|
-
export const complete = <Key, Value, Error>(
|
|
62
|
-
key: MapKey<Key>,
|
|
63
|
-
exit: Exit.Exit<Value, Error>,
|
|
64
|
-
entryStats: Cache.EntryStats,
|
|
65
|
-
timeToLiveMillis: number
|
|
66
|
-
): MapValue<Key, Value, Error> =>
|
|
67
|
-
Data.struct({
|
|
68
|
-
_tag: "Complete" as const,
|
|
69
|
-
key,
|
|
70
|
-
exit,
|
|
71
|
-
entryStats,
|
|
72
|
-
timeToLiveMillis
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
/** @internal */
|
|
76
|
-
export const pending = <Key, Value, Error>(
|
|
77
|
-
key: MapKey<Key>,
|
|
78
|
-
deferred: Deferred.Deferred<Value, Error>
|
|
79
|
-
): MapValue<Key, Value, Error> =>
|
|
80
|
-
Data.struct({
|
|
81
|
-
_tag: "Pending" as const,
|
|
82
|
-
key,
|
|
83
|
-
deferred
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
/** @internal */
|
|
87
|
-
export const refreshing = <Key, Value, Error>(
|
|
88
|
-
deferred: Deferred.Deferred<Value, Error>,
|
|
89
|
-
complete: Complete<Key, Value, Error>
|
|
90
|
-
): MapValue<Key, Value, Error> =>
|
|
91
|
-
Data.struct({
|
|
92
|
-
_tag: "Refreshing" as const,
|
|
93
|
-
deferred,
|
|
94
|
-
complete
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
/** @internal */
|
|
98
|
-
export const MapKeyTypeId = Symbol.for("effect/Cache/MapKey")
|
|
99
|
-
|
|
100
|
-
/** @internal */
|
|
101
|
-
export type MapKeyTypeId = typeof MapKeyTypeId
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* A `MapKey` represents a key in the cache. It contains mutable references
|
|
105
|
-
* to the previous key and next key in the `KeySet` to support an efficient
|
|
106
|
-
* implementation of a sorted set of keys.
|
|
107
|
-
*
|
|
108
|
-
* @internal
|
|
109
|
-
*/
|
|
110
|
-
export interface MapKey<out K> extends Equal.Equal {
|
|
111
|
-
readonly [MapKeyTypeId]: MapKeyTypeId
|
|
112
|
-
readonly current: K
|
|
113
|
-
previous: MapKey<K> | undefined // mutable by design
|
|
114
|
-
next: MapKey<K> | undefined // mutable by design
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
class MapKeyImpl<out K> implements MapKey<K> {
|
|
118
|
-
readonly [MapKeyTypeId]: MapKeyTypeId = MapKeyTypeId
|
|
119
|
-
previous: MapKey<K> | undefined = undefined
|
|
120
|
-
next: MapKey<K> | undefined = undefined
|
|
121
|
-
constructor(readonly current: K) {}
|
|
122
|
-
[Hash.symbol](): number {
|
|
123
|
-
return pipe(
|
|
124
|
-
Hash.hash(this.current),
|
|
125
|
-
Hash.combine(Hash.hash(this.previous)),
|
|
126
|
-
Hash.combine(Hash.hash(this.next)),
|
|
127
|
-
Hash.cached(this)
|
|
128
|
-
)
|
|
129
|
-
}
|
|
130
|
-
[Equal.symbol](that: unknown): boolean {
|
|
131
|
-
if (this === that) {
|
|
132
|
-
return true
|
|
133
|
-
}
|
|
134
|
-
return isMapKey(that) &&
|
|
135
|
-
Equal.equals(this.current, that.current) &&
|
|
136
|
-
Equal.equals(this.previous, that.previous) &&
|
|
137
|
-
Equal.equals(this.next, that.next)
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** @internal */
|
|
142
|
-
export const makeMapKey = <K>(current: K): MapKey<K> => new MapKeyImpl(current)
|
|
143
|
-
|
|
144
|
-
/** @internal */
|
|
145
|
-
export const isMapKey = (u: unknown): u is MapKey<unknown> => hasProperty(u, MapKeyTypeId)
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* A `KeySet` is a sorted set of keys in the cache ordered by last access.
|
|
149
|
-
* For efficiency, the set is implemented in terms of a doubly linked list
|
|
150
|
-
* and is not safe for concurrent access.
|
|
151
|
-
*
|
|
152
|
-
* @internal
|
|
153
|
-
*/
|
|
154
|
-
export interface KeySet<in out K> {
|
|
155
|
-
head: MapKey<K> | undefined // mutable by design
|
|
156
|
-
tail: MapKey<K> | undefined // mutable by design
|
|
157
|
-
/**
|
|
158
|
-
* Adds the specified key to the set.
|
|
159
|
-
*/
|
|
160
|
-
add(key: MapKey<K>): void
|
|
161
|
-
/**
|
|
162
|
-
* Removes the lowest priority key from the set.
|
|
163
|
-
*/
|
|
164
|
-
remove(): MapKey<K> | undefined
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
class KeySetImpl<in out K> implements KeySet<K> {
|
|
168
|
-
head: MapKey<K> | undefined = undefined
|
|
169
|
-
tail: MapKey<K> | undefined = undefined
|
|
170
|
-
add(key: MapKey<K>): void {
|
|
171
|
-
if (key !== this.tail) {
|
|
172
|
-
if (this.tail === undefined) {
|
|
173
|
-
this.head = key
|
|
174
|
-
this.tail = key
|
|
175
|
-
} else {
|
|
176
|
-
const previous = key.previous
|
|
177
|
-
const next = key.next
|
|
178
|
-
if (next !== undefined) {
|
|
179
|
-
key.next = undefined
|
|
180
|
-
if (previous !== undefined) {
|
|
181
|
-
previous.next = next
|
|
182
|
-
next.previous = previous
|
|
183
|
-
} else {
|
|
184
|
-
this.head = next
|
|
185
|
-
this.head.previous = undefined
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
this.tail.next = key
|
|
189
|
-
key.previous = this.tail
|
|
190
|
-
this.tail = key
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
remove(): MapKey<K> | undefined {
|
|
195
|
-
const key = this.head
|
|
196
|
-
if (key !== undefined) {
|
|
197
|
-
const next = key.next
|
|
198
|
-
if (next !== undefined) {
|
|
199
|
-
key.next = undefined
|
|
200
|
-
this.head = next
|
|
201
|
-
this.head.previous = undefined
|
|
202
|
-
} else {
|
|
203
|
-
this.head = undefined
|
|
204
|
-
this.tail = undefined
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return key
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/** @internal */
|
|
212
|
-
export const makeKeySet = <K>(): KeySet<K> => new KeySetImpl<K>()
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* The `CacheState` represents the mutable state underlying the cache.
|
|
216
|
-
*
|
|
217
|
-
* @internal
|
|
218
|
-
*/
|
|
219
|
-
export interface CacheState<in out Key, in out Value, in out Error> {
|
|
220
|
-
map: MutableHashMap.MutableHashMap<Key, MapValue<Key, Value, Error>> // mutable by design
|
|
221
|
-
keys: KeySet<Key> // mutable by design
|
|
222
|
-
accesses: MutableQueue.MutableQueue<MapKey<Key>> // mutable by design
|
|
223
|
-
updating: MutableRef.MutableRef<boolean> // mutable by design
|
|
224
|
-
hits: number // mutable by design
|
|
225
|
-
misses: number // mutable by design
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Constructs a new `CacheState` from the specified values.
|
|
230
|
-
*
|
|
231
|
-
* @internal
|
|
232
|
-
*/
|
|
233
|
-
export const makeCacheState = <Key, Value, Error>(
|
|
234
|
-
map: MutableHashMap.MutableHashMap<Key, MapValue<Key, Value, Error>>,
|
|
235
|
-
keys: KeySet<Key>,
|
|
236
|
-
accesses: MutableQueue.MutableQueue<MapKey<Key>>,
|
|
237
|
-
updating: MutableRef.MutableRef<boolean>,
|
|
238
|
-
hits: number,
|
|
239
|
-
misses: number
|
|
240
|
-
): CacheState<Key, Value, Error> => ({
|
|
241
|
-
map,
|
|
242
|
-
keys,
|
|
243
|
-
accesses,
|
|
244
|
-
updating,
|
|
245
|
-
hits,
|
|
246
|
-
misses
|
|
247
|
-
})
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Constructs an initial cache state.
|
|
251
|
-
*
|
|
252
|
-
* @internal
|
|
253
|
-
*/
|
|
254
|
-
export const initialCacheState = <Key, Value, Error>(): CacheState<Key, Value, Error> =>
|
|
255
|
-
makeCacheState(
|
|
256
|
-
MutableHashMap.empty(),
|
|
257
|
-
makeKeySet(),
|
|
258
|
-
MutableQueue.unbounded(),
|
|
259
|
-
MutableRef.make(false),
|
|
260
|
-
0,
|
|
261
|
-
0
|
|
262
|
-
)
|
|
263
|
-
|
|
264
|
-
/** @internal */
|
|
265
|
-
const CacheSymbolKey = "effect/Cache"
|
|
266
|
-
|
|
267
|
-
/** @internal */
|
|
268
|
-
export const CacheTypeId: Cache.CacheTypeId = Symbol.for(
|
|
269
|
-
CacheSymbolKey
|
|
270
|
-
) as Cache.CacheTypeId
|
|
271
|
-
|
|
272
|
-
const cacheVariance = {
|
|
273
|
-
/* c8 ignore next */
|
|
274
|
-
_Key: (_: any) => _,
|
|
275
|
-
/* c8 ignore next */
|
|
276
|
-
_Error: (_: never) => _,
|
|
277
|
-
/* c8 ignore next */
|
|
278
|
-
_Value: (_: any) => _
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/** @internal */
|
|
282
|
-
const ConsumerCacheSymbolKey = "effect/ConsumerCache"
|
|
283
|
-
|
|
284
|
-
/** @internal */
|
|
285
|
-
export const ConsumerCacheTypeId: Cache.ConsumerCacheTypeId = Symbol.for(
|
|
286
|
-
ConsumerCacheSymbolKey
|
|
287
|
-
) as Cache.ConsumerCacheTypeId
|
|
288
|
-
|
|
289
|
-
const consumerCacheVariance = {
|
|
290
|
-
/* c8 ignore next */
|
|
291
|
-
_Key: (_: any) => _,
|
|
292
|
-
/* c8 ignore next */
|
|
293
|
-
_Error: (_: never) => _,
|
|
294
|
-
/* c8 ignore next */
|
|
295
|
-
_Value: (_: never) => _
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/** @internal */
|
|
299
|
-
export const makeCacheStats = (
|
|
300
|
-
options: {
|
|
301
|
-
readonly hits: number
|
|
302
|
-
readonly misses: number
|
|
303
|
-
readonly size: number
|
|
304
|
-
}
|
|
305
|
-
): Cache.CacheStats => options
|
|
306
|
-
|
|
307
|
-
/** @internal */
|
|
308
|
-
export const makeEntryStats = (loadedMillis: number): Cache.EntryStats => ({
|
|
309
|
-
loadedMillis
|
|
310
|
-
})
|
|
311
|
-
|
|
312
|
-
class CacheImpl<in out Key, in out Value, in out Error> implements Cache.Cache<Key, Value, Error> {
|
|
313
|
-
readonly [CacheTypeId] = cacheVariance
|
|
314
|
-
readonly [ConsumerCacheTypeId] = consumerCacheVariance
|
|
315
|
-
readonly cacheState: CacheState<Key, Value, Error>
|
|
316
|
-
constructor(
|
|
317
|
-
readonly capacity: number,
|
|
318
|
-
readonly context: Context.Context<any>,
|
|
319
|
-
readonly fiberId: FiberId.FiberId,
|
|
320
|
-
readonly lookup: Cache.Lookup<Key, Value, Error, any>,
|
|
321
|
-
readonly timeToLive: (exit: Exit.Exit<Value, Error>) => Duration.DurationInput
|
|
322
|
-
) {
|
|
323
|
-
this.cacheState = initialCacheState()
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
get(key: Key): Effect.Effect<Value, Error> {
|
|
327
|
-
return core.map(this.getEither(key), Either.merge)
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
get cacheStats(): Effect.Effect<Cache.CacheStats> {
|
|
331
|
-
return core.sync(() =>
|
|
332
|
-
makeCacheStats({
|
|
333
|
-
hits: this.cacheState.hits,
|
|
334
|
-
misses: this.cacheState.misses,
|
|
335
|
-
size: MutableHashMap.size(this.cacheState.map)
|
|
336
|
-
})
|
|
337
|
-
)
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
getOption(key: Key): Effect.Effect<Option.Option<Value>, Error> {
|
|
341
|
-
return core.suspend(() =>
|
|
342
|
-
Option.match(MutableHashMap.get(this.cacheState.map, key), {
|
|
343
|
-
onNone: () => {
|
|
344
|
-
const mapKey = makeMapKey(key)
|
|
345
|
-
this.trackAccess(mapKey)
|
|
346
|
-
this.trackMiss()
|
|
347
|
-
return core.succeed(Option.none<Value>())
|
|
348
|
-
},
|
|
349
|
-
onSome: (value) => this.resolveMapValue(value)
|
|
350
|
-
})
|
|
351
|
-
)
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
getOptionComplete(key: Key): Effect.Effect<Option.Option<Value>> {
|
|
355
|
-
return core.suspend(() =>
|
|
356
|
-
Option.match(MutableHashMap.get(this.cacheState.map, key), {
|
|
357
|
-
onNone: () => {
|
|
358
|
-
const mapKey = makeMapKey(key)
|
|
359
|
-
this.trackAccess(mapKey)
|
|
360
|
-
this.trackMiss()
|
|
361
|
-
return core.succeed(Option.none<Value>())
|
|
362
|
-
},
|
|
363
|
-
onSome: (value) => this.resolveMapValue(value, true) as Effect.Effect<Option.Option<Value>>
|
|
364
|
-
})
|
|
365
|
-
)
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
contains(key: Key): Effect.Effect<boolean> {
|
|
369
|
-
return core.sync(() => MutableHashMap.has(this.cacheState.map, key))
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
entryStats(key: Key): Effect.Effect<Option.Option<Cache.EntryStats>> {
|
|
373
|
-
return core.sync(() => {
|
|
374
|
-
const option = MutableHashMap.get(this.cacheState.map, key)
|
|
375
|
-
if (Option.isSome(option)) {
|
|
376
|
-
switch (option.value._tag) {
|
|
377
|
-
case "Complete": {
|
|
378
|
-
const loaded = option.value.entryStats.loadedMillis
|
|
379
|
-
return Option.some(makeEntryStats(loaded))
|
|
380
|
-
}
|
|
381
|
-
case "Pending": {
|
|
382
|
-
return Option.none()
|
|
383
|
-
}
|
|
384
|
-
case "Refreshing": {
|
|
385
|
-
const loaded = option.value.complete.entryStats.loadedMillis
|
|
386
|
-
return Option.some(makeEntryStats(loaded))
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
return Option.none()
|
|
391
|
-
})
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
getEither(key: Key): Effect.Effect<Either.Either<Value, Value>, Error> {
|
|
395
|
-
return core.suspend((): Effect.Effect<Either.Either<Value, Value>, Error> => {
|
|
396
|
-
const k = key
|
|
397
|
-
let mapKey: MapKey<Key> | undefined = undefined
|
|
398
|
-
let deferred: Deferred.Deferred<Value, Error> | undefined = undefined
|
|
399
|
-
let value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k))
|
|
400
|
-
if (value === undefined) {
|
|
401
|
-
deferred = Deferred.unsafeMake<Value, Error>(this.fiberId)
|
|
402
|
-
mapKey = makeMapKey(k)
|
|
403
|
-
if (MutableHashMap.has(this.cacheState.map, k)) {
|
|
404
|
-
value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k))
|
|
405
|
-
} else {
|
|
406
|
-
MutableHashMap.set(this.cacheState.map, k, pending(mapKey, deferred))
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
if (value === undefined) {
|
|
410
|
-
this.trackAccess(mapKey!)
|
|
411
|
-
this.trackMiss()
|
|
412
|
-
return core.map(this.lookupValueOf(key, deferred!), Either.right)
|
|
413
|
-
} else {
|
|
414
|
-
return core.flatMap(
|
|
415
|
-
this.resolveMapValue(value),
|
|
416
|
-
Option.match({
|
|
417
|
-
onNone: () => this.getEither(key),
|
|
418
|
-
onSome: (value) => core.succeed(Either.left(value))
|
|
419
|
-
})
|
|
420
|
-
)
|
|
421
|
-
}
|
|
422
|
-
})
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
invalidate(key: Key): Effect.Effect<void> {
|
|
426
|
-
return core.sync(() => {
|
|
427
|
-
MutableHashMap.remove(this.cacheState.map, key)
|
|
428
|
-
})
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
invalidateWhen(key: Key, when: (value: Value) => boolean): Effect.Effect<void> {
|
|
432
|
-
return core.sync(() => {
|
|
433
|
-
const value = MutableHashMap.get(this.cacheState.map, key)
|
|
434
|
-
if (Option.isSome(value) && value.value._tag === "Complete") {
|
|
435
|
-
if (value.value.exit._tag === "Success") {
|
|
436
|
-
if (when(value.value.exit.value)) {
|
|
437
|
-
MutableHashMap.remove(this.cacheState.map, key)
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
})
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
get invalidateAll(): Effect.Effect<void> {
|
|
445
|
-
return core.sync(() => {
|
|
446
|
-
this.cacheState.map = MutableHashMap.empty()
|
|
447
|
-
})
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
refresh(key: Key): Effect.Effect<void, Error> {
|
|
451
|
-
return effect.clockWith((clock) =>
|
|
452
|
-
core.suspend(() => {
|
|
453
|
-
const k = key
|
|
454
|
-
const deferred: Deferred.Deferred<Value, Error> = Deferred.unsafeMake(this.fiberId)
|
|
455
|
-
let value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k))
|
|
456
|
-
if (value === undefined) {
|
|
457
|
-
if (MutableHashMap.has(this.cacheState.map, k)) {
|
|
458
|
-
value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k))
|
|
459
|
-
} else {
|
|
460
|
-
MutableHashMap.set(this.cacheState.map, k, pending(makeMapKey(k), deferred))
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
if (value === undefined) {
|
|
464
|
-
return core.asVoid(this.lookupValueOf(key, deferred))
|
|
465
|
-
} else {
|
|
466
|
-
switch (value._tag) {
|
|
467
|
-
case "Complete": {
|
|
468
|
-
if (this.hasExpired(clock, value.timeToLiveMillis)) {
|
|
469
|
-
const found = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k))
|
|
470
|
-
if (Equal.equals(found, value)) {
|
|
471
|
-
MutableHashMap.remove(this.cacheState.map, k)
|
|
472
|
-
}
|
|
473
|
-
return core.asVoid(this.get(key))
|
|
474
|
-
}
|
|
475
|
-
// Only trigger the lookup if we're still the current value, `completedResult`
|
|
476
|
-
return pipe(
|
|
477
|
-
this.lookupValueOf(key, deferred),
|
|
478
|
-
effect.when(() => {
|
|
479
|
-
const current = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k))
|
|
480
|
-
if (Equal.equals(current, value)) {
|
|
481
|
-
const mapValue = refreshing(deferred, value as Complete<Key, Value, Error>)
|
|
482
|
-
MutableHashMap.set(this.cacheState.map, k, mapValue)
|
|
483
|
-
return true
|
|
484
|
-
}
|
|
485
|
-
return false
|
|
486
|
-
}),
|
|
487
|
-
core.asVoid
|
|
488
|
-
)
|
|
489
|
-
}
|
|
490
|
-
case "Pending": {
|
|
491
|
-
return Deferred.await(value.deferred)
|
|
492
|
-
}
|
|
493
|
-
case "Refreshing": {
|
|
494
|
-
return Deferred.await(value.deferred)
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
})
|
|
499
|
-
)
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
set(key: Key, value: Value): Effect.Effect<void> {
|
|
503
|
-
return effect.clockWith((clock) =>
|
|
504
|
-
core.sync(() => {
|
|
505
|
-
const now = clock.unsafeCurrentTimeMillis()
|
|
506
|
-
const k = key
|
|
507
|
-
const lookupResult = Exit.succeed(value)
|
|
508
|
-
const mapValue = complete(
|
|
509
|
-
makeMapKey(k),
|
|
510
|
-
lookupResult,
|
|
511
|
-
makeEntryStats(now),
|
|
512
|
-
now + Duration.toMillis(Duration.decode(this.timeToLive(lookupResult)))
|
|
513
|
-
)
|
|
514
|
-
MutableHashMap.set(
|
|
515
|
-
this.cacheState.map,
|
|
516
|
-
k,
|
|
517
|
-
mapValue as Complete<Key, Value, Error>
|
|
518
|
-
)
|
|
519
|
-
})
|
|
520
|
-
)
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
get size(): Effect.Effect<number> {
|
|
524
|
-
return core.sync(() => {
|
|
525
|
-
return MutableHashMap.size(this.cacheState.map)
|
|
526
|
-
})
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
get values(): Effect.Effect<Array<Value>> {
|
|
530
|
-
return core.sync(() => {
|
|
531
|
-
const values: Array<Value> = []
|
|
532
|
-
for (const entry of this.cacheState.map) {
|
|
533
|
-
if (entry[1]._tag === "Complete" && entry[1].exit._tag === "Success") {
|
|
534
|
-
values.push(entry[1].exit.value)
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
return values
|
|
538
|
-
})
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
get entries(): Effect.Effect<Array<[Key, Value]>> {
|
|
542
|
-
return core.sync(() => {
|
|
543
|
-
const values: Array<[Key, Value]> = []
|
|
544
|
-
for (const entry of this.cacheState.map) {
|
|
545
|
-
if (entry[1]._tag === "Complete" && entry[1].exit._tag === "Success") {
|
|
546
|
-
values.push([entry[0], entry[1].exit.value])
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
return values
|
|
550
|
-
})
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
get keys(): Effect.Effect<Array<Key>> {
|
|
554
|
-
return core.sync(() => {
|
|
555
|
-
const keys: Array<Key> = []
|
|
556
|
-
for (const entry of this.cacheState.map) {
|
|
557
|
-
if (entry[1]._tag === "Complete" && entry[1].exit._tag === "Success") {
|
|
558
|
-
keys.push(entry[0])
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
return keys
|
|
562
|
-
})
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
resolveMapValue(
|
|
566
|
-
value: MapValue<Key, Value, Error>,
|
|
567
|
-
ignorePending = false
|
|
568
|
-
): Effect.Effect<Option.Option<Value>, Error> {
|
|
569
|
-
return effect.clockWith((clock) => {
|
|
570
|
-
switch (value._tag) {
|
|
571
|
-
case "Complete": {
|
|
572
|
-
this.trackAccess(value.key)
|
|
573
|
-
if (this.hasExpired(clock, value.timeToLiveMillis)) {
|
|
574
|
-
MutableHashMap.remove(this.cacheState.map, value.key.current)
|
|
575
|
-
return core.succeed(Option.none<Value>())
|
|
576
|
-
}
|
|
577
|
-
this.trackHit()
|
|
578
|
-
return core.map(value.exit, Option.some)
|
|
579
|
-
}
|
|
580
|
-
case "Pending": {
|
|
581
|
-
this.trackAccess(value.key)
|
|
582
|
-
this.trackHit()
|
|
583
|
-
if (ignorePending) {
|
|
584
|
-
return core.succeed(Option.none<Value>())
|
|
585
|
-
}
|
|
586
|
-
return core.map(Deferred.await(value.deferred), Option.some)
|
|
587
|
-
}
|
|
588
|
-
case "Refreshing": {
|
|
589
|
-
this.trackAccess(value.complete.key)
|
|
590
|
-
this.trackHit()
|
|
591
|
-
if (this.hasExpired(clock, value.complete.timeToLiveMillis)) {
|
|
592
|
-
if (ignorePending) {
|
|
593
|
-
return core.succeed(Option.none<Value>())
|
|
594
|
-
}
|
|
595
|
-
return core.map(Deferred.await(value.deferred), Option.some)
|
|
596
|
-
}
|
|
597
|
-
return core.map(value.complete.exit, Option.some)
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
})
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
trackHit(): void {
|
|
604
|
-
this.cacheState.hits = this.cacheState.hits + 1
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
trackMiss(): void {
|
|
608
|
-
this.cacheState.misses = this.cacheState.misses + 1
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
trackAccess(key: MapKey<Key>): void {
|
|
612
|
-
MutableQueue.offer(this.cacheState.accesses, key)
|
|
613
|
-
if (MutableRef.compareAndSet(this.cacheState.updating, false, true)) {
|
|
614
|
-
let loop = true
|
|
615
|
-
while (loop) {
|
|
616
|
-
const key = MutableQueue.poll(this.cacheState.accesses, MutableQueue.EmptyMutableQueue)
|
|
617
|
-
if (key === MutableQueue.EmptyMutableQueue) {
|
|
618
|
-
loop = false
|
|
619
|
-
} else {
|
|
620
|
-
this.cacheState.keys.add(key)
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
let size = MutableHashMap.size(this.cacheState.map)
|
|
624
|
-
loop = size > this.capacity
|
|
625
|
-
while (loop) {
|
|
626
|
-
const key = this.cacheState.keys.remove()
|
|
627
|
-
if (key !== undefined) {
|
|
628
|
-
if (MutableHashMap.has(this.cacheState.map, key.current)) {
|
|
629
|
-
MutableHashMap.remove(this.cacheState.map, key.current)
|
|
630
|
-
size = size - 1
|
|
631
|
-
loop = size > this.capacity
|
|
632
|
-
}
|
|
633
|
-
} else {
|
|
634
|
-
loop = false
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
MutableRef.set(this.cacheState.updating, false)
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
hasExpired(clock: Clock.Clock, timeToLiveMillis: number): boolean {
|
|
642
|
-
return clock.unsafeCurrentTimeMillis() > timeToLiveMillis
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
lookupValueOf(
|
|
646
|
-
input: Key,
|
|
647
|
-
deferred: Deferred.Deferred<Value, Error>
|
|
648
|
-
): Effect.Effect<Value, Error> {
|
|
649
|
-
return effect.clockWith((clock) =>
|
|
650
|
-
core.suspend(() => {
|
|
651
|
-
const key = input
|
|
652
|
-
return pipe(
|
|
653
|
-
this.lookup(input),
|
|
654
|
-
core.provideContext(this.context),
|
|
655
|
-
core.exit,
|
|
656
|
-
core.flatMap((exit) => {
|
|
657
|
-
const now = clock.unsafeCurrentTimeMillis()
|
|
658
|
-
const stats = makeEntryStats(now)
|
|
659
|
-
const value = complete(
|
|
660
|
-
makeMapKey(key),
|
|
661
|
-
exit,
|
|
662
|
-
stats,
|
|
663
|
-
now + Duration.toMillis(Duration.decode(this.timeToLive(exit)))
|
|
664
|
-
)
|
|
665
|
-
MutableHashMap.set(this.cacheState.map, key, value)
|
|
666
|
-
return core.zipRight(
|
|
667
|
-
Deferred.done(deferred, exit),
|
|
668
|
-
exit
|
|
669
|
-
)
|
|
670
|
-
}),
|
|
671
|
-
core.onInterrupt(() =>
|
|
672
|
-
core.zipRight(
|
|
673
|
-
Deferred.interrupt(deferred),
|
|
674
|
-
core.sync(() => {
|
|
675
|
-
MutableHashMap.remove(this.cacheState.map, key)
|
|
676
|
-
})
|
|
677
|
-
)
|
|
678
|
-
)
|
|
679
|
-
)
|
|
680
|
-
})
|
|
681
|
-
)
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
/** @internal */
|
|
686
|
-
export const make = <Key, Value, Error = never, Environment = never>(
|
|
687
|
-
options: {
|
|
688
|
-
readonly capacity: number
|
|
689
|
-
readonly timeToLive: Duration.DurationInput
|
|
690
|
-
readonly lookup: Cache.Lookup<Key, Value, Error, Environment>
|
|
691
|
-
}
|
|
692
|
-
): Effect.Effect<Cache.Cache<Key, Value, Error>, never, Environment> => {
|
|
693
|
-
const timeToLive = Duration.decode(options.timeToLive)
|
|
694
|
-
return makeWith({
|
|
695
|
-
capacity: options.capacity,
|
|
696
|
-
lookup: options.lookup,
|
|
697
|
-
timeToLive: () => timeToLive
|
|
698
|
-
})
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
/** @internal */
|
|
702
|
-
export const makeWith = <Key, Value, Error = never, Environment = never>(
|
|
703
|
-
options: {
|
|
704
|
-
readonly capacity: number
|
|
705
|
-
readonly lookup: Cache.Lookup<Key, Value, Error, Environment>
|
|
706
|
-
readonly timeToLive: (exit: Exit.Exit<Value, Error>) => Duration.DurationInput
|
|
707
|
-
}
|
|
708
|
-
): Effect.Effect<Cache.Cache<Key, Value, Error>, never, Environment> =>
|
|
709
|
-
core.map(
|
|
710
|
-
fiberRuntime.all([core.context<Environment>(), core.fiberId]),
|
|
711
|
-
([context, fiberId]) =>
|
|
712
|
-
new CacheImpl(
|
|
713
|
-
options.capacity,
|
|
714
|
-
context,
|
|
715
|
-
fiberId,
|
|
716
|
-
options.lookup,
|
|
717
|
-
(exit) => Duration.decode(options.timeToLive(exit))
|
|
718
|
-
)
|
|
719
|
-
)
|
|
720
|
-
|
|
721
|
-
/** @internal */
|
|
722
|
-
export const unsafeMakeWith = <Key, Value, Error = never>(
|
|
723
|
-
capacity: number,
|
|
724
|
-
lookup: Cache.Lookup<Key, Value, Error>,
|
|
725
|
-
timeToLive: (exit: Exit.Exit<Value, Error>) => Duration.DurationInput
|
|
726
|
-
): Cache.Cache<Key, Value, Error> =>
|
|
727
|
-
new CacheImpl<Key, Value, Error>(
|
|
728
|
-
capacity,
|
|
729
|
-
Context.empty() as Context.Context<any>,
|
|
730
|
-
none,
|
|
731
|
-
lookup,
|
|
732
|
-
(exit) => Duration.decode(timeToLive(exit))
|
|
733
|
-
)
|