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

This commit is contained in:
Julien Valverdé
2026-03-23 21:19:45 +01:00
parent 88ad7cb1ac
commit 8430b4ddf6

View File

@@ -1,4 +1,4 @@
import { Array, Chunk, Effect, flow, Option, Pipeable, Predicate, Readable, Stream, Subscribable, SubscriptionRef } from "effect" import { Chunk, Effect, Pipeable, Predicate, Readable, Stream, Subscribable, SubscriptionRef } from "effect"
export const LensTypeId: unique symbol = Symbol.for("@effect-fc/Lens/Lens") export const LensTypeId: unique symbol = Symbol.for("@effect-fc/Lens/Lens")
@@ -74,32 +74,21 @@ export const fromSubscriptionRef = <A>(
export const map = <A, ER, RR, EW, RW, B>( export const map = <A, ER, RR, EW, RW, B>(
self: Lens<A, ER, RR, EW, RW>, self: Lens<A, ER, RR, EW, RW>,
get: (a: NoInfer<A>) => B, get: (a: NoInfer<A>) => B,
set: { set: (a: NoInfer<A>, b: B) => NoInfer<A>,
(b: B): (parent: NoInfer<A>) => NoInfer<A>
(parent: NoInfer<A>, b: B): NoInfer<A>
},
): Lens<B, ER, RR, EW, RW> => make({ ): Lens<B, ER, RR, EW, RW> => make({
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>( modify: <C, E1 = never, R1 = never>(
f: (b: B) => Effect.Effect<readonly [C, B], E1, R1> f: (b: B) => Effect.Effect<readonly [C, B], E1, R1>
) => self.modify(a => ) => self.modify(a =>
Effect.flatMap(f(get(a)), ([c, next]) => Effect.succeed([ Effect.flatMap(f(get(a)), ([c, next]) => Effect.succeed([c, set(a, next)]))
c,
set.length >= 2
? (set as (parent: A, b: B) => A)(a, next)
: (set as (b: B) => (parent: A) => A)(next)(a),
]))
), ),
}) })
export const mapEffect = <A, ER, RR, EW, RW, B, EGet = never, RGet = never, ESet = never, RSet = never>( export const mapEffect = <A, ER, RR, EW, RW, B, EGet = never, RGet = never, ESet = never, RSet = never>(
self: Lens<A, ER, RR, EW, RW>, self: Lens<A, ER, RR, EW, RW>,
get: (a: NoInfer<A>) => Effect.Effect<B, EGet, RGet>, get: (a: NoInfer<A>) => Effect.Effect<B, EGet, RGet>,
set: { set: (a: NoInfer<A>, b: B) => Effect.Effect<NoInfer<A>, ESet, RSet>,
(b: B): (parent: NoInfer<A>) => Effect.Effect<NoInfer<A>, ESet, RSet>
(parent: NoInfer<A>, b: B): Effect.Effect<NoInfer<A>, ESet, RSet>
},
): Lens<B, ER | EGet, RR | RGet, EW | ESet, RW | RSet> => make({ ): Lens<B, ER | EGet, RR | RGet, EW | ESet, RW | RSet> => make({
get get() { return Effect.flatMap(self.get, get) }, get get() { return Effect.flatMap(self.get, get) },
get changes() { return Stream.mapEffect(self.changes, get) }, get changes() { return Stream.mapEffect(self.changes, get) },
@@ -110,9 +99,7 @@ export const mapEffect = <A, ER, RR, EW, RW, B, EGet = never, RGet = never, ESet
b => Effect.flatMap( b => Effect.flatMap(
f(b), f(b),
([c, bNext]) => Effect.flatMap( ([c, bNext]) => Effect.flatMap(
set.length >= 2 set(a, bNext),
? (set as (parent: A, b: B) => Effect.Effect<A, ESet, RSet>)(a, bNext)
: (set as (b: B) => (parent: A) => Effect.Effect<A, ESet, RSet>)(bNext)(a),
nextA => Effect.succeed([c, nextA] as const), nextA => Effect.succeed([c, nextA] as const),
), ),
) )
@@ -131,13 +118,12 @@ export const unwrap = <A, ER, RR, EW, RW, E1, R1>(
Effect.gen(function*() { Effect.gen(function*() {
const myArrayRef = yield* SubscriptionRef.make([12, 38, 69]) const myChunkRef = yield* SubscriptionRef.make(Chunk.make(12, 38, 69) as Chunk.Chunk<number>)
const myArrayLens = fromSubscriptionRef(myArrayRef)
const arrayValueLens = map(myArrayLens, flow(Array.get(1), Option.getOrThrow), (a, b) => Array.replace(a, 1, b))
const myChunkRef = yield* SubscriptionRef.make(Chunk.make([12, 38, 69]))
const myChunkLens = fromSubscriptionRef(myChunkRef) const myChunkLens = fromSubscriptionRef(myChunkRef)
const chunkValueLens = mapEffect(myChunkLens, Chunk.get(1), (a, b) => Effect.succeed(Chunk.replace(a, 1, b))) const chunkValueLens = mapEffect(myChunkLens, Chunk.get(1), (a, b) => Effect.succeed(Chunk.replace(a, 1, b)))
console.log(yield* myChunkRef.get)
console.log(yield* chunkValueLens.get)
}).pipe( }).pipe(
Effect.runSync Effect.runSync
) )