0.2.5 #43
@@ -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`.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user