0.2.0 #5

Merged
Thilawyn merged 59 commits from next into master 2026-05-30 06:10:54 +02:00
Showing only changes of commit 74519010b3 - Show all commits
+12 -19
View File
@@ -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)]))
),
})) }))
/** /**