SynchronizedRef.ts
SynchronizedRef.ts overview
Section titled “SynchronizedRef.ts overview”Stores mutable state whose updates run one at a time.
A SynchronizedRef<A> behaves like a Ref<A> for reading and simple state
storage, but update and modify operations are serialized so each change sees
a consistent current value. This is especially useful when the next value is
computed by an effect, because the effectful transition is still protected
from concurrent updates. This module includes constructors, reads, writes,
updates, partial updates, and effectful update helpers.
Since v2.0.0
Exports Grouped by Category
Section titled “Exports Grouped by Category”constructors
Section titled “constructors”Creates a SynchronizedRef from an initial value, wrapped in an Effect.
When to use
Use to create a SynchronizedRef inside an Effect program when later updates
may run effects and must be serialized.
Details
The returned effect constructs a fresh SynchronizedRef by delegating to
makeUnsafe when the effect is evaluated.
See
makeUnsafefor synchronous construction when the caller controls safe initializationRef.makefor a plainRefwhen updates do not need effectful synchronization
Signature
declare const make: <A>(value: A) => Effect.Effect<SynchronizedRef<A>>Since v2.0.0
makeUnsafe
Section titled “makeUnsafe”Creates a SynchronizedRef synchronously from an initial value.
When to use
Use when you need synchronous SynchronizedRef construction outside an
Effect workflow.
Signature
declare const makeUnsafe: <A>(value: A) => SynchronizedRef<A>Since v4.0.0
getters
Section titled “getters”Returns an Effect that reads the current value of the SynchronizedRef.
When to use
Use to read the current value of a SynchronizedRef inside an Effect
program without changing it.
See
getUnsafefor synchronous reads when the caller controls safe access outsideEffect
Signature
declare const get: <A>(self: SynchronizedRef<A>) => Effect.Effect<A>Since v2.0.0
getUnsafe
Section titled “getUnsafe”Reads the current value synchronously, bypassing the Effect API and the
ref’s semaphore.
When to use
Use when you need immediate synchronous access to a SynchronizedRef value
in low-level code that can safely read outside an Effect.
See
getfor the Effect-wrapped read when composing inside Effect programs
Signature
declare const getUnsafe: <A>(self: SynchronizedRef<A>) => ASince v4.0.0
models
Section titled “models”SynchronizedRef (interface)
Section titled “SynchronizedRef (interface)”A mutable reference whose update and modify operations are serialized with an internal semaphore, including effectful transformations.
When to use
Use when shared state may be updated by multiple fibers and each update, including effectful state transitions, must observe one current value and run one at a time.
See
Ref.Reffor a plainRefwhen updates do not need effectful synchronization
Signature
export interface SynchronizedRef<in out A> extends Ref.Ref<A> { readonly [TypeId]: typeof TypeId readonly backing: Ref.Ref<A> readonly semaphore: Semaphore.Semaphore}Since v2.0.0
mutations
Section titled “mutations”getAndSet
Section titled “getAndSet”Sets a new value atomically and returns the previous value, serialized by the ref’s semaphore.
When to use
Use to replace a SynchronizedRef with a known value when the previous value
is also needed.
See
setfor setting a value without returning the previous valuesetAndGetfor setting a value and returning the new valuegetAndUpdatefor deriving the new value from the current value
Signature
declare const getAndSet: { <A>(value: A): (self: SynchronizedRef<A>) => Effect.Effect<A> <A>(self: SynchronizedRef<A>, value: A): Effect.Effect<A>}Since v2.0.0
getAndUpdate
Section titled “getAndUpdate”Updates the current value atomically with a function and returns the previous value, serialized by the ref’s semaphore.
When to use
Use to run a pure SynchronizedRef state update when the previous stored
value is also needed.
See
updatefor updating without returning a valueupdateAndGetfor updating and returning the new valuegetAndUpdateEffectfor effectful updates that return the previous value
Signature
declare const getAndUpdate: { <A>(f: (a: A) => A): (self: SynchronizedRef<A>) => Effect.Effect<A> <A>(self: SynchronizedRef<A>, f: (a: A) => A): Effect.Effect<A>}Since v2.0.0
getAndUpdateEffect
Section titled “getAndUpdateEffect”Runs an effectful update atomically while holding the ref’s semaphore, sets the new value if the effect succeeds, and returns the previous value.
When to use
Use when you need an effectful SynchronizedRef state transition to return
the previous stored value.
See
getAndUpdatefor pure updates that return the previous valueupdateEffectfor effectful updates without returning a valueupdateAndGetEffectfor effectful updates that return the new valuemodifyEffectfor effectful updates with a custom return valuegetAndUpdateSomeEffectfor conditional effectful updates that return the previous value
Signature
declare const getAndUpdateEffect: { <A, R, E>(f: (a: A) => Effect.Effect<A, E, R>): (self: SynchronizedRef<A>) => Effect.Effect<A, E, R> <A, R, E>(self: SynchronizedRef<A>, f: (a: A) => Effect.Effect<A, E, R>): Effect.Effect<A, E, R>}Since v2.0.0
getAndUpdateSome
Section titled “getAndUpdateSome”Applies a partial update atomically and returns the previous value. If the
function returns Option.some, the ref is updated; if it returns
Option.none, the ref is left unchanged.
When to use
Use to return the previous SynchronizedRef value while applying a pure
conditional update.
See
getAndUpdatefor always applying a pure updateupdateSomefor applying a pure conditional update without returning the previous value
Signature
declare const getAndUpdateSome: { <A>(pf: (a: A) => Option.Option<A>): (self: SynchronizedRef<A>) => Effect.Effect<A> <A>(self: SynchronizedRef<A>, pf: (a: A) => Option.Option<A>): Effect.Effect<A>}Since v2.0.0
getAndUpdateSomeEffect
Section titled “getAndUpdateSomeEffect”Runs an effectful partial update atomically while holding the ref’s semaphore
and returns the previous value. Option.some updates the ref; Option.none
leaves it unchanged.
When to use
Use to return the previous SynchronizedRef value while running an effectful
conditional update.
See
getAndUpdateSomefor the pure conditional variantupdateSomeEffectfor effectful conditional updates without returning the previous value
Signature
declare const getAndUpdateSomeEffect: { <A, R, E>(pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>): (self: SynchronizedRef<A>) => Effect.Effect<A, E, R> <A, R, E>(self: SynchronizedRef<A>, pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>): Effect.Effect<A, E, R>}Since v2.0.0
modify
Section titled “modify”Computes a return value and a new ref value atomically, stores the new value, and returns the computed result.
When to use
Use to derive a separate result and the next stored SynchronizedRef value
from the same current value in one serialized pure update.
See
modifyEffectfor effectfully deriving both the result and next stored valuemodifySomefor deriving a result and optionally updating the stored valueupdateAndGetfor returning the new stored value instead of a separate result
Signature
declare const modify: { <A, B>(f: (a: A) => readonly [B, A]): (self: SynchronizedRef<A>) => Effect.Effect<B> <A, B>(self: SynchronizedRef<A>, f: (a: A) => readonly [B, A]): Effect.Effect<B>}Since v2.0.0
modifyEffect
Section titled “modifyEffect”Runs an effectful modification atomically while holding the ref’s semaphore, stores the new value if the effect succeeds, and returns the computed result.
When to use
Use to effectfully compute both a separate return value and the next stored
SynchronizedRef value in one serialized update.
See
modifyfor the pure variantupdateEffectfor effectfully storing a new value without a separate result
Signature
declare const modifyEffect: { <A, B, E, R>(f: (a: A) => Effect.Effect<readonly [B, A], E, R>): (self: SynchronizedRef<A>) => Effect.Effect<B, E, R> <A, B, E, R>(self: SynchronizedRef<A>, f: (a: A) => Effect.Effect<readonly [B, A], E, R>): Effect.Effect<B, E, R>}Since v2.0.0
modifySome
Section titled “modifySome”Computes a return value and an optional new ref value atomically.
Option.some updates the ref; Option.none leaves it unchanged.
When to use
Use to compute a return value while optionally updating a SynchronizedRef
under its semaphore.
See
modifyfor always storing a new valueupdateSomefor optional updates without a separate return value
Signature
declare const modifySome: { <B, A>(pf: (a: A) => readonly [B, Option.Option<A>]): (self: SynchronizedRef<A>) => Effect.Effect<B> <A, B>(self: SynchronizedRef<A>, pf: (a: A) => readonly [B, Option.Option<A>]): Effect.Effect<B>}Since v2.0.0
modifySomeEffect
Section titled “modifySomeEffect”Runs an effectful modification atomically while holding the ref’s semaphore.
The effect computes a return value and an optional new ref value;
Option.some updates the ref and Option.none leaves it unchanged.
When to use
Use to effectfully compute a return value while optionally updating the
stored SynchronizedRef value.
See
modifySomefor the pure variantupdateSomeEffectfor effectful optional updates without a separate return value
Signature
declare const modifySomeEffect: { <A, B, R, E>( fallback: B, pf: (a: A) => Effect.Effect<readonly [B, Option.Option<A>], E, R> ): (self: SynchronizedRef<A>) => Effect.Effect<B, E, R> <A, B, R, E>( self: SynchronizedRef<A>, pf: (a: A) => Effect.Effect<readonly [B, Option.Option<A>], E, R> ): Effect.Effect<B, E, R>}Since v2.0.0
Sets the value of the SynchronizedRef, serialized by the ref’s semaphore.
When to use
Use to replace the current value of a SynchronizedRef with a known value
while keeping the write serialized with other synchronized updates.
See
getAndSetfor replacing the value when the previous value is neededsetAndGetfor replacing the value when the new value should be returnedupdatefor deriving the next value from the current value
Signature
declare const set: { <A>(value: A): (self: SynchronizedRef<A>) => Effect.Effect<void> <A>(self: SynchronizedRef<A>, value: A): Effect.Effect<void>}Since v2.0.0
setAndGet
Section titled “setAndGet”Sets the value of the SynchronizedRef and returns the new value.
When to use
Use to replace the current SynchronizedRef value with a known value and
return that new value.
See
setfor setting without returning a valuegetAndSetfor setting while returning the previous value
Signature
declare const setAndGet: { <A>(value: A): (self: SynchronizedRef<A>) => Effect.Effect<A> <A>(self: SynchronizedRef<A>, value: A): Effect.Effect<A>}Since v2.0.0
update
Section titled “update”Updates the value of the SynchronizedRef with a function, serialized by the
ref’s semaphore.
When to use
Use to apply a pure state transition to a SynchronizedRef as a serialized
Effect.
See
updateEffectfor effectfully deriving the next valueupdateAndGetfor returning the new stored valuegetAndUpdatefor returning the previous stored value
Signature
declare const update: { <A>(f: (a: A) => A): (self: SynchronizedRef<A>) => Effect.Effect<void> <A>(self: SynchronizedRef<A>, f: (a: A) => A): Effect.Effect<void>}Since v2.0.0
updateAndGet
Section titled “updateAndGet”Updates the value of the SynchronizedRef with a function and returns the
new value.
When to use
Use to apply a pure SynchronizedRef state transition and return the new
stored value.
See
updatefor updating without returning the new valuegetAndUpdatefor updating while returning the previous value
Signature
declare const updateAndGet: { <A>(f: (a: A) => A): (self: SynchronizedRef<A>) => Effect.Effect<A> <A>(self: SynchronizedRef<A>, f: (a: A) => A): Effect.Effect<A>}Since v2.0.0
updateAndGetEffect
Section titled “updateAndGetEffect”Runs an effectful update while holding the ref’s semaphore, stores the new value if the effect succeeds, and returns that new value.
When to use
Use to run an effectful SynchronizedRef state transition and return the new
stored value.
See
updateEffectfor effectful updates without returning the new valueupdateAndGetfor the pure variant
Signature
declare const updateAndGetEffect: { <A, R, E>(f: (a: A) => Effect.Effect<A, E, R>): (self: SynchronizedRef<A>) => Effect.Effect<A, E, R> <A, R, E>(self: SynchronizedRef<A>, f: (a: A) => Effect.Effect<A, E, R>): Effect.Effect<A, E, R>}Since v2.0.0
updateEffect
Section titled “updateEffect”Runs an effectful update while holding the ref’s semaphore and stores the new value if the effect succeeds.
When to use
Use to run an effectful state transition on a SynchronizedRef when storing
the new value is the only result you need.
See
updatefor a pure state transitiongetAndUpdateEffectfor returning the previous stored valueupdateAndGetEffectfor returning the new stored valuemodifyEffectfor returning a separate result while storing a new valueupdateSomeEffectfor effectfully applying only some state transitions
Signature
declare const updateEffect: { <A, R, E>(f: (a: A) => Effect.Effect<A, E, R>): (self: SynchronizedRef<A>) => Effect.Effect<void, E, R> <A, R, E>(self: SynchronizedRef<A>, f: (a: A) => Effect.Effect<A, E, R>): Effect.Effect<void, E, R>}Since v2.0.0
updateSome
Section titled “updateSome”Applies a partial update to the current value. Option.some stores the new
value; Option.none leaves the ref unchanged.
When to use
Use to apply a pure conditional SynchronizedRef update without returning a
value.
See
updatefor always applying a pure updateupdateSomeAndGetfor returning the resulting current value
Signature
declare const updateSome: { <A>(f: (a: A) => Option.Option<A>): (self: SynchronizedRef<A>) => Effect.Effect<void> <A>(self: SynchronizedRef<A>, f: (a: A) => Option.Option<A>): Effect.Effect<void>}Since v2.0.0
updateSomeAndGet
Section titled “updateSomeAndGet”Applies a partial update and returns the resulting current value.
Option.some stores and returns the new value; Option.none returns the
unchanged value.
When to use
Use to apply a pure conditional SynchronizedRef update and return the
resulting current value.
See
updateSomefor conditional updates without returning a valueupdateAndGetfor always applying a pure update and returning the new value
Signature
declare const updateSomeAndGet: { <A>(pf: (a: A) => Option.Option<A>): (self: SynchronizedRef<A>) => Effect.Effect<A> <A>(self: SynchronizedRef<A>, pf: (a: A) => Option.Option<A>): Effect.Effect<A>}Since v2.0.0
updateSomeAndGetEffect
Section titled “updateSomeAndGetEffect”Runs an effectful partial update while holding the ref’s semaphore and
returns the resulting current value. Option.some stores and returns the new
value; Option.none returns the unchanged value.
When to use
Use to run an effectful conditional SynchronizedRef update and return the
resulting current value.
See
updateSomeEffectfor effectful conditional updates without returning a valueupdateAndGetEffectfor effectful updates that always store and return a new value
Signature
declare const updateSomeAndGetEffect: { <A, R, E>(pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>): (self: SynchronizedRef<A>) => Effect.Effect<A, E, R> <A, R, E>(self: SynchronizedRef<A>, pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>): Effect.Effect<A, E, R>}Since v2.0.0
updateSomeEffect
Section titled “updateSomeEffect”Runs an effectful partial update while holding the ref’s semaphore.
Option.some stores the new value; Option.none leaves the ref unchanged.
When to use
Use to run an effectful conditional SynchronizedRef update without
returning a value.
See
updateSomefor the pure conditional variantupdateEffectfor effectful updates that always store a new value
Signature
declare const updateSomeEffect: { <A, R, E>( pf: (a: A) => Effect.Effect<Option.Option<A>, E, R> ): (self: SynchronizedRef<A>) => Effect.Effect<void, E, R> <A, R, E>(self: SynchronizedRef<A>, pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>): Effect.Effect<void, E, R>}Since v2.0.0