0.1.11 #14
@@ -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<E> {
|
export interface ErrorHandler<E> {
|
||||||
@@ -9,25 +10,28 @@ export interface ErrorHandler<E> {
|
|||||||
export type Error<T> = T extends ErrorHandler<infer E> ? E : never
|
export type Error<T> = T extends ErrorHandler<infer E> ? E : never
|
||||||
|
|
||||||
|
|
||||||
export const Tag = <const Id extends string>(id: Id) => <
|
export interface ServiceResult<Self, Id extends string, E> extends Context.TagClass<Self, Id, ErrorHandler<E>> {
|
||||||
Self, E = never,
|
readonly Live: Layer.Layer<Self>
|
||||||
>() => Effect.Tag(id)<Self, ErrorHandler<E>>()
|
}
|
||||||
|
|
||||||
export const layer = <Self, Id extends string, E>(
|
export const Service = <const Id extends string>(id: Id) => (
|
||||||
tag: Context.TagClass<Self, Id, ErrorHandler<E>>
|
<Self, E = never>(): ServiceResult<Self, Id, E> => {
|
||||||
): Layer.Layer<Self> => Layer.effect(tag, Effect.gen(function*() {
|
const TagClass = Context.Tag(id)() as ServiceResult<Self, Id, E>
|
||||||
const queue = yield* Queue.unbounded<Cause.Cause<E>>()
|
(TagClass as Mutable<typeof TagClass>).Live = Layer.effect(TagClass, Effect.gen(function*() {
|
||||||
const errors = Stream.fromQueue(queue)
|
const queue = yield* Queue.unbounded<Cause.Cause<E>>()
|
||||||
|
const errors = Stream.fromQueue(queue)
|
||||||
|
|
||||||
const handle = <A, SelfE, R>(
|
const handle = <A, SelfE, R>(
|
||||||
self: Effect.Effect<A, SelfE, R>
|
self: Effect.Effect<A, SelfE, R>
|
||||||
) => Effect.tapErrorCause(self, cause =>
|
) => Effect.tapErrorCause(self, cause =>
|
||||||
Queue.offer(queue, cause as Cause.Cause<E>)
|
Queue.offer(queue, cause as Cause.Cause<E>)
|
||||||
) as Effect.Effect<A, Exclude<SelfE, E>, R>
|
) as Effect.Effect<A, Exclude<SelfE, E>, R>
|
||||||
|
|
||||||
return { errors, handle }
|
return { errors, handle }
|
||||||
}))
|
}))
|
||||||
|
return TagClass
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
export class DefaultErrorHandler extends Tag("@reffuse/extension-query/DefaultErrorHandler")<DefaultErrorHandler>() {}
|
export class DefaultErrorHandler extends Service("@reffuse/extension-query/DefaultErrorHandler")<DefaultErrorHandler>() {}
|
||||||
export const DefaultErrorHandlerLive = layer(DefaultErrorHandler)
|
|
||||||
|
|||||||
@@ -8,18 +8,18 @@ export interface QueryClient<EH, HandledE> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const Id = "@reffuse/extension-query/QueryClient"
|
const id = "@reffuse/extension-query/QueryClient"
|
||||||
|
|
||||||
export type TagClassShape<EH, HandledE> = Context.TagClassShape<typeof Id, QueryClient<EH, HandledE>>
|
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 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 const makeGenericTagClass = <EH = never, HandledE = never>() => Context.GenericTag(id) as GenericTagClass<EH, HandledE>
|
||||||
|
|
||||||
|
|
||||||
export interface ServiceProps<EH, HandledE> {
|
export interface ServiceProps<EH, HandledE> {
|
||||||
readonly ErrorHandler?: Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>>
|
readonly ErrorHandler?: Context.Tag<EH, ErrorHandler.ErrorHandler<HandledE>>
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ServiceResult<Self, EH, HandledE> extends Context.TagClass<Self, typeof Id, QueryClient<EH, HandledE>> {
|
export interface ServiceResult<Self, EH, HandledE> extends Context.TagClass<Self, typeof id, QueryClient<EH, HandledE>> {
|
||||||
readonly Live: Layer.Layer<
|
readonly Live: Layer.Layer<
|
||||||
| Self
|
| Self
|
||||||
| (EH extends ErrorHandler.DefaultErrorHandler
|
| (EH extends ErrorHandler.DefaultErrorHandler
|
||||||
@@ -35,7 +35,7 @@ export const Service = <
|
|||||||
props?: ServiceProps<EH, HandledE>
|
props?: ServiceProps<EH, HandledE>
|
||||||
) => (
|
) => (
|
||||||
<Self>(): ServiceResult<Self, EH, HandledE> => {
|
<Self>(): ServiceResult<Self, EH, HandledE> => {
|
||||||
const TagClass = Context.Tag(Id)() as ServiceResult<Self, EH, HandledE>
|
const TagClass = Context.Tag(id)() as ServiceResult<Self, EH, HandledE>
|
||||||
(TagClass as Mutable<typeof TagClass>).Live = Layer.empty.pipe(
|
(TagClass as Mutable<typeof TagClass>).Live = Layer.empty.pipe(
|
||||||
Layer.provideMerge(
|
Layer.provideMerge(
|
||||||
Layer.succeed(TagClass, {
|
Layer.succeed(TagClass, {
|
||||||
@@ -45,7 +45,7 @@ export const Service = <
|
|||||||
|
|
||||||
Layer.provideMerge((props?.ErrorHandler
|
Layer.provideMerge((props?.ErrorHandler
|
||||||
? Layer.empty
|
? Layer.empty
|
||||||
: ErrorHandler.DefaultErrorHandlerLive
|
: ErrorHandler.DefaultErrorHandler.Live
|
||||||
) as Layer.Layer<ErrorHandler.DefaultErrorHandler>),
|
) as Layer.Layer<ErrorHandler.DefaultErrorHandler>),
|
||||||
)
|
)
|
||||||
return TagClass
|
return TagClass
|
||||||
|
|||||||
Reference in New Issue
Block a user