@@ -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),
|
||||
),
|
||||
)
|
||||
)),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user