From 53bc4407b3f4f51d8b3316f54f018badfa5b040a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 5 Nov 2025 01:12:56 +0100 Subject: [PATCH] Add ErrorObserver --- packages/effect-fc/src/ErrorObserver.ts | 57 +++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 packages/effect-fc/src/ErrorObserver.ts diff --git a/packages/effect-fc/src/ErrorObserver.ts b/packages/effect-fc/src/ErrorObserver.ts new file mode 100644 index 0000000..d18748c --- /dev/null +++ b/packages/effect-fc/src/ErrorObserver.ts @@ -0,0 +1,57 @@ +import { type Cause, Context, Effect, Layer, type Queue, type Scope } from "effect" + + +export interface ErrorObserver { + readonly "~In": EIn + readonly "~Out": EOut + readonly "~Caught": Exclude + + handle(effect: Effect.Effect): Effect.Effect>, R> + readonly subscribe: Effect.Effect>, never, Scope.Scope> +} + + +export namespace make { + export type Handler = ( + self: Effect.Effect>, + push: { + failure(failure: NoInfer): Effect.Effect + defect(defect: unknown): Effect.Effect + }, + ) => Effect.Effect +} + +export const make = () => ( + f: make.Handler, EOut> +): Effect.Effect> => + + +export const ErrorObserver: Context.Tag< + ErrorObserver, + ErrorObserver +> = Context.GenericTag("@effect-fc/ErrorObserver/ErrorObserver") + +export namespace Service { + export interface Result + extends Context.TagClass> { + readonly Default: Layer.Layer + } +} + +export const Service = () => ( + ( + id: Id, + f: ( + self: Effect.Effect>, + actions: { + failure(failure: NoInfer): Effect.Effect + defect(defect: unknown): Effect.Effect + }, + ) => Effect.Effect, + ): Service.Result => Layer.effect( + ErrorObserver as Context.Tag, ErrorObserver>, + Effect.gen(function*() { + + }, + )) +)