import { type Cause, type Context, Effect, Layer, Queue, Stream } from "effect" export interface ErrorHandler { readonly errors: Stream.Stream> handle(self: Effect.Effect): Effect.Effect } export const Tag = (id: Id) => < Self, E = never, >() => Effect.Tag(id)>() export const layer = ( tag: Context.TagClass> ): Layer.Layer => Layer.effect(tag, 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 return { errors, handle } })) export class DefaultErrorHandler extends Tag("@reffuse/extension-query/DefaultErrorHandler")() {} export const DefaultErrorHandlerLive = layer(DefaultErrorHandler)