diff --git a/packages/effect-fc/src/Lens.ts b/packages/effect-fc/src/Lens.ts index cd49464..1d00bfa 100644 --- a/packages/effect-fc/src/Lens.ts +++ b/packages/effect-fc/src/Lens.ts @@ -5,7 +5,7 @@ import * as Writable from "./Writable.js" export const LensTypeId: unique symbol = Symbol.for("@effect-fc/Lens/Lens") export type LensTypeId = typeof LensTypeId -export interface Lens +export interface Lens extends LensPrototype, Subscribable.Subscribable, Writable.Writable {} @@ -29,7 +29,7 @@ export const make = ( readonly get: Effect.Effect readonly changes: Stream.Stream } & ( - | { readonly modify: (f: (a: A) => readonly [B, A]) => Effect.Effect } + | { readonly modify: (f: (a: A) => Effect.Effect) => Effect.Effect } | { readonly set: (value: A) => Effect.Effect } ) ): Lens => Object.setPrototypeOf({ @@ -37,10 +37,11 @@ export const make = ( changes: options.changes, modify: Predicate.hasProperty(options, "modify") ? options.modify - : (f: (a: A) => readonly [B, A]) => Effect.flatMap(options.get, a => { - const [b, next] = f(a) - return Effect.map(options.set(next), () => b) - }), + : (f: (a: A) => Effect.Effect) => + Effect.flatMap(options.get, a => + Effect.flatMap(f(a), ([b, next]) => Effect.map(options.set(next), () => b) + ) + ), }, LensPrototype) /** @@ -51,13 +52,15 @@ export const fromSubscriptionRef = ( ): Lens => make({ get: ref.get, changes: ref.changes, - modify: ref.modify, + modify: ref.modifyEffect, }) export const unwrap = ( effect: Effect.Effect, E1, R1> ): Lens => make({ - get: Effect.flatMap(effect, p => p.get), - changes: Stream.unwrap(Effect.map(effect, p => p.changes)), - set: (v: A) => Effect.flatMap(effect, p => p.modify(() => [undefined as void as any, v]) as any), + 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)), }) diff --git a/packages/effect-fc/src/Writable.ts b/packages/effect-fc/src/Writable.ts index b415702..9883fd0 100644 --- a/packages/effect-fc/src/Writable.ts +++ b/packages/effect-fc/src/Writable.ts @@ -5,7 +5,7 @@ export const WritableTypeId: unique symbol = Symbol.for("@effect-fc/Writable/Wri export type WritableTypeId = typeof WritableTypeId export interface Writable extends WritablePrototype { - readonly modify: (f: (a: A) => readonly [B, A]) => Effect.Effect + readonly modify: (f: (a: A) => Effect.Effect) => Effect.Effect } @@ -25,7 +25,7 @@ export const isWritable = (u: unknown): u is Writable * Construct a `Writable` from a `modify` function. */ export const make = ( - modify: (f: (a: A) => readonly [B, A]) => Effect.Effect + modify: (f: (a: A) => Effect.Effect) => Effect.Effect, ): Writable => Object.setPrototypeOf({ modify }, WritablePrototype) /** @@ -33,6 +33,8 @@ export const make = ( */ export const unwrap = ( effect: Effect.Effect, E1, R1> -): Writable => make(( - f: (a: A) => readonly [B, A] -) => Effect.flatMap(effect, w => w.modify(f))) +): Writable => make( + ( + f: (a: A) => Effect.Effect + ) => Effect.flatMap(effect, w => w.modify(f)) +)