Working QueryClient refactoring
All checks were successful
Lint / lint (push) Successful in 13s

This commit is contained in:
Julien Valverdé
2025-03-16 03:19:12 +01:00
parent 0e2c0db28f
commit e4bacd1ca7
4 changed files with 33 additions and 68 deletions

View File

@@ -1,4 +1,5 @@
import { Context, Effect, Layer } from "effect"
import type { Mutable } from "effect/Types"
import * as ErrorHandler from "./ErrorHandler.js"
@@ -18,71 +19,35 @@ export interface ServiceProps<EH, HandledE> {
readonly ErrorHandler?: Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>>
}
export const Service: <
export interface ServiceResult<Self, EH, HandledE> extends Context.TagClass<Self, typeof Id, QueryClient<EH, HandledE>> {
readonly Live: Layer.Layer<
| Self
| (EH extends ErrorHandler.DefaultErrorHandler
? ErrorHandler.DefaultErrorHandler
: never)
>
}
export const Service = <
EH = ErrorHandler.DefaultErrorHandler,
HandledE = never,
>(
props?: ServiceProps<EH, HandledE>
) =>
<Self>() =>
& Context.TagClass<Self, typeof Id, QueryClient<EH, HandledE>>
& { readonly Live: Layer.Layer<
| QueryClient<EH, HandledE>
| (EH extends ErrorHandler.DefaultErrorHandler
? ErrorHandler.DefaultErrorHandler
: never)
> }
= props => () => {
const TagClass = Context.Tag(Id)() as any
TagClass.Live = Layer.empty.pipe(
Layer.provideMerge(
Layer.effect(TagClass, Effect.succeed({
ErrorHandler: props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler
}))
),
) => (
<Self>(): ServiceResult<Self, EH, HandledE> => {
const TagClass = Context.Tag(Id)() as ServiceResult<Self, EH, HandledE>
(TagClass as Mutable<typeof TagClass>).Live = Layer.empty.pipe(
Layer.provideMerge(
Layer.effect(TagClass, Effect.succeed({
ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>>
}))
),
Layer.provideMerge((props?.ErrorHandler
? Layer.empty
: ErrorHandler.DefaultErrorHandlerLive
),
))
return TagClass
}
// export interface MakeProps<EH, HandledE> {
// readonly ErrorHandler?: Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>>
// }
// export type MakeResult<EH, HandledE> = [
// tag: Tag<EH, HandledE>,
// layer: Layer.Layer<
// | QueryClient<EH, HandledE>
// | (EH extends ErrorHandler.DefaultErrorHandler
// ? ErrorHandler.DefaultErrorHandler
// : never)
// >,
// ]
// export const make = <
// EH = ErrorHandler.DefaultErrorHandler,
// HandledE = never,
// >(
// props?: MakeProps<EH, HandledE>
// ): MakeResult<EH, HandledE> => [
// makeTag(),
// Layer.empty.pipe(
// Layer.provideMerge(
// Layer.effect(makeTag<EH, HandledE>(), Effect.succeed({
// ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>>
// }))
// ),
// Layer.provideMerge((props?.ErrorHandler
// ? Layer.empty
// : ErrorHandler.DefaultErrorHandlerLive
// ) as Layer.Layer<ErrorHandler.DefaultErrorHandler>),
// ),
// ]
Layer.provideMerge((props?.ErrorHandler
? Layer.empty
: ErrorHandler.DefaultErrorHandlerLive
) as Layer.Layer<ErrorHandler.DefaultErrorHandler>),
)
return TagClass
}
)