From b95558e3d6183fe3310982707c7c17b73da1c6ff Mon Sep 17 00:00:00 2001 From: Michael Arnaldi Date: Thu, 26 Sep 2024 18:10:00 +0200 Subject: [PATCH] Support providing an array of layers via Effect.provide --- .changeset/old-ways-accept.md | 5 ++++ packages/effect/src/Effect.ts | 21 ++++++++++++++- packages/effect/src/internal/layer.ts | 30 +++++++++++++++++++-- packages/effect/test/Effect/service.test.ts | 6 ++++- 4 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 .changeset/old-ways-accept.md diff --git a/.changeset/old-ways-accept.md b/.changeset/old-ways-accept.md new file mode 100644 index 0000000000..dc0e95f028 --- /dev/null +++ b/.changeset/old-ways-accept.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +Support providing an array of layers via Effect.provide diff --git a/packages/effect/src/Effect.ts b/packages/effect/src/Effect.ts index 2da939a9cb..cc1478b3de 100644 --- a/packages/effect/src/Effect.ts +++ b/packages/effect/src/Effect.ts @@ -3325,11 +3325,30 @@ export const mapInputContext: { * @category context */ export const provide: { + , ...Array>]>( + layers: Layers + ): ( + self: Effect + ) => Effect< + A, + E | { [k in keyof Layers]: Layer.Layer.Error }[number], + | { [k in keyof Layers]: Layer.Layer.Context }[number] + | Exclude }[number]> + > ( layer: Layer.Layer - ): (self: Effect) => Effect> + ): (self: Effect) => Effect> (context: Context.Context): (self: Effect) => Effect> (runtime: Runtime.Runtime): (self: Effect) => Effect> + , ...Array>]>( + self: Effect, + layers: Layers + ): Effect< + A, + E | { [k in keyof Layers]: Layer.Layer.Error }[number], + | { [k in keyof Layers]: Layer.Layer.Context }[number] + | Exclude }[number]> + > ( self: Effect, layer: Layer.Layer diff --git a/packages/effect/src/internal/layer.ts b/packages/effect/src/internal/layer.ts index dd6786ab5f..b6b6583001 100644 --- a/packages/effect/src/internal/layer.ts +++ b/packages/effect/src/internal/layer.ts @@ -1291,6 +1291,16 @@ const provideSomeRuntime = dual< /** @internal */ export const effect_provide = dual< { + , ...Array>]>( + layers: Layers + ): ( + self: Effect.Effect + ) => Effect.Effect< + A, + E | { [k in keyof Layers]: Layer.Layer.Error }[number], + | { [k in keyof Layers]: Layer.Layer.Context }[number] + | Exclude }[number]> + > ( layer: Layer.Layer ): (self: Effect.Effect) => Effect.Effect> @@ -1302,6 +1312,15 @@ export const effect_provide = dual< ): (self: Effect.Effect) => Effect.Effect> }, { + , ...Array>]>( + self: Effect.Effect, + layers: Layers + ): Effect.Effect< + A, + E | { [k in keyof Layers]: Layer.Layer.Error }[number], + | { [k in keyof Layers]: Layer.Layer.Context }[number] + | Exclude }[number]> + > ( self: Effect.Effect, layer: Layer.Layer @@ -1319,9 +1338,16 @@ export const effect_provide = dual< 2, ( self: Effect.Effect, - source: Layer.Layer | Context.Context | Runtime.Runtime + source: + | Layer.Layer + | Context.Context + | Runtime.Runtime + | Array> ): Effect.Effect> => - isLayer(source) + Array.isArray(source) + // @ts-expect-error + ? provideSomeLayer(self, mergeAll(...source)) : + isLayer(source) ? provideSomeLayer(self, source as Layer.Layer) : Context.isContext(source) ? core.provideSomeContext(self, source) diff --git a/packages/effect/test/Effect/service.test.ts b/packages/effect/test/Effect/service.test.ts index 8fc9315436..6f576c994f 100644 --- a/packages/effect/test/Effect/service.test.ts +++ b/packages/effect/test/Effect/service.test.ts @@ -34,7 +34,11 @@ describe("Effect", () => { expect(_tag).toEqual("Logger") yield* Logger.info("Ok") expect(messages).toEqual(["[PRE][Ok][POST]"]) + const { prefix } = yield* Prefix + expect(prefix).toEqual("PRE") + const { postfix } = yield* Postfix + expect(postfix).toEqual("POST") }).pipe( - Effect.provide(Logger) + Effect.provide([Logger, Prefix, Postfix]) )) })