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.
- package/README.md +38 -49
- package/dist/cjs/Channel.js.map +1 -1
- package/dist/cjs/DateTime.js +17 -1
- package/dist/cjs/DateTime.js.map +1 -1
- package/dist/cjs/Differ.js.map +1 -1
- package/dist/cjs/Duration.js +128 -1
- package/dist/cjs/Duration.js.map +1 -1
- package/dist/cjs/Effect.js +175 -37
- package/dist/cjs/Effect.js.map +1 -1
- package/dist/cjs/Either.js +2 -1
- package/dist/cjs/Either.js.map +1 -1
- package/dist/cjs/FiberHandle.js +54 -21
- package/dist/cjs/FiberHandle.js.map +1 -1
- package/dist/cjs/FiberMap.js +51 -24
- package/dist/cjs/FiberMap.js.map +1 -1
- package/dist/cjs/FiberSet.js +50 -17
- package/dist/cjs/FiberSet.js.map +1 -1
- package/dist/cjs/HashMap.js +19 -1
- package/dist/cjs/HashMap.js.map +1 -1
- package/dist/cjs/HashSet.js +9 -1
- package/dist/cjs/HashSet.js.map +1 -1
- package/dist/cjs/Layer.js +21 -1
- package/dist/cjs/Layer.js.map +1 -1
- package/dist/cjs/Match.js +659 -38
- package/dist/cjs/Match.js.map +1 -1
- package/dist/cjs/RcMap.js +11 -1
- package/dist/cjs/RcMap.js.map +1 -1
- package/dist/cjs/Reloadable.js.map +1 -1
- package/dist/cjs/STM.js.map +1 -1
- package/dist/cjs/Schedule.js +1074 -309
- package/dist/cjs/Schedule.js.map +1 -1
- package/dist/cjs/Schema.js +73 -1
- package/dist/cjs/Schema.js.map +1 -1
- package/dist/cjs/Stream.js.map +1 -1
- package/dist/cjs/internal/channel.js.map +1 -1
- package/dist/cjs/internal/core-effect.js.map +1 -1
- package/dist/cjs/internal/core.js +27 -3
- package/dist/cjs/internal/core.js.map +1 -1
- package/dist/cjs/internal/dateTime.js +4 -1
- package/dist/cjs/internal/dateTime.js.map +1 -1
- package/dist/cjs/internal/differ.js +4 -0
- package/dist/cjs/internal/differ.js.map +1 -1
- package/dist/cjs/internal/effect/circular.js +3 -2
- package/dist/cjs/internal/effect/circular.js.map +1 -1
- package/dist/cjs/internal/fiberRuntime.js +21 -7
- package/dist/cjs/internal/fiberRuntime.js.map +1 -1
- package/dist/cjs/internal/hashMap.js +10 -1
- package/dist/cjs/internal/hashMap.js.map +1 -1
- package/dist/cjs/internal/keyedPool.js +1 -1
- package/dist/cjs/internal/keyedPool.js.map +1 -1
- package/dist/cjs/internal/layer.js.map +1 -1
- package/dist/cjs/internal/rcMap.js +86 -56
- package/dist/cjs/internal/rcMap.js.map +1 -1
- package/dist/cjs/internal/reloadable.js.map +1 -1
- package/dist/cjs/internal/schedule.js.map +1 -1
- package/dist/cjs/internal/sink.js.map +1 -1
- package/dist/cjs/internal/stm/stm.js.map +1 -1
- package/dist/cjs/internal/stream.js.map +1 -1
- package/dist/cjs/internal/version.js +1 -1
- package/dist/cjs/internal/version.js.map +1 -1
- package/dist/dts/Channel.d.ts +4 -4
- package/dist/dts/Channel.d.ts.map +1 -1
- package/dist/dts/DateTime.d.ts +16 -0
- package/dist/dts/DateTime.d.ts.map +1 -1
- package/dist/dts/Differ.d.ts +2 -1
- package/dist/dts/Differ.d.ts.map +1 -1
- package/dist/dts/Duration.d.ts +64 -0
- package/dist/dts/Duration.d.ts.map +1 -1
- package/dist/dts/Effect.d.ts +402 -30
- package/dist/dts/Effect.d.ts.map +1 -1
- package/dist/dts/Either.d.ts +7 -0
- package/dist/dts/Either.d.ts.map +1 -1
- package/dist/dts/FiberHandle.d.ts +26 -0
- package/dist/dts/FiberHandle.d.ts.map +1 -1
- package/dist/dts/FiberMap.d.ts +26 -0
- package/dist/dts/FiberMap.d.ts.map +1 -1
- package/dist/dts/FiberSet.d.ts +25 -0
- package/dist/dts/FiberSet.d.ts.map +1 -1
- package/dist/dts/HashMap.d.ts +38 -0
- package/dist/dts/HashMap.d.ts.map +1 -1
- package/dist/dts/HashSet.d.ts +7 -0
- package/dist/dts/HashSet.d.ts.map +1 -1
- package/dist/dts/Layer.d.ts +32 -13
- package/dist/dts/Layer.d.ts.map +1 -1
- package/dist/dts/Match.d.ts +731 -48
- package/dist/dts/Match.d.ts.map +1 -1
- package/dist/dts/RcMap.d.ts +32 -0
- package/dist/dts/RcMap.d.ts.map +1 -1
- package/dist/dts/Reloadable.d.ts +13 -13
- package/dist/dts/Reloadable.d.ts.map +1 -1
- package/dist/dts/STM.d.ts +4 -4
- package/dist/dts/STM.d.ts.map +1 -1
- package/dist/dts/Schedule.d.ts +2294 -633
- package/dist/dts/Schedule.d.ts.map +1 -1
- package/dist/dts/Schema.d.ts +40 -4
- package/dist/dts/Schema.d.ts.map +1 -1
- package/dist/dts/Stream.d.ts +8 -8
- package/dist/dts/Stream.d.ts.map +1 -1
- package/dist/dts/Trie.d.ts +7 -7
- package/dist/dts/Trie.d.ts.map +1 -1
- package/dist/dts/index.d.ts +25 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/stm/stm.d.ts +2 -2
- package/dist/dts/internal/stm/stm.d.ts.map +1 -1
- package/dist/esm/Channel.js.map +1 -1
- package/dist/esm/DateTime.js +16 -0
- package/dist/esm/DateTime.js.map +1 -1
- package/dist/esm/Differ.js.map +1 -1
- package/dist/esm/Duration.js +124 -0
- package/dist/esm/Duration.js.map +1 -1
- package/dist/esm/Effect.js +170 -32
- package/dist/esm/Effect.js.map +1 -1
- package/dist/esm/Either.js +7 -0
- package/dist/esm/Either.js.map +1 -1
- package/dist/esm/FiberHandle.js +48 -18
- package/dist/esm/FiberHandle.js.map +1 -1
- package/dist/esm/FiberMap.js +46 -22
- package/dist/esm/FiberMap.js.map +1 -1
- package/dist/esm/FiberSet.js +45 -15
- package/dist/esm/FiberSet.js.map +1 -1
- package/dist/esm/HashMap.js +17 -0
- package/dist/esm/HashMap.js.map +1 -1
- package/dist/esm/HashSet.js +7 -0
- package/dist/esm/HashSet.js.map +1 -1
- package/dist/esm/Layer.js +20 -0
- package/dist/esm/Layer.js.map +1 -1
- package/dist/esm/Match.js +665 -40
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/RcMap.js +10 -0
- package/dist/esm/RcMap.js.map +1 -1
- package/dist/esm/Reloadable.js.map +1 -1
- package/dist/esm/STM.js.map +1 -1
- package/dist/esm/Schedule.js +1074 -309
- package/dist/esm/Schedule.js.map +1 -1
- package/dist/esm/Schema.js +71 -0
- package/dist/esm/Schema.js.map +1 -1
- package/dist/esm/Stream.js.map +1 -1
- package/dist/esm/index.js +25 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/channel.js.map +1 -1
- package/dist/esm/internal/core-effect.js.map +1 -1
- package/dist/esm/internal/core.js +23 -0
- package/dist/esm/internal/core.js.map +1 -1
- package/dist/esm/internal/dateTime.js +2 -0
- package/dist/esm/internal/dateTime.js.map +1 -1
- package/dist/esm/internal/differ.js +4 -0
- package/dist/esm/internal/differ.js.map +1 -1
- package/dist/esm/internal/effect/circular.js +3 -2
- package/dist/esm/internal/effect/circular.js.map +1 -1
- package/dist/esm/internal/fiberRuntime.js +18 -5
- package/dist/esm/internal/fiberRuntime.js.map +1 -1
- package/dist/esm/internal/hashMap.js +9 -0
- package/dist/esm/internal/hashMap.js.map +1 -1
- package/dist/esm/internal/keyedPool.js +1 -1
- package/dist/esm/internal/keyedPool.js.map +1 -1
- package/dist/esm/internal/layer.js.map +1 -1
- package/dist/esm/internal/rcMap.js +85 -55
- package/dist/esm/internal/rcMap.js.map +1 -1
- package/dist/esm/internal/reloadable.js.map +1 -1
- package/dist/esm/internal/schedule.js.map +1 -1
- package/dist/esm/internal/sink.js.map +1 -1
- package/dist/esm/internal/stm/stm.js.map +1 -1
- package/dist/esm/internal/stream.js.map +1 -1
- package/dist/esm/internal/version.js +1 -1
- package/dist/esm/internal/version.js.map +1 -1
- package/package.json +2 -1
- package/src/Channel.ts +14 -17
- package/src/DateTime.ts +17 -8
- package/src/Differ.ts +2 -1
- package/src/Duration.ts +147 -0
- package/src/Effect.ts +528 -140
- package/src/Either.ts +9 -0
- package/src/FiberHandle.ts +95 -35
- package/src/FiberMap.ts +104 -39
- package/src/FiberSet.ts +93 -24
- package/src/HashMap.ts +40 -0
- package/src/HashSet.ts +8 -0
- package/src/Layer.ts +94 -40
- package/src/Match.ts +733 -49
- package/src/RcMap.ts +34 -0
- package/src/Reloadable.ts +17 -27
- package/src/STM.ts +10 -17
- package/src/Schedule.ts +2325 -653
- package/src/Schema.ts +81 -4
- package/src/Stream.ts +26 -33
- package/src/Trie.ts +7 -7
- package/src/index.ts +25 -0
- package/src/internal/channel.ts +37 -39
- package/src/internal/core-effect.ts +84 -84
- package/src/internal/core.ts +80 -0
- package/src/internal/dateTime.ts +3 -0
- package/src/internal/differ.ts +4 -0
- package/src/internal/effect/circular.ts +3 -2
- package/src/internal/fiberRuntime.ts +31 -6
- package/src/internal/hashMap.ts +16 -0
- package/src/internal/keyedPool.ts +1 -1
- package/src/internal/layer.ts +52 -52
- package/src/internal/rcMap.ts +131 -89
- package/src/internal/reloadable.ts +25 -28
- package/src/internal/schedule.ts +29 -23
- package/src/internal/sink.ts +16 -15
- package/src/internal/stm/stm.ts +54 -46
- package/src/internal/stream.ts +100 -100
- package/src/internal/version.ts +1 -1
package/src/internal/layer.ts
CHANGED
|
@@ -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
|
-
<
|
|
546
|
-
tag:
|
|
546
|
+
<I, S>(
|
|
547
|
+
tag: Context.Tag<I, S>
|
|
547
548
|
) => <E, R>(
|
|
548
|
-
effect: Effect.Effect<
|
|
549
|
-
) => Layer.Layer<
|
|
550
|
-
<
|
|
551
|
-
tag:
|
|
552
|
-
effect: Effect.Effect<
|
|
553
|
-
) => Layer.Layer<
|
|
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 = <
|
|
614
|
-
tagA:
|
|
615
|
-
tagB:
|
|
616
|
-
f: (a:
|
|
617
|
-
): Layer.Layer<
|
|
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
|
-
<
|
|
765
|
-
tagA:
|
|
766
|
-
tagB:
|
|
767
|
-
f: (a:
|
|
768
|
-
) => <RIn, E>(self: Layer.Layer<
|
|
769
|
-
<RIn, E,
|
|
770
|
-
self: Layer.Layer<
|
|
771
|
-
tagA:
|
|
772
|
-
tagB:
|
|
773
|
-
f: (a:
|
|
774
|
-
) => Layer.Layer<
|
|
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
|
-
<
|
|
846
|
-
tag:
|
|
845
|
+
<I, S>(
|
|
846
|
+
tag: Context.Tag<I, S>
|
|
847
847
|
) => <E, R>(
|
|
848
|
-
effect: Effect.Effect<
|
|
849
|
-
) => Layer.Layer<
|
|
850
|
-
<
|
|
851
|
-
tag:
|
|
852
|
-
effect: Effect.Effect<
|
|
853
|
-
) => Layer.Layer<
|
|
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 = <
|
|
889
|
-
tag:
|
|
890
|
-
): Layer.Layer<
|
|
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
|
-
<
|
|
895
|
-
tag:
|
|
894
|
+
<I, S>(
|
|
895
|
+
tag: Context.Tag<I, S>
|
|
896
896
|
) => (
|
|
897
|
-
resource:
|
|
898
|
-
) => Layer.Layer<
|
|
899
|
-
<
|
|
900
|
-
tag:
|
|
901
|
-
resource:
|
|
902
|
-
) => Layer.Layer<
|
|
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
|
-
<
|
|
933
|
-
tag:
|
|
932
|
+
<I, S>(
|
|
933
|
+
tag: Context.Tag<I, S>
|
|
934
934
|
) => (
|
|
935
|
-
evaluate: LazyArg<
|
|
936
|
-
) => Layer.Layer<
|
|
937
|
-
<
|
|
938
|
-
tag:
|
|
939
|
-
evaluate: LazyArg<
|
|
940
|
-
) => Layer.Layer<
|
|
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>
|
package/src/internal/rcMap.ts
CHANGED
|
@@ -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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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 = <
|
|
29
|
-
tag:
|
|
28
|
+
export const auto = <I, S, E, In, R>(
|
|
29
|
+
tag: Context.Tag<I, S>,
|
|
30
30
|
options: {
|
|
31
|
-
readonly layer: Layer.Layer<
|
|
31
|
+
readonly layer: Layer.Layer<I, E, In>
|
|
32
32
|
readonly schedule: Schedule.Schedule<unknown, unknown, R>
|
|
33
33
|
}
|
|
34
|
-
): Layer.Layer<Reloadable.Reloadable<
|
|
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 = <
|
|
56
|
-
tag:
|
|
55
|
+
export const autoFromConfig = <I, S, E, In, R>(
|
|
56
|
+
tag: Context.Tag<I, S>,
|
|
57
57
|
options: {
|
|
58
|
-
readonly layer: Layer.Layer<
|
|
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<
|
|
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 = <
|
|
80
|
-
tag:
|
|
81
|
-
): Effect.Effect<
|
|
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 = <
|
|
89
|
-
tag:
|
|
88
|
+
export const manual = <I, S, In, E>(
|
|
89
|
+
tag: Context.Tag<I, S>,
|
|
90
90
|
options: {
|
|
91
|
-
readonly layer: Layer.Layer<
|
|
91
|
+
readonly layer: Layer.Layer<I, E, In>
|
|
92
92
|
}
|
|
93
|
-
): Layer.Layer<Reloadable.Reloadable<
|
|
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 = <
|
|
116
|
-
tag:
|
|
117
|
-
): Context.Tag<Reloadable.Reloadable<
|
|
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 = <
|
|
126
|
-
tag:
|
|
127
|
-
): Effect.Effect<void, unknown, Reloadable.Reloadable<
|
|
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 = <
|
|
135
|
-
tag:
|
|
136
|
-
): Effect.Effect<void, unknown, Reloadable.Reloadable<
|
|
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,
|
package/src/internal/schedule.ts
CHANGED
|
@@ -1116,22 +1116,22 @@ export const provideContext = dual<
|
|
|
1116
1116
|
|
|
1117
1117
|
/** @internal */
|
|
1118
1118
|
export const provideService = dual<
|
|
1119
|
-
<
|
|
1120
|
-
tag:
|
|
1121
|
-
service:
|
|
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,
|
|
1125
|
-
<Out, In, R,
|
|
1124
|
+
) => Schedule.Schedule<Out, In, Exclude<R, I>>,
|
|
1125
|
+
<Out, In, R, I, S>(
|
|
1126
1126
|
self: Schedule.Schedule<Out, In, R>,
|
|
1127
|
-
tag:
|
|
1128
|
-
service:
|
|
1129
|
-
) => Schedule.Schedule<Out, In, Exclude<R,
|
|
1130
|
-
>(3, <Out, In, R,
|
|
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:
|
|
1133
|
-
service:
|
|
1134
|
-
): Schedule.Schedule<Out, In, Exclude<R,
|
|
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
|
-
<
|
|
1366
|
-
f: (out:
|
|
1367
|
-
) => <In, R>(self: Schedule.Schedule<Out, In, R>) => Schedule.Schedule<Out, In,
|
|
1368
|
-
<Out, In, R,
|
|
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:
|
|
1370
|
+
f: (out: Out) => Effect.Effect<X, never, R2>
|
|
1371
1371
|
) => Schedule.Schedule<Out, In, R | R2>
|
|
1372
|
-
>(
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
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> =>
|
package/src/internal/sink.ts
CHANGED
|
@@ -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 = <
|
|
1743
|
-
tag:
|
|
1744
|
-
): Sink.Sink<
|
|
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 = <
|
|
1748
|
-
tag:
|
|
1749
|
-
f: (service:
|
|
1750
|
-
): Sink.Sink<Z, unknown, never, never,
|
|
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 = <
|
|
1754
|
-
tag:
|
|
1755
|
-
f: (service:
|
|
1756
|
-
): Sink.Sink<Z, unknown, never, E, R |
|
|
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 = <
|
|
1760
|
-
tag:
|
|
1761
|
-
f: (service:
|
|
1762
|
-
): Sink.Sink<Z, In, L, E, R |
|
|
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 */
|