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,
}))
/**