From 88ad7cb1ac376b244e4db7651b0ad7162e5170a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 23 Mar 2026 21:13:35 +0100 Subject: [PATCH] Tests --- packages/effect-fc/src/Lens.ts | 52 +++++++++++++++++----------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/effect-fc/src/Lens.ts b/packages/effect-fc/src/Lens.ts index 4e3230f..0653ad2 100644 --- a/packages/effect-fc/src/Lens.ts +++ b/packages/effect-fc/src/Lens.ts @@ -1,4 +1,4 @@ -import { Array, Effect, Pipeable, Predicate, Readable, Stream, Subscribable, SubscriptionRef } from "effect" +import { Array, Chunk, Effect, flow, Option, Pipeable, Predicate, Readable, Stream, Subscribable, SubscriptionRef } from "effect" export const LensTypeId: unique symbol = Symbol.for("@effect-fc/Lens/Lens") @@ -73,50 +73,46 @@ export const fromSubscriptionRef = ( export const map = ( self: Lens, - options: { - readonly get: (a: A) => B, - readonly set: { - (b: B): (parent: A) => A - (parent: A, b: B): A - }, + get: (a: NoInfer) => B, + set: { + (b: B): (parent: NoInfer) => NoInfer + (parent: NoInfer, b: B): NoInfer }, ): Lens => make({ - get get() { return Effect.map(self.get, options.get) }, - get changes() { return Stream.map(self.changes, options.get) }, + get get() { return Effect.map(self.get, get) }, + get changes() { return Stream.map(self.changes, get) }, modify: ( f: (b: B) => Effect.Effect ) => self.modify(a => - Effect.flatMap(f(options.get(a)), ([c, next]) => Effect.succeed([ + Effect.flatMap(f(get(a)), ([c, next]) => Effect.succeed([ c, - options.set.length >= 2 - ? (options.set as (parent: A, b: B) => A)(a, next) - : (options.set as (b: B) => (parent: A) => A)(next)(a), + set.length >= 2 + ? (set as (parent: A, b: B) => A)(a, next) + : (set as (b: B) => (parent: A) => A)(next)(a), ])) ), }) export const mapEffect = ( self: Lens, - options: { - readonly get: (a: A) => Effect.Effect, - readonly set: { - (b: B): (parent: A) => Effect.Effect - (parent: A, b: B): Effect.Effect - }, + get: (a: NoInfer) => Effect.Effect, + set: { + (b: B): (parent: NoInfer) => Effect.Effect, ESet, RSet> + (parent: NoInfer, b: B): Effect.Effect, ESet, RSet> }, ): Lens => make({ - get get() { return Effect.flatMap(self.get, options.get) }, - get changes() { return Stream.mapEffect(self.changes, options.get) }, + get get() { return Effect.flatMap(self.get, get) }, + get changes() { return Stream.mapEffect(self.changes, get) }, modify: ( f: (b: B) => Effect.Effect ) => self.modify(a => Effect.flatMap( - options.get(a), + 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, bNext) - : (options.set as (b: B) => (parent: A) => Effect.Effect)(bNext)(a), + set.length >= 2 + ? (set as (parent: A, b: B) => Effect.Effect)(a, bNext) + : (set as (b: B) => (parent: A) => Effect.Effect)(bNext)(a), nextA => Effect.succeed([c, nextA] as const), ), ) @@ -137,7 +133,11 @@ export const unwrap = ( Effect.gen(function*() { const myArrayRef = yield* SubscriptionRef.make([12, 38, 69]) const myArrayLens = fromSubscriptionRef(myArrayRef) - const valueLens = mapEffect(myArrayLens, { get: Array.get(1), set: (a, b) => Array.replace(a, 1, b) }) + 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 chunkValueLens = mapEffect(myChunkLens, Chunk.get(1), (a, b) => Effect.succeed(Chunk.replace(a, 1, b))) }).pipe( Effect.runSync )