Fix
All checks were successful
Lint / lint (push) Successful in 13s

This commit is contained in:
Julien Valverdé
2026-03-23 20:51:45 +01:00
parent a30c527803
commit 3f05a5099e

View File

@@ -79,7 +79,7 @@ export const map = <A, ER, RR, EW, RW, B>(
(b: B): (parent: A) => A
(parent: A, b: B): A
},
}
},
): Lens<B, ER, RR, EW, RW> => make({
get: Effect.map(self.get, options.get),
changes: Stream.map(self.changes, options.get),
@@ -91,25 +91,37 @@ export const map = <A, ER, RR, EW, RW, B>(
options.set.length >= 2
? (options.set as (parent: A, b: B) => A)(a, next)
: (options.set as (b: B) => (parent: A) => A)(next)(a),
] as const))
]))
),
})
export const mapEffect = <A, ER, RR, EW, RW, B, EGet = never, RGet = never, ESet = never, RSet = never>(
self: Lens<A, ER, RR, EW, RW>,
getF: (a: A) => Effect.Effect<B, EGet, RGet>,
setF: (b: B, parent: A) => Effect.Effect<A, ESet, RSet>,
options: {
readonly get: (a: A) => Effect.Effect<B, EGet, RGet>,
readonly set: {
(b: B): (parent: A) => Effect.Effect<A, ESet, RSet>
(parent: A, b: B): Effect.Effect<A, ESet, RSet>
},
},
): Lens<B, ER | EGet, RR | RGet, EW | ESet, RW | RSet> => {
const get = Effect.flatMap(self.get, getF)
const changes = Stream.mapEffect(self.changes, getF)
const modify = <C, E1 = never, R1 = never>(
h: (b: B) => Effect.Effect<readonly [C, B], E1, R1>
) => self.modify((a: A) => Effect.flatMap(getF(a), b => Effect.flatMap(h(b), ([c, bNext]) => Effect.flatMap(setF(bNext, a), nextA => Effect.succeed([c, nextA] as const)))))
return make({
get: Effect.flatMap(self.get, getF),
changes: Stream.mapEffect(self.changes, getF),
modify,
get: Effect.flatMap(self.get, options.get),
changes: Stream.mapEffect(self.changes, options.get),
modify: <C, E1 = never, R1 = never>(
f: (b: B) => Effect.Effect<readonly [C, B], E1, R1>
) => self.modify(a => Effect.flatMap(
options.get(a),
b => Effect.flatMap(
f(b),
([c, bNext]) => Effect.flatMap(
options.set.length >= 2
? (options.set as (parent: A, b: B) => Effect.Effect<A, ESet, RSet>)(a, bNext)
: (options.set as (b: B) => (parent: A) => Effect.Effect<A, ESet, RSet>)(bNext)(a),
nextA => Effect.succeed([c, nextA] as const),
),
)
)),
})
}