import { Context, Layer } from "effect" import type { Mutable } from "effect/Types" import * as ErrorHandler from "./ErrorHandler.js" export interface QueryClient { readonly ErrorHandler: Context.Tag> } 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 ServiceProps { readonly ErrorHandler?: Context.Tag> } export interface ServiceResult extends Context.TagClass> { readonly Live: Layer.Layer< | Self | (EH extends ErrorHandler.DefaultErrorHandler ? ErrorHandler.DefaultErrorHandler : never) > } export const Service = < EH = ErrorHandler.DefaultErrorHandler, HandledE = never, >( props?: ServiceProps ) => ( (): ServiceResult => { const TagClass = Context.Tag(Id)() as ServiceResult (TagClass as Mutable).Live = Layer.empty.pipe( Layer.provideMerge( Layer.succeed(TagClass, { ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> }) ), Layer.provideMerge((props?.ErrorHandler ? Layer.empty : ErrorHandler.DefaultErrorHandlerLive ) as Layer.Layer), ) return TagClass } )