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
)