diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts index 7e4e912..c3cf4aa 100644 --- a/packages/extension-query/src/ErrorHandler.ts +++ b/packages/extension-query/src/ErrorHandler.ts @@ -1,4 +1,5 @@ -import { type Cause, type Context, Effect, Layer, Queue, Stream } from "effect" +import { type Cause, Context, Effect, Layer, Queue, Stream } from "effect" +import type { Mutable } from "effect/Types" export interface ErrorHandler { @@ -9,25 +10,28 @@ export interface ErrorHandler { export type Error = T extends ErrorHandler ? E : never -export const Tag = (id: Id) => < - Self, E = never, ->() => Effect.Tag(id)>() +export interface ServiceResult extends Context.TagClass> { + readonly Live: Layer.Layer +} -export const layer = ( - tag: Context.TagClass> -): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { - const queue = yield* Queue.unbounded>() - const errors = Stream.fromQueue(queue) +export const Service = (id: Id) => ( + (): ServiceResult => { + const TagClass = Context.Tag(id)() as ServiceResult + (TagClass as Mutable).Live = Layer.effect(TagClass, Effect.gen(function*() { + const queue = yield* Queue.unbounded>() + const errors = Stream.fromQueue(queue) - const handle = ( - self: Effect.Effect - ) => Effect.tapErrorCause(self, cause => - Queue.offer(queue, cause as Cause.Cause) - ) as Effect.Effect, R> + const handle = ( + self: Effect.Effect + ) => Effect.tapErrorCause(self, cause => + Queue.offer(queue, cause as Cause.Cause) + ) as Effect.Effect, R> - return { errors, handle } -})) + return { errors, handle } + })) + return TagClass + } +) -export class DefaultErrorHandler extends Tag("@reffuse/extension-query/DefaultErrorHandler")() {} -export const DefaultErrorHandlerLive = layer(DefaultErrorHandler) +export class DefaultErrorHandler extends Service("@reffuse/extension-query/DefaultErrorHandler")() {} diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index b071244..cd39bc9 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -8,18 +8,18 @@ export interface QueryClient { } -const Id = "@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 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> { +export interface ServiceResult extends Context.TagClass> { readonly Live: Layer.Layer< | Self | (EH extends ErrorHandler.DefaultErrorHandler @@ -35,7 +35,7 @@ export const Service = < props?: ServiceProps ) => ( (): ServiceResult => { - const TagClass = Context.Tag(Id)() as ServiceResult + const TagClass = Context.Tag(id)() as ServiceResult (TagClass as Mutable).Live = Layer.empty.pipe( Layer.provideMerge( Layer.succeed(TagClass, { @@ -45,7 +45,7 @@ export const Service = < Layer.provideMerge((props?.ErrorHandler ? Layer.empty - : ErrorHandler.DefaultErrorHandlerLive + : ErrorHandler.DefaultErrorHandler.Live ) as Layer.Layer), ) return TagClass