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.
Files changed (50) hide show
  1. package/dist/cjs/Cron.js +144 -48
  2. package/dist/cjs/Cron.js.map +1 -1
  3. package/dist/cjs/Effect.js +9 -4
  4. package/dist/cjs/Effect.js.map +1 -1
  5. package/dist/cjs/Layer.js +49 -1
  6. package/dist/cjs/Layer.js.map +1 -1
  7. package/dist/cjs/RcMap.js +1 -0
  8. package/dist/cjs/RcMap.js.map +1 -1
  9. package/dist/cjs/internal/core-effect.js +8 -4
  10. package/dist/cjs/internal/core-effect.js.map +1 -1
  11. package/dist/cjs/internal/fiberRuntime.js +1 -1
  12. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  13. package/dist/cjs/internal/rcMap.js +11 -6
  14. package/dist/cjs/internal/rcMap.js.map +1 -1
  15. package/dist/cjs/internal/version.js +1 -1
  16. package/dist/dts/Cron.d.ts +29 -1
  17. package/dist/dts/Cron.d.ts.map +1 -1
  18. package/dist/dts/Effect.d.ts +5 -0
  19. package/dist/dts/Effect.d.ts.map +1 -1
  20. package/dist/dts/Layer.d.ts +42 -0
  21. package/dist/dts/Layer.d.ts.map +1 -1
  22. package/dist/dts/RcMap.d.ts +5 -2
  23. package/dist/dts/RcMap.d.ts.map +1 -1
  24. package/dist/dts/internal/core-effect.d.ts +5 -0
  25. package/dist/dts/internal/core-effect.d.ts.map +1 -1
  26. package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
  27. package/dist/esm/Cron.js +139 -45
  28. package/dist/esm/Cron.js.map +1 -1
  29. package/dist/esm/Effect.js +5 -0
  30. package/dist/esm/Effect.js.map +1 -1
  31. package/dist/esm/Layer.js +45 -0
  32. package/dist/esm/Layer.js.map +1 -1
  33. package/dist/esm/RcMap.js +1 -0
  34. package/dist/esm/RcMap.js.map +1 -1
  35. package/dist/esm/internal/core-effect.js +6 -2
  36. package/dist/esm/internal/core-effect.js.map +1 -1
  37. package/dist/esm/internal/fiberRuntime.js +1 -1
  38. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  39. package/dist/esm/internal/rcMap.js +12 -7
  40. package/dist/esm/internal/rcMap.js.map +1 -1
  41. package/dist/esm/internal/version.js +1 -1
  42. package/package.json +1 -1
  43. package/src/Cron.ts +175 -45
  44. package/src/Effect.ts +6 -0
  45. package/src/Layer.ts +52 -0
  46. package/src/RcMap.ts +5 -2
  47. package/src/internal/core-effect.ts +18 -7
  48. package/src/internal/fiberRuntime.ts +4 -2
  49. package/src/internal/rcMap.ts +21 -11
  50. package/src/internal/version.ts +1 -1
@@ -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
- options.idleTimeToLive ? Duration.decode(options.idleTimeToLive) : undefined,
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
- || self.idleTimeToLive === undefined
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(self.idleTimeToLive)) {
211
+ if (!Duration.isFinite(entry.idleTimeToLive)) {
204
212
  return core.void
205
213
  }
206
214
 
207
- entry.expiresAt = clock.unsafeCurrentTimeMillis() + Duration.toMillis(self.idleTimeToLive)
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 (!self.idleTimeToLive || self.state._tag === "Closed") return core.void
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
- o.value.expiresAt = clock.unsafeCurrentTimeMillis() + Duration.toMillis(self.idleTimeToLive)
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
  )
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.20.1"
1
+ let moduleVersion = "3.21.0"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4