effect 3.12.11 → 3.13.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 (204) hide show
  1. package/README.md +38 -49
  2. package/dist/cjs/Channel.js.map +1 -1
  3. package/dist/cjs/DateTime.js +17 -1
  4. package/dist/cjs/DateTime.js.map +1 -1
  5. package/dist/cjs/Differ.js.map +1 -1
  6. package/dist/cjs/Duration.js +128 -1
  7. package/dist/cjs/Duration.js.map +1 -1
  8. package/dist/cjs/Effect.js +175 -37
  9. package/dist/cjs/Effect.js.map +1 -1
  10. package/dist/cjs/Either.js +2 -1
  11. package/dist/cjs/Either.js.map +1 -1
  12. package/dist/cjs/FiberHandle.js +54 -21
  13. package/dist/cjs/FiberHandle.js.map +1 -1
  14. package/dist/cjs/FiberMap.js +51 -24
  15. package/dist/cjs/FiberMap.js.map +1 -1
  16. package/dist/cjs/FiberSet.js +50 -17
  17. package/dist/cjs/FiberSet.js.map +1 -1
  18. package/dist/cjs/HashMap.js +19 -1
  19. package/dist/cjs/HashMap.js.map +1 -1
  20. package/dist/cjs/HashSet.js +9 -1
  21. package/dist/cjs/HashSet.js.map +1 -1
  22. package/dist/cjs/Layer.js +21 -1
  23. package/dist/cjs/Layer.js.map +1 -1
  24. package/dist/cjs/Match.js +659 -38
  25. package/dist/cjs/Match.js.map +1 -1
  26. package/dist/cjs/RcMap.js +11 -1
  27. package/dist/cjs/RcMap.js.map +1 -1
  28. package/dist/cjs/Reloadable.js.map +1 -1
  29. package/dist/cjs/STM.js.map +1 -1
  30. package/dist/cjs/Schedule.js +1074 -309
  31. package/dist/cjs/Schedule.js.map +1 -1
  32. package/dist/cjs/Schema.js +73 -1
  33. package/dist/cjs/Schema.js.map +1 -1
  34. package/dist/cjs/Stream.js.map +1 -1
  35. package/dist/cjs/internal/channel.js.map +1 -1
  36. package/dist/cjs/internal/core-effect.js.map +1 -1
  37. package/dist/cjs/internal/core.js +27 -3
  38. package/dist/cjs/internal/core.js.map +1 -1
  39. package/dist/cjs/internal/dateTime.js +4 -1
  40. package/dist/cjs/internal/dateTime.js.map +1 -1
  41. package/dist/cjs/internal/differ.js +4 -0
  42. package/dist/cjs/internal/differ.js.map +1 -1
  43. package/dist/cjs/internal/effect/circular.js +3 -2
  44. package/dist/cjs/internal/effect/circular.js.map +1 -1
  45. package/dist/cjs/internal/fiberRuntime.js +21 -7
  46. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  47. package/dist/cjs/internal/hashMap.js +10 -1
  48. package/dist/cjs/internal/hashMap.js.map +1 -1
  49. package/dist/cjs/internal/keyedPool.js +1 -1
  50. package/dist/cjs/internal/keyedPool.js.map +1 -1
  51. package/dist/cjs/internal/layer.js.map +1 -1
  52. package/dist/cjs/internal/rcMap.js +86 -56
  53. package/dist/cjs/internal/rcMap.js.map +1 -1
  54. package/dist/cjs/internal/reloadable.js.map +1 -1
  55. package/dist/cjs/internal/schedule.js.map +1 -1
  56. package/dist/cjs/internal/sink.js.map +1 -1
  57. package/dist/cjs/internal/stm/stm.js.map +1 -1
  58. package/dist/cjs/internal/stream.js.map +1 -1
  59. package/dist/cjs/internal/version.js +1 -1
  60. package/dist/cjs/internal/version.js.map +1 -1
  61. package/dist/dts/Channel.d.ts +4 -4
  62. package/dist/dts/Channel.d.ts.map +1 -1
  63. package/dist/dts/DateTime.d.ts +16 -0
  64. package/dist/dts/DateTime.d.ts.map +1 -1
  65. package/dist/dts/Differ.d.ts +2 -1
  66. package/dist/dts/Differ.d.ts.map +1 -1
  67. package/dist/dts/Duration.d.ts +64 -0
  68. package/dist/dts/Duration.d.ts.map +1 -1
  69. package/dist/dts/Effect.d.ts +402 -30
  70. package/dist/dts/Effect.d.ts.map +1 -1
  71. package/dist/dts/Either.d.ts +7 -0
  72. package/dist/dts/Either.d.ts.map +1 -1
  73. package/dist/dts/FiberHandle.d.ts +26 -0
  74. package/dist/dts/FiberHandle.d.ts.map +1 -1
  75. package/dist/dts/FiberMap.d.ts +26 -0
  76. package/dist/dts/FiberMap.d.ts.map +1 -1
  77. package/dist/dts/FiberSet.d.ts +25 -0
  78. package/dist/dts/FiberSet.d.ts.map +1 -1
  79. package/dist/dts/HashMap.d.ts +38 -0
  80. package/dist/dts/HashMap.d.ts.map +1 -1
  81. package/dist/dts/HashSet.d.ts +7 -0
  82. package/dist/dts/HashSet.d.ts.map +1 -1
  83. package/dist/dts/Layer.d.ts +32 -13
  84. package/dist/dts/Layer.d.ts.map +1 -1
  85. package/dist/dts/Match.d.ts +731 -48
  86. package/dist/dts/Match.d.ts.map +1 -1
  87. package/dist/dts/RcMap.d.ts +32 -0
  88. package/dist/dts/RcMap.d.ts.map +1 -1
  89. package/dist/dts/Reloadable.d.ts +13 -13
  90. package/dist/dts/Reloadable.d.ts.map +1 -1
  91. package/dist/dts/STM.d.ts +4 -4
  92. package/dist/dts/STM.d.ts.map +1 -1
  93. package/dist/dts/Schedule.d.ts +2294 -633
  94. package/dist/dts/Schedule.d.ts.map +1 -1
  95. package/dist/dts/Schema.d.ts +40 -4
  96. package/dist/dts/Schema.d.ts.map +1 -1
  97. package/dist/dts/Stream.d.ts +8 -8
  98. package/dist/dts/Stream.d.ts.map +1 -1
  99. package/dist/dts/Trie.d.ts +7 -7
  100. package/dist/dts/Trie.d.ts.map +1 -1
  101. package/dist/dts/index.d.ts +25 -0
  102. package/dist/dts/index.d.ts.map +1 -1
  103. package/dist/dts/internal/stm/stm.d.ts +2 -2
  104. package/dist/dts/internal/stm/stm.d.ts.map +1 -1
  105. package/dist/esm/Channel.js.map +1 -1
  106. package/dist/esm/DateTime.js +16 -0
  107. package/dist/esm/DateTime.js.map +1 -1
  108. package/dist/esm/Differ.js.map +1 -1
  109. package/dist/esm/Duration.js +124 -0
  110. package/dist/esm/Duration.js.map +1 -1
  111. package/dist/esm/Effect.js +170 -32
  112. package/dist/esm/Effect.js.map +1 -1
  113. package/dist/esm/Either.js +7 -0
  114. package/dist/esm/Either.js.map +1 -1
  115. package/dist/esm/FiberHandle.js +48 -18
  116. package/dist/esm/FiberHandle.js.map +1 -1
  117. package/dist/esm/FiberMap.js +46 -22
  118. package/dist/esm/FiberMap.js.map +1 -1
  119. package/dist/esm/FiberSet.js +45 -15
  120. package/dist/esm/FiberSet.js.map +1 -1
  121. package/dist/esm/HashMap.js +17 -0
  122. package/dist/esm/HashMap.js.map +1 -1
  123. package/dist/esm/HashSet.js +7 -0
  124. package/dist/esm/HashSet.js.map +1 -1
  125. package/dist/esm/Layer.js +20 -0
  126. package/dist/esm/Layer.js.map +1 -1
  127. package/dist/esm/Match.js +665 -40
  128. package/dist/esm/Match.js.map +1 -1
  129. package/dist/esm/RcMap.js +10 -0
  130. package/dist/esm/RcMap.js.map +1 -1
  131. package/dist/esm/Reloadable.js.map +1 -1
  132. package/dist/esm/STM.js.map +1 -1
  133. package/dist/esm/Schedule.js +1074 -309
  134. package/dist/esm/Schedule.js.map +1 -1
  135. package/dist/esm/Schema.js +71 -0
  136. package/dist/esm/Schema.js.map +1 -1
  137. package/dist/esm/Stream.js.map +1 -1
  138. package/dist/esm/index.js +25 -0
  139. package/dist/esm/index.js.map +1 -1
  140. package/dist/esm/internal/channel.js.map +1 -1
  141. package/dist/esm/internal/core-effect.js.map +1 -1
  142. package/dist/esm/internal/core.js +23 -0
  143. package/dist/esm/internal/core.js.map +1 -1
  144. package/dist/esm/internal/dateTime.js +2 -0
  145. package/dist/esm/internal/dateTime.js.map +1 -1
  146. package/dist/esm/internal/differ.js +4 -0
  147. package/dist/esm/internal/differ.js.map +1 -1
  148. package/dist/esm/internal/effect/circular.js +3 -2
  149. package/dist/esm/internal/effect/circular.js.map +1 -1
  150. package/dist/esm/internal/fiberRuntime.js +18 -5
  151. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  152. package/dist/esm/internal/hashMap.js +9 -0
  153. package/dist/esm/internal/hashMap.js.map +1 -1
  154. package/dist/esm/internal/keyedPool.js +1 -1
  155. package/dist/esm/internal/keyedPool.js.map +1 -1
  156. package/dist/esm/internal/layer.js.map +1 -1
  157. package/dist/esm/internal/rcMap.js +85 -55
  158. package/dist/esm/internal/rcMap.js.map +1 -1
  159. package/dist/esm/internal/reloadable.js.map +1 -1
  160. package/dist/esm/internal/schedule.js.map +1 -1
  161. package/dist/esm/internal/sink.js.map +1 -1
  162. package/dist/esm/internal/stm/stm.js.map +1 -1
  163. package/dist/esm/internal/stream.js.map +1 -1
  164. package/dist/esm/internal/version.js +1 -1
  165. package/dist/esm/internal/version.js.map +1 -1
  166. package/package.json +2 -1
  167. package/src/Channel.ts +14 -17
  168. package/src/DateTime.ts +17 -8
  169. package/src/Differ.ts +2 -1
  170. package/src/Duration.ts +147 -0
  171. package/src/Effect.ts +528 -140
  172. package/src/Either.ts +9 -0
  173. package/src/FiberHandle.ts +95 -35
  174. package/src/FiberMap.ts +104 -39
  175. package/src/FiberSet.ts +93 -24
  176. package/src/HashMap.ts +40 -0
  177. package/src/HashSet.ts +8 -0
  178. package/src/Layer.ts +94 -40
  179. package/src/Match.ts +733 -49
  180. package/src/RcMap.ts +34 -0
  181. package/src/Reloadable.ts +17 -27
  182. package/src/STM.ts +10 -17
  183. package/src/Schedule.ts +2325 -653
  184. package/src/Schema.ts +81 -4
  185. package/src/Stream.ts +26 -33
  186. package/src/Trie.ts +7 -7
  187. package/src/index.ts +25 -0
  188. package/src/internal/channel.ts +37 -39
  189. package/src/internal/core-effect.ts +84 -84
  190. package/src/internal/core.ts +80 -0
  191. package/src/internal/dateTime.ts +3 -0
  192. package/src/internal/differ.ts +4 -0
  193. package/src/internal/effect/circular.ts +3 -2
  194. package/src/internal/fiberRuntime.ts +31 -6
  195. package/src/internal/hashMap.ts +16 -0
  196. package/src/internal/keyedPool.ts +1 -1
  197. package/src/internal/layer.ts +52 -52
  198. package/src/internal/rcMap.ts +131 -89
  199. package/src/internal/reloadable.ts +25 -28
  200. package/src/internal/schedule.ts +29 -23
  201. package/src/internal/sink.ts +16 -15
  202. package/src/internal/stm/stm.ts +54 -46
  203. package/src/internal/stream.ts +100 -100
  204. package/src/internal/version.ts +1 -1
