From 09d513530b6d6ed05e1e4985f652a7b6d92e05d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 May 2026 02:40:46 +0200 Subject: [PATCH] Refactor --- packages/effect-lens/src/Lens.ts | 52 +++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/packages/effect-lens/src/Lens.ts b/packages/effect-lens/src/Lens.ts index 57b23d5..bfda515 100644 --- a/packages/effect-lens/src/Lens.ts +++ b/packages/effect-lens/src/Lens.ts @@ -90,20 +90,56 @@ extends Pipeable.Class() implements Lens { abstract readonly withLock: (self: Effect.Effect) => Effect.Effect get get(): Effect.Effect { - return this.sourceGet + let effect: Effect.Effect = this.sourceGet + for (const step of this.steps) { + effect = step.transform(effect as never) + } + return effect as Effect.Effect } get changes(): Stream.Stream { - return this.sourceChanges + let stream: Stream.Stream = this.sourceChanges + for (const step of this.steps) { + stream = step.transformStream(stream as never) + } + return stream as Stream.Stream } - modifyEffect( - f: (a: A) => Effect.Effect, - ): Effect.Effect { + modifyEffect( + f: (a: A) => Effect.Effect, + ): Effect.Effect { return this.withLock(Effect.flatMap( - this.get, - a => Effect.flatMap(f(a), ([b, next]) => Effect.as(this.sourceCommit(next), b), - ))) + this.sourceGet, + source => { + const parents: unknown[] = [] + let current: Effect.Effect = Effect.succeed(source) + + for (const step of this.steps) { + current = Effect.flatMap(current, parent => { + parents.push(parent) + return step.transform(Effect.succeed(parent) as never) + }) + } + + return Effect.flatMap(current, a => Effect.flatMap( + f(a as A), + ([c, next]) => { + let rebuilt: Effect.Effect = Effect.succeed(next) + + for (let i = this.steps.length - 1; i >= 0; i--) { + const step = this.steps[i]! + const parent = parents[i]! + rebuilt = step.update(rebuilt as never, parent as never) + } + + return Effect.as( + Effect.flatMap(rebuilt, b => this.sourceCommit(b as B)), + c, + ) + }, + )) + }, + )) as Effect.Effect } }