0.1.11 #14

Merged
Thilawyn merged 318 commits from next into master 2025-05-19 14:01:41 +02:00
2 changed files with 29 additions and 25 deletions
Showing only changes of commit 778ee27795 - Show all commits

View File

@@ -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,13 +10,14 @@ 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>
(TagClass as Mutable<typeof TagClass>).Live = Layer.effect(TagClass, Effect.gen(function*() {
const queue = yield* Queue.unbounded<Cause.Cause<E>>() const queue = yield* Queue.unbounded<Cause.Cause<E>>()
const errors = Stream.fromQueue(queue) const errors = Stream.fromQueue(queue)
@@ -26,8 +28,10 @@ export const layer = <Self, Id extends string, 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)

View File

@@ -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