@@ -35,16 +35,18 @@ extends Lens<A, ER, EW, RR, RW> {
|
|||||||
readonly [LensWithInternalsTypeId]: LensWithInternalsTypeId
|
readonly [LensWithInternalsTypeId]: LensWithInternalsTypeId
|
||||||
|
|
||||||
readonly update: (a: A) => Effect.Effect<void, EW, RW>
|
readonly update: (a: A) => Effect.Effect<void, EW, RW>
|
||||||
readonly withLock: <A1, E1, R1>(self: Effect.Effect<A1, E1, R1>) => Effect.Effect<A1, E1, R1>
|
readonly withLock: <A1, E1, R1>(self: Effect.Effect<A1, E1, R1>) => Effect.Effect<A1, EW | E1, RW | R1>
|
||||||
}
|
}
|
||||||
|
|
||||||
export const isLensWithInternals = (u: unknown): u is LensWithInternals<unknown, unknown, unknown, unknown, unknown> => Predicate.hasProperty(u, LensWithInternalsTypeId)
|
export const isLensWithInternals = (u: unknown): u is LensWithInternals<unknown, unknown, unknown, unknown, unknown> => Predicate.hasProperty(u, LensWithInternalsTypeId)
|
||||||
|
|
||||||
export const asLensWithInternals = <A, ER, EW, RR, RW>(
|
export const asLensWithInternals = <A, ER, EW, RR, RW>(
|
||||||
lens: Lens<A, ER, EW, RR, RW>
|
lens: Lens<A, ER, EW, RR, RW>
|
||||||
): Effect.Effect<LensWithInternals<A, ER, EW, RR, RW>, never, never> => isLensWithInternals(lens)
|
): LensWithInternals<A, ER, EW, RR, RW> => {
|
||||||
? Effect.succeed(lens as LensWithInternals<A, ER, EW, RR, RW>)
|
if (!isLensWithInternals(lens))
|
||||||
: Effect.die("Not a 'LensWithInternals'.")
|
throw new Error("Not a 'LensWithInternals'.")
|
||||||
|
return lens as LensWithInternals<A, ER, EW, RR, RW>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export declare namespace LensImpl {
|
export declare namespace LensImpl {
|
||||||
@@ -52,7 +54,7 @@ export declare namespace LensImpl {
|
|||||||
readonly get: Effect.Effect<A, ER, RR>,
|
readonly get: Effect.Effect<A, ER, RR>,
|
||||||
readonly changes: Stream.Stream<A, ER, RR>,
|
readonly changes: Stream.Stream<A, ER, RR>,
|
||||||
readonly update: (a: A) => Effect.Effect<void, EW, RW>,
|
readonly update: (a: A) => Effect.Effect<void, EW, RW>,
|
||||||
readonly withLock: <A1, E1, R1>(self: Effect.Effect<A1, E1, R1>) => Effect.Effect<A1, E1, R1>,
|
readonly withLock: <A1, E1, R1>(self: Effect.Effect<A1, E1, R1>) => Effect.Effect<A1, EW | E1, RW | R1>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +68,7 @@ extends Pipeable.Class() implements LensWithInternals<A, ER, EW, RR, RW> {
|
|||||||
readonly get: Effect.Effect<A, ER, RR>
|
readonly get: Effect.Effect<A, ER, RR>
|
||||||
readonly changes: Stream.Stream<A, ER, RR>
|
readonly changes: Stream.Stream<A, ER, RR>
|
||||||
readonly update: (a: A) => Effect.Effect<void, EW, RW>
|
readonly update: (a: A) => Effect.Effect<void, EW, RW>
|
||||||
readonly withLock: <A1, E1, R1>(self: Effect.Effect<A1, E1, R1>) => Effect.Effect<A1, E1, R1>
|
readonly withLock: <A1, E1, R1>(self: Effect.Effect<A1, E1, R1>) => Effect.Effect<A1, EW | E1, RW | R1>
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
source: LensImpl.Source<A, ER, EW, RR, RW>
|
source: LensImpl.Source<A, ER, EW, RR, RW>
|
||||||
@@ -226,16 +228,10 @@ export const unwrap = <A, ER, EW, RR, RW, E1, R1>(
|
|||||||
): Lens<A, ER | E1, EW | E1, RR | R1, RW | R1> => make({
|
): Lens<A, ER | E1, EW | E1, RR | R1, RW | R1> => make({
|
||||||
get: Effect.flatMap(effect, l => l.get),
|
get: Effect.flatMap(effect, l => l.get),
|
||||||
changes: Stream.unwrap(Effect.map(effect, l => l.changes)),
|
changes: Stream.unwrap(Effect.map(effect, l => l.changes)),
|
||||||
update: a => Effect.flatMap(
|
update: a => Effect.flatMap(effect, l => asLensWithInternals(l).update(a)),
|
||||||
effect,
|
|
||||||
l => Effect.flatMap(asLensWithInternals(l), l => l.update(a))
|
|
||||||
),
|
|
||||||
withLock: <A2, E2, R2>(
|
withLock: <A2, E2, R2>(
|
||||||
effect2: Effect.Effect<A2, E2, R2>
|
effect2: Effect.Effect<A2, E2, R2>
|
||||||
): Effect.Effect<A2, E1 | E2, R1 | R2> => Effect.flatMap(
|
) => Effect.flatMap(effect, l => asLensWithInternals(l).withLock(effect2)),
|
||||||
effect,
|
|
||||||
l => Effect.flatMap(asLensWithInternals(l), l2 => l2.withLock(effect2)),
|
|
||||||
),
|
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -258,11 +254,8 @@ export const map: {
|
|||||||
): Lens<B, ER, EW, RR, RW> => makeLazy({
|
): Lens<B, ER, EW, RR, RW> => makeLazy({
|
||||||
get get() { return Effect.map(self.get, get) },
|
get get() { return Effect.map(self.get, get) },
|
||||||
get changes() { return Stream.map(self.changes, get) },
|
get changes() { return Stream.map(self.changes, get) },
|
||||||
modify: <C, E1 = never, R1 = never>(
|
update(a: A) { return },
|
||||||
f: (b: B) => Effect.Effect<readonly [C, B], E1, R1>
|
get withLock() { return asLensWithInternals(self).withLock },
|
||||||
) => self.modify(a =>
|
|
||||||
Effect.flatMap(f(get(a)), ([c, next]) => Effect.succeed([c, set(a, next)]))
|
|
||||||
),
|
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user