diff --git a/packages/effect-lens/src/Lens.ts b/packages/effect-lens/src/Lens.ts index 922c9a5..2f8ac7f 100644 --- a/packages/effect-lens/src/Lens.ts +++ b/packages/effect-lens/src/Lens.ts @@ -497,19 +497,46 @@ export const mapError: { * Applies to `get` and `changes` while leaving `modify` unchanged. */ export const catchAllRead: { + ( + self: Lens, + f: (error: NoInfer) => Lens, + ): Lens + ( + f: (error: NoInfer) => Lens, + ): (self: Lens) => Lens +} = Function.dual(2, ( + self: Lens, + f: (error: NoInfer) => Lens, +): Lens => derive(self, { + resolve: parent => Effect.catchAll( + parent, + error => asLensImpl(f(error)).resolve as Effect.Effect, E2, R2>, + ), + transformStream: Stream.catchAll(error => f(error).changes), +} as DerivedLensImpl.Source)) + +/** + * Recovers from modify failures of a `Lens`. + * + * Applies to the commit/rebuild portion of `modifyEffect` while leaving reads unchanged. + */ +export const catchAllWrite: { ( self: Lens, - f: (error: NoInfer) => Subscribable.Subscribable, - ): Lens + f: (error: unknown) => Effect.Effect, + ): Lens ( - f: (error: NoInfer) => Subscribable.Subscribable, - ): (self: Lens) => Lens + f: (error: unknown) => Effect.Effect, + ): (self: Lens) => Lens } = Function.dual(2, ( self: Lens, - f: (error: NoInfer) => Subscribable.Subscribable, -): Lens => derive(self, { - resolve: Effect.catchAll(error => asLensImpl(f(error) as Lens).resolve), - transformStream: Stream.catchAll(error => f(error).changes), + f: (error: unknown) => Effect.Effect, +): Lens => derive(self, { + resolve: parent => Effect.map(parent, frame => ({ + value: frame.value, + commit: next => Effect.catchAll(frame.commit(next), f), + })), + transformStream: identity, })) /**