From 99bdd6a3ec18b7c4021c12325e7295e0a1cdb471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 23 Mar 2026 07:57:21 +0100 Subject: [PATCH] Fix --- packages/effect-fc/src/Lens.ts | 55 ++++++++++++++++------------------ 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/packages/effect-fc/src/Lens.ts b/packages/effect-fc/src/Lens.ts index 54d5437..1f23b89 100644 --- a/packages/effect-fc/src/Lens.ts +++ b/packages/effect-fc/src/Lens.ts @@ -1,26 +1,37 @@ -import { Effect, Pipeable, Predicate, Readable, Stream, Subscribable, type SubscriptionRef } from "effect" +import { Effect, Pipeable, Predicate, Readable, Stream, Subscribable, SubscriptionRef } from "effect" export const LensTypeId: unique symbol = Symbol.for("@effect-fc/Lens/Lens") export type LensTypeId = typeof LensTypeId -export interface Lens -extends Subscribable.Subscribable, LensPrototype { +export interface Lens +extends Subscribable.Subscribable, LensPrototype { + readonly set: (a: A) => Effect.Effect +} + + +export interface LensPrototype extends Pipeable.Pipeable { + readonly [LensTypeId]: LensTypeId readonly modify: ( f: (a: A) => Effect.Effect ) => Effect.Effect } - -export interface LensPrototype extends Pipeable.Pipeable { - readonly [LensTypeId]: LensTypeId -} - -export const LensPrototype: LensPrototype = Object.freeze({ +export const LensPrototype: LensPrototype = Object.freeze({ ...Pipeable.Prototype, [Readable.TypeId]: Readable.TypeId, [Subscribable.TypeId]: Subscribable.TypeId, [LensTypeId]: LensTypeId, + + modify( + this: Lens, + f: (a: A) => Effect.Effect, + ) { + return Effect.flatMap( + this.get, + a => Effect.flatMap(f(a), ([b, next]) => Effect.as(this.set(next), b) + )) + }, } as const) @@ -30,21 +41,9 @@ export const make = ( options: { readonly get: Effect.Effect readonly changes: Stream.Stream - } & ( - | { readonly set: (value: A) => Effect.Effect } - | { readonly modify: (f: (a: A) => Effect.Effect) => Effect.Effect } - ) -): Lens => Object.setPrototypeOf({ - get: options.get, - changes: options.changes, - modify: Predicate.hasProperty(options, "modify") - ? options.modify - : (f: (a: A) => Effect.Effect) => - Effect.flatMap(options.get, a => - Effect.flatMap(f(a), ([b, next]) => Effect.as(options.set(next), b) - ) - ), -}, LensPrototype) + readonly set: (a: A) => Effect.Effect + } +): Lens => Object.setPrototypeOf({ ...options }, LensPrototype) /** * Creates a `Lens` that directly proxies a `SubscriptionRef`. @@ -53,8 +52,8 @@ export const fromSubscriptionRef = ( ref: SubscriptionRef.SubscriptionRef ): Lens => make({ get: ref.get, - changes: ref.changes, - modify: ref.modifyEffect, + get changes() { return ref.changes }, + set: a => SubscriptionRef.set(ref, a), }) export const unwrap = ( @@ -62,7 +61,5 @@ export const unwrap = ( ): Lens => make({ get: Effect.flatMap(effect, l => l.get), changes: Stream.unwrap(Effect.map(effect, l => l.changes)), - modify: ( - f: (a: A) => Effect.Effect - ) => Effect.flatMap(effect, l => l.modify(f)), + set: a => Effect.flatMap(effect, l => l.set(a)), })