@reffuse/extension-query 0.1.4 #15

Merged
Thilawyn merged 340 commits from next into master 2025-05-26 04:15:01 +02:00
3 changed files with 70 additions and 29 deletions
Showing only changes of commit 0e2c0db28f - Show all commits

View File

@@ -6,42 +6,83 @@ export interface QueryClient<EH, 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>>
}
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 = <
export const Service: <
EH = ErrorHandler.DefaultErrorHandler,
HandledE = never,
>(
props?: MakeProps<EH, HandledE>
): MakeResult<EH, HandledE> => [
makeTag(),
Layer.empty.pipe(
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(makeTag<EH, HandledE>(), Effect.succeed({
ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>>
Layer.effect(TagClass, Effect.succeed({
ErrorHandler: props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler
}))
),
Layer.provideMerge((props?.ErrorHandler
? Layer.empty
: 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,
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>,
): UseQueryResult<QK, QA, Exclude<QE, HandledE>> {
const runner = this.useMemo(() => QueryRunner.make({
QueryClient: QueryClient.makeTag<EH, HandledE>(),
QueryClient: QueryClient.makeGenericTagClass<EH, HandledE>(),
key: props.key,
query: props.query,
}), [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> {
readonly QueryClient: QueryClient.Tag<EH, HandledE>
readonly QueryClient: QueryClient.GenericTagClass<EH, HandledE>
readonly key: Stream.Stream<K>
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<
QueryRunner<K, A, Exclude<E, HandledE>, R>,
never,
R | QueryClient.QueryClient<EH, HandledE> | EH
R | QueryClient.TagClassShape<EH, HandledE> | EH
> => 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 stateRef = yield* SubscriptionRef.make(AsyncData.noData<A, Exclude<E, HandledE>>())