0.2.5 #43

Merged
Thilawyn merged 94 commits from next into master 2026-03-31 21:01:13 +02:00
Showing only changes of commit 47073f2bf1 - Show all commits

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" import type { NoSuchElementException } from "effect/Cause"
@@ -91,6 +91,28 @@ export const fromSubscriptionRef = <A>(
) => ref.modifyEffect(f), ) => 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`. * Flattens an effectful `Lens`.
*/ */