@@ -41,13 +41,12 @@ extends Pipeable.Class() implements Lens<A, ER, RR, EW, RW> {
|
||||
|
||||
export const isLens = (u: unknown): u is Lens<unknown, unknown, unknown, unknown, unknown> => Predicate.hasProperty(u, LensTypeId)
|
||||
|
||||
export const make = <A, ER, RR, EW, RW>(
|
||||
options: {
|
||||
readonly get: Effect.Effect<A, ER, RR>
|
||||
readonly changes: Stream.Stream<A, ER, RR>
|
||||
readonly set: (a: A) => Effect.Effect<void, EW, RW>
|
||||
}
|
||||
): Lens<A, ER, RR, EW, RW> => new LensImpl(options.get, options.changes, options.set)
|
||||
|
||||
export const make = <A, ER, RR, EW, RW>(options: {
|
||||
readonly get: Effect.Effect<A, ER, RR>
|
||||
readonly changes: Stream.Stream<A, ER, RR>
|
||||
readonly set: (a: A) => Effect.Effect<void, EW, RW>
|
||||
}): Lens<A, ER, RR, EW, RW> => new LensImpl(options.get, options.changes, options.set)
|
||||
|
||||
/**
|
||||
* Creates a `Lens` that directly proxies a `SubscriptionRef`.
|
||||
@@ -60,6 +59,51 @@ export const fromSubscriptionRef = <A>(
|
||||
set: a => SubscriptionRef.set(ref, a),
|
||||
})
|
||||
|
||||
|
||||
export const map = <A, ER, RR, EW, RW, B>(
|
||||
self: Lens<A, ER, RR, EW, RW>,
|
||||
get: (a: A) => B,
|
||||
set: (b: B) => A,
|
||||
): Lens<B, ER, RR, EW, RW> => {
|
||||
make({
|
||||
get: Effect.map(self.get, get),
|
||||
changes: Stream.map(self.changes, get),
|
||||
|
||||
})
|
||||
const get = Effect.map(self.get, f)
|
||||
const changes = Stream.map(self.changes, f)
|
||||
const set = (b: B) => self.set(g(b))
|
||||
|
||||
const out = new LensImpl(get, changes, set)
|
||||
|
||||
;(out as any).modify = <C, E1 = never, R1 = never>(
|
||||
h: (b: B) => Effect.Effect<readonly [C, B], E1, R1>
|
||||
) => self.modify((a: A) => {
|
||||
const b = f(a)
|
||||
return Effect.flatMap(h(b), ([c, bNext]) => Effect.succeed([c, g(bNext)] as const))
|
||||
})
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
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) => 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 set = (b: B) => Effect.flatMap(setF(b), a => self.set(a))
|
||||
|
||||
const out = new LensImpl(get, changes, set)
|
||||
|
||||
;(out as any).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), nextA => Effect.succeed([c, nextA] as const)))))
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
export const unwrap = <A, ER, RR, EW, RW, E1, R1>(
|
||||
effect: Effect.Effect<Lens<A, ER, RR, EW, RW>, E1, R1>
|
||||
): Lens<A, ER | E1, RR | R1, EW | E1, RW | R1> => make({
|
||||
|
||||
Reference in New Issue
Block a user