Add fromRef
Some checks failed
Lint / lint (push) Failing after 44s

This commit is contained in:
Julien Valverdé
2026-03-24 23:05:22 +01:00
parent 13a12f5938
commit 47073f2bf1

View File

@@ -1,4 +1,4 @@
import { Array, Chunk, Effect, Function, Pipeable, Predicate, Readable, Stream, Subscribable, type SubscriptionRef } from "effect"
import { Array, Chunk, Effect, Function, Pipeable, Predicate, Readable, type Ref, Stream, Subscribable, type SubscriptionRef } from "effect"
import type { NoSuchElementException } from "effect/Cause"
@@ -91,6 +91,28 @@ export const fromSubscriptionRef = <A>(
) => ref.modifyEffect(f),
})
/**
* Creates a `Lens` that proxies a `Ref`.
*
* Note: since `Ref` does not provide any kind of reactivity mechanism, the produced `Lens` will be non-reactive.
* This means its `changes` stream will only emit the current value once when evaluated and nothing else.
*/
export const fromRef = <A>(
ref: Ref.Ref<A>
): Lens<A, never, never, never, never> => make({
get get() { return ref.get },
get changes() { return Stream.unwrap(Effect.map(ref.get, Stream.make)) },
modify: <B, E1 = never, R1 = never>(
f: (a: A) => Effect.Effect<readonly [B, A], E1, R1>
) => Effect.flatMap(ref.get, a => Effect.flatMap(
f(a),
([b, next]) => Effect.flatMap(
ref.set(next),
() => Effect.succeed(b),
),
)),
})
/**
* Flattens an effectful `Lens`.
*/