@@ -20,6 +20,7 @@ import * as Intervals from "../ScheduleIntervals.js"
20
20
  import * as Scope from "../Scope.js"
21
21
  import type * as Synchronized from "../SynchronizedRef.js"
22
22
  import type * as Tracer from "../Tracer.js"
23
+ import type * as Types from "../Types.js"
23
24
  import * as effect from "./core-effect.js"
24
25
  import * as core from "./core.js"
25
26
  import * as circular from "./effect/circular.js"
@@ -542,15 +543,15 @@ export const fresh = <A, E, R>(self: Layer.Layer<A, E, R>): Layer.Layer<A, E, R>
542
543
 
543
544
  /** @internal */
544
545
  export const fromEffect = dual<
545
- <T extends Context.Tag<any, any>>(
546
- tag: T
546
+ <I, S>(
547
+ tag: Context.Tag<I, S>
547
548
  ) => <E, R>(
548
- effect: Effect.Effect<Context.Tag.Service<T>, E, R>
549
- ) => Layer.Layer<Context.Tag.Identifier<T>, E, R>,
550
- <T extends Context.Tag<any, any>, E, R>(
551
- tag: T,
552
- effect: Effect.Effect<Context.Tag.Service<T>, E, R>
553
- ) => Layer.Layer<Context.Tag.Identifier<T>, E, R>
549
+ effect: Effect.Effect<Types.NoInfer<S>, E, R>
550
+ ) => Layer.Layer<I, E, R>,
551
+ <I, S, E, R>(
552
+ tag: Context.Tag<I, S>,
553
+ effect: Effect.Effect<Types.NoInfer<S>, E, R>
554
+ ) => Layer.Layer<I, E, R>
554
555
  >(2, (a, b) => {
555
556
  const tagFirst = Context.isTag(a)
556
557
  const tag = (tagFirst ? a : b) as Context.Tag<unknown, unknown>
@@ -610,12 +611,11 @@ export const fiberRefLocallyScopedWith = <A>(self: FiberRef<A>, value: (_: A) =>
610
611
  scopedDiscard(fiberRuntime.fiberRefLocallyScopedWith(self, value))
611
612
 
612
613
  /** @internal */
613
- export const fromFunction = <A extends Context.Tag<any, any>, B extends Context.Tag<any, any>>(
614
- tagA: A,
615
- tagB: B,
616
- f: (a: Context.Tag.Service<A>) => Context.Tag.Service<B>
617
- ): Layer.Layer<Context.Tag.Identifier<B>, never, Context.Tag.Identifier<A>> =>
618
- fromEffectContext(core.map(tagA, (a) => Context.make(tagB, f(a))))
614
+ export const fromFunction = <I1, S1, I2, S2>(
615
+ tagA: Context.Tag<I1, S1>,
616
+ tagB: Context.Tag<I2, S2>,
617
+ f: (a: Types.NoInfer<S1>) => Types.NoInfer<S2>
618
+ ): Layer.Layer<I2, never, I1> => fromEffectContext(core.map(tagA, (a) => Context.make(tagB, f(a))))
619
619
 
620
620
  /** @internal */
621
621
  export const launch = <RIn, E, ROut>(self: Layer.Layer<ROut, E, RIn>): Effect.Effect<never, E, RIn> =>
@@ -761,17 +761,17 @@ export const passthrough = <RIn, E, ROut>(self: Layer.Layer<ROut, E, RIn>): Laye
761
761
 
762
762
  /** @internal */
763
763
  export const project = dual<
764
- <A extends Context.Tag<any, any>, B extends Context.Tag<any, any>>(
765
- tagA: A,
766
- tagB: B,
767
- f: (a: Context.Tag.Service<A>) => Context.Tag.Service<B>
768
- ) => <RIn, E>(self: Layer.Layer<Context.Tag.Identifier<A>, E, RIn>) => Layer.Layer<Context.Tag.Identifier<B>, E, RIn>,
769
- <RIn, E, A extends Context.Tag<any, any>, B extends Context.Tag<any, any>>(
770
- self: Layer.Layer<Context.Tag.Identifier<A>, E, RIn>,
771
- tagA: A,
772
- tagB: B,
773
- f: (a: Context.Tag.Service<A>) => Context.Tag.Service<B>
774
- ) => Layer.Layer<Context.Tag.Identifier<B>, E, RIn>
764
+ <I1, S1, I2, S2>(
765
+ tagA: Context.Tag<I1, S1>,
766
+ tagB: Context.Tag<I2, S2>,
767
+ f: (a: Types.NoInfer<S1>) => Types.NoInfer<S2>
768
+ ) => <RIn, E>(self: Layer.Layer<I1, E, RIn>) => Layer.Layer<I2, E, RIn>,
769
+ <RIn, E, I1, S1, I2, S2>(
770
+ self: Layer.Layer<I1, E, RIn>,
771
+ tagA: Context.Tag<I1, S1>,
772
+ tagB: Context.Tag<I2, S2>,
773
+ f: (a: Types.NoInfer<S1>) => Types.NoInfer<S2>
774
+ ) => Layer.Layer<I2, E, RIn>
775
775
  >(4, (self, tagA, tagB, f) => map(self, (context) => Context.make(tagB, f(Context.unsafeGet(context, tagA)))))
776
776
 
777
777
  /** @internal */
@@ -842,15 +842,15 @@ const retryUpdate = <X, E, RIn>(
842
842
 
843
843
  /** @internal */
844
844
  export const scoped = dual<
845
- <T extends Context.Tag<any, any>>(
846
- tag: T
845
+ <I, S>(
846
+ tag: Context.Tag<I, S>
847
847
  ) => <E, R>(
848
- effect: Effect.Effect<Context.Tag.Service<T>, E, R>
849
- ) => Layer.Layer<Context.Tag.Identifier<T>, E, Exclude<R, Scope.Scope>>,
850
- <T extends Context.Tag<any, any>, E, R>(
851
- tag: T,
852
- effect: Effect.Effect<Context.Tag.Service<T>, E, R>
853
- ) => Layer.Layer<Context.Tag.Identifier<T>, E, Exclude<R, Scope.Scope>>
848
+ effect: Effect.Effect<Types.NoInfer<S>, E, R>
849
+ ) => Layer.Layer<I, E, Exclude<R, Scope.Scope>>,
850
+ <I, S, E, R>(
851
+ tag: Context.Tag<I, S>,
852
+ effect: Effect.Effect<Types.NoInfer<S>, E, R>
853
+ ) => Layer.Layer<I, E, Exclude<R, Scope.Scope>>
854
854
  >(2, (a, b) => {
855
855
  const tagFirst = Context.isTag(a)
856
856
  const tag = (tagFirst ? a : b) as Context.Tag<unknown, unknown>
@@ -885,21 +885,21 @@ export const scope: Layer.Layer<Scope.Scope> = scopedContext(
885
885
  )
886
886
 
887
887
  /** @internal */
888
- export const service = <T extends Context.Tag<any, any>>(
889
- tag: T
890
- ): Layer.Layer<Context.Tag.Identifier<T>, never, Context.Tag.Identifier<T>> => fromEffect(tag, tag)
888
+ export const service = <I, S>(
889
+ tag: Context.Tag<I, S>
890
+ ): Layer.Layer<I, never, I> => fromEffect(tag, tag)
891
891
 
892
892
  /** @internal */
893
893
  export const succeed = dual<
894
- <T extends Context.Tag<any, any>>(
895
- tag: T
894
+ <I, S>(
895
+ tag: Context.Tag<I, S>
896
896
  ) => (
897
- resource: Context.Tag.Service<T>
898
- ) => Layer.Layer<Context.Tag.Identifier<T>>,
899
- <T extends Context.Tag<any, any>>(
900
- tag: T,
901
- resource: Context.Tag.Service<T>
902
- ) => Layer.Layer<Context.Tag.Identifier<T>>
897
+ resource: Types.NoInfer<S>
898
+ ) => Layer.Layer<I>,
899
+ <I, S>(
900
+ tag: Context.Tag<I, S>,
901
+ resource: Types.NoInfer<S>
902
+ ) => Layer.Layer<I>
903
903
  >(2, (a, b) => {
904
904
  const tagFirst = Context.isTag(a)
905
905
  const tag = (tagFirst ? a : b) as Context.Tag<unknown, unknown>
@@ -929,15 +929,15 @@ export const suspend = <RIn, E, ROut>(
929
929
 
930
930
  /** @internal */
931
931
  export const sync = dual<
932
- <T extends Context.Tag<any, any>>(
933
- tag: T
932
+ <I, S>(
933
+ tag: Context.Tag<I, S>
934
934
  ) => (
935
- evaluate: LazyArg<Context.Tag.Service<T>>
936
- ) => Layer.Layer<Context.Tag.Identifier<T>>,
937
- <T extends Context.Tag<any, any>>(
938
- tag: T,
939
- evaluate: LazyArg<Context.Tag.Service<T>>
940
- ) => Layer.Layer<Context.Tag.Identifier<T>>
935
+ evaluate: LazyArg<Types.NoInfer<S>>
936
+ ) => Layer.Layer<I>,
937
+ <I, S>(
938
+ tag: Context.Tag<I, S>,
939
+ evaluate: LazyArg<Types.NoInfer<S>>
940
+ ) => Layer.Layer<I>
941
941
  >(2, (a, b) => {
942
942
  const tagFirst = Context.isTag(a)
943
943
  const tag = (tagFirst ? a : b) as Context.Tag<unknown, unknown>
@@ -32,7 +32,9 @@ declare namespace State {
32
32
  interface Entry<A, E> {
33
33
  readonly deferred: Deferred.Deferred<A, E>
34
34
  readonly scope: Scope.CloseableScope
35
+ readonly finalizer: Effect<void>
35
36
  fiber: RuntimeFiber<void, never> | undefined
37
+ expiresAt: number
36
38
  refCount: number
37
39
  }
38
40
  }
@@ -121,96 +123,100 @@ export const make: {
121
123
  export const get: {
122
124
  <K>(key: K): <A, E>(self: RcMap.RcMap<K, A, E>) => Effect<A, E, Scope.Scope>
123
125
  <K, A, E>(self: RcMap.RcMap<K, A, E>, key: K): Effect<A, E, Scope.Scope>
124
- } = dual(
125
- 2,
126
- <K, A, E>(self_: RcMap.RcMap<K, A, E>, key: K): Effect<A, E, Scope.Scope> => {
127
- const self = self_ as RcMapImpl<K, A, E>
128
- return core.uninterruptibleMask((restore) =>
129
- core.suspend(() => {
130
- if (self.state._tag === "Closed") {
131
- return core.interrupt
132
- }
133
- const state = self.state
134
- const o = MutableHashMap.get(state.map, key)
135
- if (o._tag === "Some") {
136
- const entry = o.value
137
- entry.refCount++
138
- return entry.fiber
139
- ? core.as(core.interruptFiber(entry.fiber), entry)
140
- : core.succeed(entry)
141
- } else if (Number.isFinite(self.capacity) && MutableHashMap.size(self.state.map) >= self.capacity) {
142
- return core.fail(
143
- new core.ExceededCapacityException(`RcMap attempted to exceed capacity of ${self.capacity}`)
144
- ) as Effect<never>
145
- }
146
- const acquire = self.lookup(key)
147
- return fiberRuntime.scopeMake().pipe(
148
- coreEffect.bindTo("scope"),
149
- coreEffect.bind("deferred", () => core.deferredMake<A, E>()),
150
- core.tap(({ deferred, scope }) =>
151
- restore(core.fiberRefLocally(
152
- acquire as Effect<A, E>,
153
- core.currentContext,
154
- Context.add(self.context, fiberRuntime.scopeTag, scope)
155
- )).pipe(
156
- core.exit,
157
- core.flatMap((exit) => core.deferredDone(deferred, exit)),
158
- circular.forkIn(scope)
159
- )
160
- ),
161
- core.map(({ deferred, scope }) => {
162
- const entry: State.Entry<A, E> = {
163
- deferred,
164
- scope,
165
- fiber: undefined,
166
- refCount: 1
167
- }
168
- MutableHashMap.set(state.map, key, entry)
169
- return entry
170
- })
171
- )
172
- }).pipe(
173
- self.semaphore.withPermits(1),
174
- coreEffect.bindTo("entry"),
175
- coreEffect.bind("scope", () => fiberRuntime.scopeTag),
176
- core.tap(({ entry, scope }) =>
177
- scope.addFinalizer(() =>
178
- core.suspend(() => {
179
- entry.refCount--
180
- if (entry.refCount > 0) {
181
- return core.void
182
- } else if (self.idleTimeToLive === undefined) {
183
- if (self.state._tag === "Open") {
184
- MutableHashMap.remove(self.state.map, key)
185
- }
186
- return core.scopeClose(entry.scope, core.exitVoid)
187
- }
188
- return coreEffect.sleep(self.idleTimeToLive).pipe(
189
- core.interruptible,
190
- core.zipRight(core.suspend(() => {
191
- if (self.state._tag === "Open" && entry.refCount === 0) {
192
- MutableHashMap.remove(self.state.map, key)
193
- return core.scopeClose(entry.scope, core.exitVoid)
194
- }
195
- return core.void
196
- })),
197
- fiberRuntime.ensuring(core.sync(() => {
198
- entry.fiber = undefined
199
- })),
200
- circular.forkIn(self.scope),
201
- core.tap((fiber) => {
202
- entry.fiber = fiber
203
- }),
204
- self.semaphore.withPermits(1)
205
- )
206
- })
207
- )
208
- ),
209
- core.flatMap(({ entry }) => restore(core.deferredAwait(entry.deferred)))
210
- )
211
- )
126
+ } = dual(2, <K, A, E>(self_: RcMap.RcMap<K, A, E>, key: K): Effect<A, E, Scope.Scope> => {
127
+ const self = self_ as RcMapImpl<K, A, E>
128
+ return core.uninterruptibleMask((restore) => getImpl(self, key, restore as any))
129
+ })
130
+
131
+ const getImpl = core.fnUntraced(function*<K, A, E>(self: RcMapImpl<K, A, E>, key: K, restore: <A>(a: A) => A) {
132
+ if (self.state._tag === "Closed") {
133
+ return yield* core.interrupt
212
134
  }
213
- )
135
+ const state = self.state
136
+ const o = MutableHashMap.get(state.map, key)
137
+ let entry: State.Entry<A, E>
138
+ if (o._tag === "Some") {
139
+ entry = o.value
140
+ entry.refCount++
141
+ } else if (Number.isFinite(self.capacity) && MutableHashMap.size(self.state.map) >= self.capacity) {
142
+ return yield* core.fail(
143
+ new core.ExceededCapacityException(`RcMap attempted to exceed capacity of ${self.capacity}`)
144
+ ) as Effect<never>
145
+ } else {
146
+ entry = yield* self.semaphore.withPermits(1)(acquire(self, key, restore))
147
+ }
148
+ const scope = yield* fiberRuntime.scopeTag
149
+ yield* scope.addFinalizer(() => entry.finalizer)
150
+ return yield* restore(core.deferredAwait(entry.deferred))
151
+ })
152
+
153
+ const acquire = core.fnUntraced(function*<K, A, E>(self: RcMapImpl<K, A, E>, key: K, restore: <A>(a: A) => A) {
154
+ const scope = yield* fiberRuntime.scopeMake()
155
+ const deferred = yield* core.deferredMake<A, E>()
156
+ const acquire = self.lookup(key)
157
+ yield* restore(core.fiberRefLocally(
158
+ acquire as Effect<A, E>,
159
+ core.currentContext,
160
+ Context.add(self.context, fiberRuntime.scopeTag, scope)
161
+ )).pipe(
162
+ core.exit,
163
+ core.flatMap((exit) => core.deferredDone(deferred, exit)),
164
+ circular.forkIn(scope)
165
+ )
166
+ const entry: State.Entry<A, E> = {
167
+ deferred,
168
+ scope,
169
+ finalizer: undefined as any,
170
+ fiber: undefined,
171
+ expiresAt: 0,
172
+ refCount: 1
173
+ }
174
+ ;(entry as any).finalizer = release(self, key, entry)
175
+ if (self.state._tag === "Open") {
176
+ MutableHashMap.set(self.state.map, key, entry)
177
+ }
178
+ return entry
179
+ })
180
+
181
+ const release = <K, A, E>(self: RcMapImpl<K, A, E>, key: K, entry: State.Entry<A, E>) =>
182
+ coreEffect.clockWith((clock) => {
183
+ entry.refCount--
184
+ if (entry.refCount > 0) {
185
+ return core.void
186
+ } else if (
187
+ self.state._tag === "Closed"
188
+ || !MutableHashMap.has(self.state.map, key)
189
+ || self.idleTimeToLive === undefined
190
+ ) {
191
+ if (self.state._tag === "Open") {
192
+ MutableHashMap.remove(self.state.map, key)
193
+ }
194
+ return core.scopeClose(entry.scope, core.exitVoid)
195
+ }
196
+
197
+ entry.expiresAt = clock.unsafeCurrentTimeMillis() + Duration.toMillis(self.idleTimeToLive)
198
+ if (entry.fiber) return core.void
199
+
200
+ return core.interruptibleMask(function loop(restore): Effect<void> {
201
+ const now = clock.unsafeCurrentTimeMillis()
202
+ const remaining = entry.expiresAt - now
203
+ if (remaining <= 0) {
204
+ if (self.state._tag === "Closed" || entry.refCount > 0) return core.void
205
+ MutableHashMap.remove(self.state.map, key)
206
+ return restore(core.scopeClose(entry.scope, core.exitVoid))
207
+ }
208
+ return core.flatMap(clock.sleep(Duration.millis(remaining)), () => loop(restore))
209
+ }).pipe(
210
+ fiberRuntime.ensuring(core.sync(() => {
211
+ entry.fiber = undefined
212
+ })),
213
+ circular.forkIn(self.scope),
214
+ core.tap((fiber) => {
215
+ entry.fiber = fiber
216
+ }),
217
+ self.semaphore.withPermits(1)
218
+ )
219
+ })
214
220
 
215
221
  /** @internal */
216
222
  export const keys = <K, A, E>(self: RcMap.RcMap<K, A, E>): Effect<Array<K>> => {
@@ -219,3 +225,39 @@ export const keys = <K, A, E>(self: RcMap.RcMap<K, A, E>): Effect<Array<K>> => {
219
225
  impl.state._tag === "Closed" ? core.interrupt : core.succeed(MutableHashMap.keys(impl.state.map))
220
226
  )
221
227
  }
228
+
229
+ /** @internal */
230
+ export const invalidate: {
231
+ <K>(key: K): <A, E>(self: RcMap.RcMap<K, A, E>) => Effect<void>
232
+ <K, A, E>(self: RcMap.RcMap<K, A, E>, key: K): Effect<void>
233
+ } = dual(
234
+ 2,
235
+ core.fnUntraced(function*<K, A, E>(self_: RcMap.RcMap<K, A, E>, key: K) {
236
+ const self = self_ as RcMapImpl<K, A, E>
237
+ if (self.state._tag === "Closed") return
238
+ const o = MutableHashMap.get(self.state.map, key)
239
+ if (o._tag === "None") return
240
+ const entry = o.value
241
+ MutableHashMap.remove(self.state.map, key)
242
+ if (entry.refCount > 0) return
243
+ yield* core.scopeClose(entry.scope, core.exitVoid)
244
+ if (entry.fiber) yield* core.interruptFiber(entry.fiber)
245
+ })
246
+ )
247
+
248
+ /** @internal */
249
+ export const touch: {
250
+ <K>(key: K): <A, E>(self: RcMap.RcMap<K, A, E>) => Effect<void>
251
+ <K, A, E>(self: RcMap.RcMap<K, A, E>, key: K): Effect<void>
252
+ } = dual(
253
+ 2,
254
+ <K, A, E>(self_: RcMap.RcMap<K, A, E>, key: K) =>
255
+ coreEffect.clockWith((clock) => {
256
+ const self = self_ as RcMapImpl<K, A, E>
257
+ if (!self.idleTimeToLive || self.state._tag === "Closed") return core.void
258
+ const o = MutableHashMap.get(self.state.map, key)
259
+ if (o._tag === "None") return core.void
260
+ o.value.expiresAt = clock.unsafeCurrentTimeMillis() + Duration.toMillis(self.idleTimeToLive)
261
+ return core.void
262
+ })
263
+ )
@@ -25,13 +25,13 @@ const reloadableVariance = {
25
25
  }
26
26
 
27
27
  /** @internal */
28
- export const auto = <Out extends Context.Tag<any, any>, E, In, R>(
29
- tag: Out,
28
+ export const auto = <I, S, E, In, R>(
29
+ tag: Context.Tag<I, S>,
30
30
  options: {
31
- readonly layer: Layer.Layer<Context.Tag.Identifier<Out>, E, In>
31
+ readonly layer: Layer.Layer<I, E, In>
32
32
  readonly schedule: Schedule.Schedule<unknown, unknown, R>
33
33
  }
34
- ): Layer.Layer<Reloadable.Reloadable<Context.Tag.Identifier<Out>>, E, R | In> =>
34
+ ): Layer.Layer<Reloadable.Reloadable<I>, E, R | In> =>
35
35
  layer_.scoped(
36
36
  reloadableTag(tag),
37
37
  pipe(
@@ -52,13 +52,13 @@ export const auto = <Out extends Context.Tag<any, any>, E, In, R>(
52
52
  )
53
53
 
54
54
  /** @internal */
55
- export const autoFromConfig = <Out extends Context.Tag<any, any>, E, In, R>(
56
- tag: Out,
55
+ export const autoFromConfig = <I, S, E, In, R>(
56
+ tag: Context.Tag<I, S>,
57
57
  options: {
58
- readonly layer: Layer.Layer<Context.Tag.Identifier<Out>, E, In>
58
+ readonly layer: Layer.Layer<I, E, In>
59
59
  readonly scheduleFromConfig: (context: Context.Context<In>) => Schedule.Schedule<unknown, unknown, R>
60
60
  }
61
- ): Layer.Layer<Reloadable.Reloadable<Context.Tag.Identifier<Out>>, E, R | In> =>
61
+ ): Layer.Layer<Reloadable.Reloadable<I>, E, R | In> =>
62
62
  layer_.scoped(
63
63
  reloadableTag(tag),
64
64
  pipe(
@@ -76,21 +76,21 @@ export const autoFromConfig = <Out extends Context.Tag<any, any>, E, In, R>(
76
76
  )
77
77
 
78
78
  /** @internal */
79
- export const get = <T extends Context.Tag<any, any>>(
80
- tag: T
81
- ): Effect.Effect<Context.Tag.Service<T>, never, Reloadable.Reloadable<Context.Tag.Identifier<T>>> =>
79
+ export const get = <I, S>(
80
+ tag: Context.Tag<I, S>
81
+ ): Effect.Effect<S, never, Reloadable.Reloadable<I>> =>
82
82
  core.flatMap(
83
83
  reloadableTag(tag),
84
84
  (reloadable) => scopedRef.get(reloadable.scopedRef)
85
85
  )
86
86
 
87
87
  /** @internal */
88
- export const manual = <Out extends Context.Tag<any, any>, In, E>(
89
- tag: Out,
88
+ export const manual = <I, S, In, E>(
89
+ tag: Context.Tag<I, S>,
90
90
  options: {
91
- readonly layer: Layer.Layer<Context.Tag.Identifier<Out>, E, In>
91
+ readonly layer: Layer.Layer<I, E, In>
92
92
  }
93
- ): Layer.Layer<Reloadable.Reloadable<Context.Tag.Identifier<Out>>, E, In> =>
93
+ ): Layer.Layer<Reloadable.Reloadable<I>, E, In> =>
94
94
  layer_.scoped(
95
95
  reloadableTag(tag),
96
96
  pipe(
@@ -112,28 +112,25 @@ export const manual = <Out extends Context.Tag<any, any>, In, E>(
112
112
  )
113
113
 
114
114
  /** @internal */
115
- export const reloadableTag = <T extends Context.Tag<any, any>>(
116
- tag: T
117
- ): Context.Tag<Reloadable.Reloadable<Context.Tag.Identifier<T>>, Reloadable.Reloadable<Context.Tag.Service<T>>> => {
118
- return Context.GenericTag<
119
- Reloadable.Reloadable<Context.Tag.Identifier<T>>,
120
- Reloadable.Reloadable<Context.Tag.Service<T>>
121
- >(`effect/Reloadable<${tag.key}>`)
115
+ export const reloadableTag = <I, S>(
116
+ tag: Context.Tag<I, S>
117
+ ): Context.Tag<Reloadable.Reloadable<I>, Reloadable.Reloadable<S>> => {
118
+ return Context.GenericTag<Reloadable.Reloadable<I>, Reloadable.Reloadable<S>>(`effect/Reloadable<${tag.key}>`)
122
119
  }
123
120
 
124
121
  /** @internal */
125
- export const reload = <T extends Context.Tag<any, any>>(
126
- tag: T
127
- ): Effect.Effect<void, unknown, Reloadable.Reloadable<Context.Tag.Identifier<T>>> =>
122
+ export const reload = <I, S>(
123
+ tag: Context.Tag<I, S>
124
+ ): Effect.Effect<void, unknown, Reloadable.Reloadable<I>> =>
128
125
  core.flatMap(
129
126
  reloadableTag(tag),
130
127
  (reloadable) => reloadable.reload
131
128
  )
132
129
 
133
130
  /** @internal */
134
- export const reloadFork = <T extends Context.Tag<any, any>>(
135
- tag: T
136
- ): Effect.Effect<void, unknown, Reloadable.Reloadable<Context.Tag.Identifier<T>>> =>
131
+ export const reloadFork = <I, S>(
132
+ tag: Context.Tag<I, S>
133
+ ): Effect.Effect<void, unknown, Reloadable.Reloadable<I>> =>
137
134
  core.flatMap(reloadableTag(tag), (reloadable) =>
138
135
  pipe(
139
136
  reloadable.reload,
@@ -1116,22 +1116,22 @@ export const provideContext = dual<
1116
1116
 
1117
1117
  /** @internal */
1118
1118
  export const provideService = dual<
1119
- <T extends Context.Tag<any, any>>(
1120
- tag: T,
1121
- service: Context.Tag.Service<T>
1119
+ <I, S>(
1120
+ tag: Context.Tag<I, S>,
1121
+ service: Types.NoInfer<S>
1122
1122
  ) => <Out, In, R>(
1123
1123
  self: Schedule.Schedule<Out, In, R>
1124
- ) => Schedule.Schedule<Out, In, Exclude<R, Context.Tag.Identifier<T>>>,
1125
- <Out, In, R, T extends Context.Tag<any, any>>(
1124
+ ) => Schedule.Schedule<Out, In, Exclude<R, I>>,
1125
+ <Out, In, R, I, S>(
1126
1126
  self: Schedule.Schedule<Out, In, R>,
1127
- tag: T,
1128
- service: Context.Tag.Service<T>
1129
- ) => Schedule.Schedule<Out, In, Exclude<R, Context.Tag.Identifier<T>>>
1130
- >(3, <Out, In, R, T extends Context.Tag<any, any>>(
1127
+ tag: Context.Tag<I, S>,
1128
+ service: Types.NoInfer<S>
1129
+ ) => Schedule.Schedule<Out, In, Exclude<R, I>>
1130
+ >(3, <Out, In, R, I, S>(
1131
1131
  self: Schedule.Schedule<Out, In, R>,
1132
- tag: T,
1133
- service: Context.Tag.Service<T>
1134
- ): Schedule.Schedule<Out, In, Exclude<R, Context.Tag.Identifier<T>>> =>
1132
+ tag: Context.Tag<I, S>,
1133
+ service: Types.NoInfer<S>
1134
+ ): Schedule.Schedule<Out, In, Exclude<R, I>> =>
1135
1135
  makeWithState(self.initial, (now, input, state) =>
1136
1136
  core.contextWithEffect((env) =>
1137
1137
  core.provideContext(
@@ -1362,19 +1362,25 @@ export const tapInput = dual<
1362
1362
 
1363
1363
  /** @internal */
1364
1364
  export const tapOutput = dual<
1365
- <XO extends Out, X, R2, Out>(
1366
- f: (out: XO) => Effect.Effect<X, never, R2>
1367
- ) => <In, R>(self: Schedule.Schedule<Out, In, R>) => Schedule.Schedule<Out, In, R | R2>,
1368
- <Out, In, R, XO extends Out, X, R2>(
1365
+ <X, R2, Out>(
1366
+ f: (out: Types.NoInfer<Out>) => Effect.Effect<X, never, R2>
1367
+ ) => <In, R>(self: Schedule.Schedule<Out, In, R>) => Schedule.Schedule<Out, In, R2 | R>,
1368
+ <Out, In, R, X, R2>(
1369
1369
  self: Schedule.Schedule<Out, In, R>,
1370
- f: (out: XO) => Effect.Effect<X, never, R2>
1370
+ f: (out: Out) => Effect.Effect<X, never, R2>
1371
1371
  ) => Schedule.Schedule<Out, In, R | R2>
1372
- >(2, (self, f) =>
1373
- makeWithState(self.initial, (now, input, state) =>
1374
- core.tap(
1375
- self.step(now, input, state),
1376
- ([, out]) => f(out as any)
1377
- )))
1372
+ >(
1373
+ 2,
1374
+ <Out, In, R, X, R2>(
1375
+ self: Schedule.Schedule<Out, In, R>,
1376
+ f: (out: Out) => Effect.Effect<X, never, R2>
1377
+ ): Schedule.Schedule<Out, In, R | R2> =>
1378
+ makeWithState(self.initial, (now, input, state) =>
1379
+ core.tap(
1380
+ self.step(now, input, state),
1381
+ ([, out]) => f(out)
1382
+ ))
1383
+ )
1378
1384
 
1379
1385
  /** @internal */
1380
1386
  export const unfold = <A>(initial: A, f: (a: A) => A): Schedule.Schedule<A> =>
@@ -21,6 +21,7 @@ import * as Queue from "../Queue.js"
21
21
  import * as Ref from "../Ref.js"
22
22
  import * as Scope from "../Scope.js"
23
23
  import type * as Sink from "../Sink.js"
24
+ import type * as Types from "../Types.js"
24
25
  import * as channel from "./channel.js"
25
26
  import * as mergeDecision from "./channel/mergeDecision.js"
26
27
  import * as core from "./core-stream.js"
@@ -1739,27 +1740,27 @@ export const refineOrDieWith = dual<
1739
1740
  )
1740
1741
 
1741
1742
  /** @internal */
1742
- export const service = <T extends Context.Tag<any, any>>(
1743
- tag: T
1744
- ): Sink.Sink<Context.Tag.Service<T>, unknown, never, never, Context.Tag.Identifier<T>> => serviceWith(tag, identity)
1743
+ export const service = <I, S>(
1744
+ tag: Context.Tag<I, S>
1745
+ ): Sink.Sink<S, unknown, never, never, I> => serviceWith(tag, identity)
1745
1746
 
1746
1747
  /** @internal */
1747
- export const serviceWith = <T extends Context.Tag<any, any>, Z>(
1748
- tag: T,
1749
- f: (service: Context.Tag.Service<T>) => Z
1750
- ): Sink.Sink<Z, unknown, never, never, Context.Tag.Identifier<T>> => fromEffect(Effect.map(tag, f))
1748
+ export const serviceWith = <I, S, Z>(
1749
+ tag: Context.Tag<I, S>,
1750
+ f: (service: Types.NoInfer<S>) => Z
1751
+ ): Sink.Sink<Z, unknown, never, never, I> => fromEffect(Effect.map(tag, f))
1751
1752
 
1752
1753
  /** @internal */
1753
- export const serviceWithEffect = <T extends Context.Tag<any, any>, R, E, Z>(
1754
- tag: T,
1755
- f: (service: Context.Tag.Service<T>) => Effect.Effect<Z, E, R>
1756
- ): Sink.Sink<Z, unknown, never, E, R | Context.Tag.Identifier<T>> => fromEffect(Effect.flatMap(tag, f))
1754
+ export const serviceWithEffect = <I, S, R, E, Z>(
1755
+ tag: Context.Tag<I, S>,
1756
+ f: (service: Types.NoInfer<S>) => Effect.Effect<Z, E, R>
1757
+ ): Sink.Sink<Z, unknown, never, E, R | I> => fromEffect(Effect.flatMap(tag, f))
1757
1758
 
1758
1759
  /** @internal */
1759
- export const serviceWithSink = <T extends Context.Tag<any, any>, R, E, In, L, Z>(
1760
- tag: T,
1761
- f: (service: Context.Tag.Service<T>) => Sink.Sink<Z, In, L, E, R>
1762
- ): Sink.Sink<Z, In, L, E, R | Context.Tag.Identifier<T>> =>
1760
+ export const serviceWithSink = <I, S, R, E, In, L, Z>(
1761
+ tag: Context.Tag<I, S>,
1762
+ f: (service: Types.NoInfer<S>) => Sink.Sink<Z, In, L, E, R>
1763
+ ): Sink.Sink<Z, In, L, E, R | I> =>
1763
1764
  new SinkImpl(pipe(Effect.map(tag, (service) => toChannel(f(service))), channel.unwrap))
1764
1765
 
1765
1766
  /** @internal */