Skip to content

Commit c53fb64

Browse files
committed
add contextMaker
1 parent f5cca5b commit c53fb64

2 files changed

Lines changed: 39 additions & 1 deletion

File tree

.changeset/slimy-beans-kiss.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@effect-app/infra": patch
3+
---
4+
5+
add contextMaker

packages/infra/src/api/routing.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,40 @@ export const RequestCacheLayers = Layer.mergeAll(
905905
Layer.setRequestBatching(true)
906906
)
907907

908+
type GetContext<T> = T extends Context.Context<infer Y> ? Y : never
909+
910+
export const contextMaker = <
911+
TDeps extends Array.NonEmptyReadonlyArray<
912+
& (
913+
| Context.Tag<any, Effect<Context.Context<any>, any, any> & { _tag: any }>
914+
| Context.Tag<any, Effect<Context.Context<any>, never, never> & { _tag: any }>
915+
)
916+
& {
917+
new(...args: any[]): any
918+
Default: Layer.Layer<Effect<Context.Context<any>> & { _tag: any }, any, any>
919+
}
920+
>
921+
>(...deps: TDeps): {
922+
dependencies: { [K in keyof TDeps]: TDeps[K]["Default"] }
923+
effect: Effect.Effect<
924+
Effect.Effect<
925+
Context.Context<GetContext<Effect.Success<InstanceType<TDeps[number]>>>>,
926+
Effect.Error<InstanceType<TDeps[number]>>,
927+
Effect.Context<InstanceType<TDeps[number]>>
928+
>,
929+
never,
930+
InstanceType<TDeps[number]>
931+
>
932+
} => ({
933+
dependencies: deps.map((_) => _.Default) as any,
934+
effect: Effect.gen(function*() {
935+
const services = yield* Effect.all(deps)
936+
return Effect.all(services as any[]).pipe(
937+
Effect.map((_) => Context.mergeAll(..._ as any))
938+
)
939+
}) as any
940+
})
941+
908942
export class DefaultContextMaker extends Effect.Service<DefaultContextMaker>()("DefaultContextMaker", {
909-
strict: false,
910943
succeed: Effect.succeed(Context.empty()) satisfies ContextProviderShape<never>
911944
}) {}

0 commit comments

Comments
 (0)