effect 3.20.1 → 3.21.0
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/Cron.js +144 -48
- package/dist/cjs/Cron.js.map +1 -1
- package/dist/cjs/Effect.js +9 -4
- package/dist/cjs/Effect.js.map +1 -1
- package/dist/cjs/Layer.js +49 -1
- package/dist/cjs/Layer.js.map +1 -1
- package/dist/cjs/RcMap.js +1 -0
- package/dist/cjs/RcMap.js.map +1 -1
- package/dist/cjs/internal/core-effect.js +8 -4
- package/dist/cjs/internal/core-effect.js.map +1 -1
- package/dist/cjs/internal/fiberRuntime.js +1 -1
- package/dist/cjs/internal/fiberRuntime.js.map +1 -1
- package/dist/cjs/internal/rcMap.js +11 -6
- package/dist/cjs/internal/rcMap.js.map +1 -1
- package/dist/cjs/internal/version.js +1 -1
- package/dist/dts/Cron.d.ts +29 -1
- package/dist/dts/Cron.d.ts.map +1 -1
- package/dist/dts/Effect.d.ts +5 -0
- package/dist/dts/Effect.d.ts.map +1 -1
- package/dist/dts/Layer.d.ts +42 -0
- package/dist/dts/Layer.d.ts.map +1 -1
- package/dist/dts/RcMap.d.ts +5 -2
- package/dist/dts/RcMap.d.ts.map +1 -1
- package/dist/dts/internal/core-effect.d.ts +5 -0
- package/dist/dts/internal/core-effect.d.ts.map +1 -1
- package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
- package/dist/esm/Cron.js +139 -45
- package/dist/esm/Cron.js.map +1 -1
- package/dist/esm/Effect.js +5 -0
- package/dist/esm/Effect.js.map +1 -1
- package/dist/esm/Layer.js +45 -0
- package/dist/esm/Layer.js.map +1 -1
- package/dist/esm/RcMap.js +1 -0
- package/dist/esm/RcMap.js.map +1 -1
- package/dist/esm/internal/core-effect.js +6 -2
- package/dist/esm/internal/core-effect.js.map +1 -1
- package/dist/esm/internal/fiberRuntime.js +1 -1
- package/dist/esm/internal/fiberRuntime.js.map +1 -1
- package/dist/esm/internal/rcMap.js +12 -7
- package/dist/esm/internal/rcMap.js.map +1 -1
- package/dist/esm/internal/version.js +1 -1
- package/package.json +1 -1
- package/src/Cron.ts +175 -45
- package/src/Effect.ts +6 -0
- package/src/Layer.ts +52 -0
- package/src/RcMap.ts +5 -2
- package/src/internal/core-effect.ts +18 -7
- package/src/internal/fiberRuntime.ts +4 -2
- package/src/internal/rcMap.ts +21 -11
- package/src/internal/version.ts +1 -1
package/src/internal/rcMap.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type * as Deferred from "../Deferred.js"
|
|
|
4
4
|
import * as Duration from "../Duration.js"
|
|
5
5
|
import type { Effect } from "../Effect.js"
|
|
6
6
|
import type { RuntimeFiber } from "../Fiber.js"
|
|
7
|
-
import { dual, identity } from "../Function.js"
|
|
7
|
+
import { constant, dual, flow, identity } from "../Function.js"
|
|
8
8
|
import * as MutableHashMap from "../MutableHashMap.js"
|
|
9
9
|
import { pipeArguments } from "../Pipeable.js"
|
|
10
10
|
import type * as RcMap from "../RcMap.js"
|
|
@@ -33,6 +33,7 @@ declare namespace State {
|
|
|
33
33
|
readonly deferred: Deferred.Deferred<A, E>
|
|
34
34
|
readonly scope: Scope.CloseableScope
|
|
35
35
|
readonly finalizer: Effect<void>
|
|
36
|
+
readonly idleTimeToLive: Duration.Duration
|
|
36
37
|
fiber: RuntimeFiber<void, never> | undefined
|
|
37
38
|
expiresAt: number
|
|
38
39
|
refCount: number
|
|
@@ -58,7 +59,7 @@ class RcMapImpl<K, A, E> implements RcMap.RcMap<K, A, E> {
|
|
|
58
59
|
readonly lookup: (key: K) => Effect<A, E, Scope.Scope>,
|
|
59
60
|
readonly context: Context.Context<never>,
|
|
60
61
|
readonly scope: Scope.Scope,
|
|
61
|
-
readonly idleTimeToLive: Duration.Duration | undefined,
|
|
62
|
+
readonly idleTimeToLive: ((key: K) => Duration.Duration) | undefined,
|
|
62
63
|
readonly capacity: number
|
|
63
64
|
) {
|
|
64
65
|
this[TypeId] = variance
|
|
@@ -73,27 +74,32 @@ class RcMapImpl<K, A, E> implements RcMap.RcMap<K, A, E> {
|
|
|
73
74
|
export const make: {
|
|
74
75
|
<K, A, E, R>(options: {
|
|
75
76
|
readonly lookup: (key: K) => Effect<A, E, R>
|
|
76
|
-
readonly idleTimeToLive?: Duration.DurationInput | undefined
|
|
77
|
+
readonly idleTimeToLive?: Duration.DurationInput | ((key: K) => Duration.DurationInput) | undefined
|
|
77
78
|
readonly capacity?: undefined
|
|
78
79
|
}): Effect<RcMap.RcMap<K, A, E>, never, Scope.Scope | R>
|
|
79
80
|
<K, A, E, R>(options: {
|
|
80
81
|
readonly lookup: (key: K) => Effect<A, E, R>
|
|
81
|
-
readonly idleTimeToLive?: Duration.DurationInput | undefined
|
|
82
|
+
readonly idleTimeToLive?: Duration.DurationInput | ((key: K) => Duration.DurationInput) | undefined
|
|
82
83
|
readonly capacity: number
|
|
83
84
|
}): Effect<RcMap.RcMap<K, A, E | Cause.ExceededCapacityException>, never, Scope.Scope | R>
|
|
84
85
|
} = <K, A, E, R>(options: {
|
|
85
86
|
readonly lookup: (key: K) => Effect<A, E, R>
|
|
86
|
-
readonly idleTimeToLive?: Duration.DurationInput | undefined
|
|
87
|
+
readonly idleTimeToLive?: Duration.DurationInput | ((key: K) => Duration.DurationInput) | undefined
|
|
87
88
|
readonly capacity?: number | undefined
|
|
88
89
|
}) =>
|
|
89
90
|
core.withFiberRuntime<RcMap.RcMap<K, A, E>, never, R | Scope.Scope>((fiber) => {
|
|
90
91
|
const context = fiber.getFiberRef(core.currentContext) as Context.Context<R | Scope.Scope>
|
|
91
92
|
const scope = Context.get(context, fiberRuntime.scopeTag)
|
|
93
|
+
const idleTimeToLive = options.idleTimeToLive === undefined
|
|
94
|
+
? undefined
|
|
95
|
+
: typeof options.idleTimeToLive === "function"
|
|
96
|
+
? flow(options.idleTimeToLive, Duration.decode)
|
|
97
|
+
: constant(Duration.decode(options.idleTimeToLive))
|
|
92
98
|
const self = new RcMapImpl<K, A, E>(
|
|
93
99
|
options.lookup as any,
|
|
94
100
|
context,
|
|
95
101
|
scope,
|
|
96
|
-
|
|
102
|
+
idleTimeToLive,
|
|
97
103
|
Math.max(options.capacity ?? Number.POSITIVE_INFINITY, 0)
|
|
98
104
|
)
|
|
99
105
|
return core.as(
|
|
@@ -169,10 +175,12 @@ const acquire = core.fnUntraced(function*<K, A, E>(self: RcMapImpl<K, A, E>, key
|
|
|
169
175
|
core.flatMap((exit) => core.deferredDone(deferred, exit)),
|
|
170
176
|
circular.forkIn(scope)
|
|
171
177
|
)
|
|
178
|
+
const idleTimeToLive = self.idleTimeToLive ? self.idleTimeToLive(key) : Duration.zero
|
|
172
179
|
const entry: State.Entry<A, E> = {
|
|
173
180
|
deferred,
|
|
174
181
|
scope,
|
|
175
182
|
finalizer: undefined as any,
|
|
183
|
+
idleTimeToLive,
|
|
176
184
|
fiber: undefined,
|
|
177
185
|
expiresAt: 0,
|
|
178
186
|
refCount: 1
|
|
@@ -192,7 +200,7 @@ const release = <K, A, E>(self: RcMapImpl<K, A, E>, key: K, entry: State.Entry<A
|
|
|
192
200
|
} else if (
|
|
193
201
|
self.state._tag === "Closed"
|
|
194
202
|
|| !MutableHashMap.has(self.state.map, key)
|
|
195
|
-
||
|
|
203
|
+
|| Duration.isZero(entry.idleTimeToLive)
|
|
196
204
|
) {
|
|
197
205
|
if (self.state._tag === "Open") {
|
|
198
206
|
MutableHashMap.remove(self.state.map, key)
|
|
@@ -200,11 +208,11 @@ const release = <K, A, E>(self: RcMapImpl<K, A, E>, key: K, entry: State.Entry<A
|
|
|
200
208
|
return core.scopeClose(entry.scope, core.exitVoid)
|
|
201
209
|
}
|
|
202
210
|
|
|
203
|
-
if (!Duration.isFinite(
|
|
211
|
+
if (!Duration.isFinite(entry.idleTimeToLive)) {
|
|
204
212
|
return core.void
|
|
205
213
|
}
|
|
206
214
|
|
|
207
|
-
entry.expiresAt = clock.unsafeCurrentTimeMillis() + Duration.toMillis(
|
|
215
|
+
entry.expiresAt = clock.unsafeCurrentTimeMillis() + Duration.toMillis(entry.idleTimeToLive)
|
|
208
216
|
if (entry.fiber) return core.void
|
|
209
217
|
|
|
210
218
|
return core.interruptibleMask(function loop(restore): Effect<void> {
|
|
@@ -276,10 +284,12 @@ export const touch: {
|
|
|
276
284
|
<K, A, E>(self_: RcMap.RcMap<K, A, E>, key: K) =>
|
|
277
285
|
coreEffect.clockWith((clock) => {
|
|
278
286
|
const self = self_ as RcMapImpl<K, A, E>
|
|
279
|
-
if (
|
|
287
|
+
if (self.state._tag === "Closed") return core.void
|
|
280
288
|
const o = MutableHashMap.get(self.state.map, key)
|
|
281
289
|
if (o._tag === "None") return core.void
|
|
282
|
-
|
|
290
|
+
const entry = o.value
|
|
291
|
+
if (Duration.isZero(entry.idleTimeToLive)) return core.void
|
|
292
|
+
entry.expiresAt = clock.unsafeCurrentTimeMillis() + Duration.toMillis(entry.idleTimeToLive)
|
|
283
293
|
return core.void
|
|
284
294
|
})
|
|
285
295
|
)
|
package/src/internal/version.ts
CHANGED