diff --git a/packages/effect-lens/src/Lens.ts b/packages/effect-lens/src/Lens.ts index c581347..0a87838 100644 --- a/packages/effect-lens/src/Lens.ts +++ b/packages/effect-lens/src/Lens.ts @@ -183,6 +183,35 @@ export const derive: { ): Lens => new DerivedLensImpl(asLensImpl(self), source)) +export class UnwrappedLensImpl +extends LensImpl { + constructor( + readonly effect: Effect.Effect, E1, R1> + ) { + super() + } + + get resolve(): Effect.Effect, ER | E1, RR | R1> { + return Effect.map( + Effect.flatMap(this.effect, l => asLensImpl(l).resolve), + frame => ({ + value: frame.value, + commit: next => frame.commit(next), + }), + ) + } + get changes() { return Stream.unwrap(Effect.map(this.effect, l => l.changes)) } + get lock() { return Effect.flatMap(this.effect, l => asLensImpl(l).lock) } +} + +/** + * Flattens an effectful `Lens`. + */ +export const unwrap = ( + effect: Effect.Effect, E1, R1> +): Lens => new UnwrappedLensImpl(effect) + + export class RefLensImpl extends LensImpl { constructor( @@ -308,21 +337,6 @@ export const fromSubscriptionRef = ( ): Lens => new SubscriptionRefLensImpl(ref as SubscriptionRefLensImpl.SubscriptionRefWithInternals) -/** - * Flattens an effectful `Lens`. - */ -export const unwrap = ( - effect: Effect.Effect, E1, R1> -): Lens => make({ - get: Effect.flatMap(effect, l => l.get), - changes: Stream.unwrap(Effect.map(effect, l => l.changes)), - commit: a => Effect.flatMap( - effect, - l => Effect.flatMap(asLensImpl(l).resolve, frame => frame.commit(Effect.succeed(a))), - ), - lock: Effect.flatMap(effect, l => asLensImpl(l).lock), -}) - /** * Derives a new `Lens` by applying synchronous getters and setters over the focused value. */ @@ -606,7 +620,7 @@ export const catchAllWrite: { mapStream: identity, mapLock: lock => Effect.catchAll( lock, - error => Effect.as(f(error), identityLock), + error => Effect.as(f(error), identity), ), }))