diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 7ca9d24..1f19be5 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -6,42 +6,83 @@ export interface QueryClient { readonly ErrorHandler: Context.Tag> } -export type Tag = Context.Tag, QueryClient> -export const makeTag = (): Tag => Context.GenericTag("@reffuse/extension-query/QueryClient") + +const Id = "@reffuse/extension-query/QueryClient" + +export type TagClassShape = Context.TagClassShape> +export type GenericTagClass = Context.TagClass, typeof Id, QueryClient> +export const makeGenericTagClass = () => Context.GenericTag(Id) as GenericTagClass -export interface MakeProps { +export interface ServiceProps { readonly ErrorHandler?: Context.Tag> } -export type MakeResult = [ - tag: Tag, - layer: Layer.Layer< - | QueryClient - | (EH extends ErrorHandler.DefaultErrorHandler - ? ErrorHandler.DefaultErrorHandler - : never) - >, -] - -export const make = < +export const Service: < EH = ErrorHandler.DefaultErrorHandler, HandledE = never, >( - props?: MakeProps -): MakeResult => [ - makeTag(), - - Layer.empty.pipe( + props?: ServiceProps +) => + () => + & Context.TagClass> + & { readonly Live: Layer.Layer< + | QueryClient + | (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(), Effect.succeed({ - ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> + Layer.effect(TagClass, Effect.succeed({ + ErrorHandler: props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler })) ), Layer.provideMerge((props?.ErrorHandler ? Layer.empty : ErrorHandler.DefaultErrorHandlerLive - ) as Layer.Layer), - ), -] + ), + )) + + return TagClass +} + + +// export interface MakeProps { +// readonly ErrorHandler?: Context.Tag> +// } + +// export type MakeResult = [ +// tag: Tag, +// layer: Layer.Layer< +// | QueryClient +// | (EH extends ErrorHandler.DefaultErrorHandler +// ? ErrorHandler.DefaultErrorHandler +// : never) +// >, +// ] + +// export const make = < +// EH = ErrorHandler.DefaultErrorHandler, +// HandledE = never, +// >( +// props?: MakeProps +// ): MakeResult => [ +// makeTag(), + +// Layer.empty.pipe( +// Layer.provideMerge( +// Layer.effect(makeTag(), Effect.succeed({ +// ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> +// })) +// ), + +// Layer.provideMerge((props?.ErrorHandler +// ? Layer.empty +// : ErrorHandler.DefaultErrorHandlerLive +// ) as Layer.Layer), +// ), +// ] diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 8b336f1..80cc059 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -34,11 +34,11 @@ export const QueryExtension = ReffuseExtension.make(() => ({ QR extends R, R, >( - this: ReffuseHelpers.ReffuseHelpers | EH>, + this: ReffuseHelpers.ReffuseHelpers | EH>, props: UseQueryProps, ): UseQueryResult> { const runner = this.useMemo(() => QueryRunner.make({ - QueryClient: QueryClient.makeTag(), + QueryClient: QueryClient.makeGenericTagClass(), key: props.key, query: props.query, }), [props.key]) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 46ec4a4..ca1f6ae 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -21,7 +21,7 @@ export interface QueryRunner { export interface MakeProps { - readonly QueryClient: QueryClient.Tag + readonly QueryClient: QueryClient.GenericTagClass readonly key: Stream.Stream readonly query: (key: K) => Effect.Effect } @@ -35,9 +35,9 @@ export const make = ( ): Effect.Effect< QueryRunner, R>, never, - R | QueryClient.QueryClient | EH + R | QueryClient.TagClassShape | EH > => Effect.gen(function*() { - const context = yield* Effect.context | EH>() + const context = yield* Effect.context | EH>() const latestKeyRef = yield* SubscriptionRef.make(Option.none()) const stateRef = yield* SubscriptionRef.make(AsyncData.noData>())