0.1.8 #11
@@ -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>,
|
|
||||||
layer: Layer.Layer<
|
|
||||||
| QueryClient<EH, HandledE>
|
|
||||||
| (EH extends ErrorHandler.DefaultErrorHandler
|
|
||||||
? ErrorHandler.DefaultErrorHandler
|
|
||||||
: never)
|
|
||||||
>,
|
|
||||||
]
|
|
||||||
|
|
||||||
export const make = <
|
|
||||||
EH = ErrorHandler.DefaultErrorHandler,
|
EH = ErrorHandler.DefaultErrorHandler,
|
||||||
HandledE = never,
|
HandledE = never,
|
||||||
>(
|
>(
|
||||||
props?: MakeProps<EH, HandledE>
|
props?: ServiceProps<EH, HandledE>
|
||||||
): MakeResult<EH, HandledE> => [
|
) =>
|
||||||
makeTag(),
|
<Self>() =>
|
||||||
|
& Context.TagClass<Self, typeof Id, QueryClient<EH, HandledE>>
|
||||||
Layer.empty.pipe(
|
& { 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.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>),
|
||||||
|
// ),
|
||||||
|
// ]
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
@@ -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>>())
|
||||||
|
|||||||
Reference in New Issue
Block a user