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

This commit is contained in:
Julien Valverdé
2025-03-16 02:52:49 +01:00
parent c943d81702
commit 0e2c0db28f
3 changed files with 70 additions and 29 deletions

View File

@@ -6,42 +6,83 @@ export interface QueryClient<EH, HandledE> {
readonly ErrorHandler: Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>> readonly ErrorHandler: Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>>
} }
export type Tag<EH, HandledE> = Context.Tag<QueryClient<EH, HandledE>, QueryClient<EH, HandledE>>
export const makeTag = <EH = never, HandledE = never>(): Tag<EH, HandledE> => Context.GenericTag("@reffuse/extension-query/QueryClient") const Id = "@reffuse/extension-query/QueryClient"
export type TagClassShape<EH, HandledE> = Context.TagClassShape<typeof Id, QueryClient<EH, HandledE>>
export type GenericTagClass<EH, HandledE> = Context.TagClass<TagClassShape<EH, HandledE>, typeof Id, QueryClient<EH, HandledE>>
export const makeGenericTagClass = <EH = never, HandledE = never>() => Context.GenericTag(Id) as GenericTagClass<EH, HandledE>
export interface MakeProps<EH, HandledE> { export interface ServiceProps<EH, HandledE> {
readonly ErrorHandler?: Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>> readonly ErrorHandler?: Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>>
} }
export type MakeResult<EH, HandledE> = [ export const Service: <
tag: Tag<EH, HandledE>, EH = ErrorHandler.DefaultErrorHandler,
layer: Layer.Layer< HandledE = never,
>(
props?: ServiceProps<EH, HandledE>
) =>
<Self>() =>
& Context.TagClass<Self, typeof Id, QueryClient<EH, HandledE>>
& { readonly Live: Layer.Layer<
| QueryClient<EH, HandledE> | QueryClient<EH, HandledE>
| (EH extends ErrorHandler.DefaultErrorHandler | (EH extends ErrorHandler.DefaultErrorHandler
? ErrorHandler.DefaultErrorHandler ? ErrorHandler.DefaultErrorHandler
: never) : never)
>, > }
] = props => () => {
const TagClass = Context.Tag(Id)() as any
export const make = < TagClass.Live = Layer.empty.pipe(
EH = ErrorHandler.DefaultErrorHandler,
HandledE = never,
>(
props?: MakeProps<EH, HandledE>
): MakeResult<EH, HandledE> => [
makeTag(),
Layer.empty.pipe(
Layer.provideMerge( Layer.provideMerge(
Layer.effect(makeTag<EH, HandledE>(), Effect.succeed({ Layer.effect(TagClass, Effect.succeed({
ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>> ErrorHandler: props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler
})) }))
), ),
Layer.provideMerge((props?.ErrorHandler Layer.provideMerge((props?.ErrorHandler
? Layer.empty ? Layer.empty
: ErrorHandler.DefaultErrorHandlerLive : ErrorHandler.DefaultErrorHandlerLive
) as Layer.Layer<ErrorHandler.DefaultErrorHandler>),
), ),
] ))
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>),
// ),
// ]

View File

@@ -34,11 +34,11 @@ export const QueryExtension = ReffuseExtension.make(() => ({
QR extends R, QR extends R,
R, R,
>( >(
this: ReffuseHelpers.ReffuseHelpers<R | QueryClient.QueryClient<EH, HandledE> | EH>, this: ReffuseHelpers.ReffuseHelpers<R | QueryClient.TagClassShape<EH, HandledE> | EH>,
props: UseQueryProps<QK, QA, QE, QR>, props: UseQueryProps<QK, QA, QE, QR>,
): UseQueryResult<QK, QA, Exclude<QE, HandledE>> { ): UseQueryResult<QK, QA, Exclude<QE, HandledE>> {
const runner = this.useMemo(() => QueryRunner.make({ const runner = this.useMemo(() => QueryRunner.make({
QueryClient: QueryClient.makeTag<EH, HandledE>(), QueryClient: QueryClient.makeGenericTagClass<EH, HandledE>(),
key: props.key, key: props.key,
query: props.query, query: props.query,
}), [props.key]) }), [props.key])

View File

@@ -21,7 +21,7 @@ export interface QueryRunner<K extends readonly unknown[], A, E, R> {
export interface MakeProps<EH, K extends readonly unknown[], A, E, HandledE, R> { export interface MakeProps<EH, K extends readonly unknown[], A, E, HandledE, R> {
readonly QueryClient: QueryClient.Tag<EH, HandledE> readonly QueryClient: QueryClient.GenericTagClass<EH, HandledE>
readonly key: Stream.Stream<K> readonly key: Stream.Stream<K>
readonly query: (key: K) => Effect.Effect<A, E, R> readonly query: (key: K) => Effect.Effect<A, E, R>
} }
@@ -35,9 +35,9 @@ export const make = <EH, K extends readonly unknown[], A, E, HandledE, R>(
): Effect.Effect< ): Effect.Effect<
QueryRunner<K, A, Exclude<E, HandledE>, R>, QueryRunner<K, A, Exclude<E, HandledE>, R>,
never, never,
R | QueryClient.QueryClient<EH, HandledE> | EH R | QueryClient.TagClassShape<EH, HandledE> | EH
> => Effect.gen(function*() { > => Effect.gen(function*() {
const context = yield* Effect.context<R | QueryClient.QueryClient<EH, HandledE> | EH>() const context = yield* Effect.context<R | QueryClient.TagClassShape<EH, HandledE> | EH>()
const latestKeyRef = yield* SubscriptionRef.make(Option.none<K>()) const latestKeyRef = yield* SubscriptionRef.make(Option.none<K>())
const stateRef = yield* SubscriptionRef.make(AsyncData.noData<A, Exclude<E, HandledE>>()) const stateRef = yield* SubscriptionRef.make(AsyncData.noData<A, Exclude<E, HandledE>>())