Ref

cats.effect.kernel.Ref
See theRef companion object
abstract class Ref[F[_], A] extends RefSource[F, A] with RefSink[F, A]

A thread-safe, concurrent mutable reference.

Provides safe concurrent access and modification of its content, but no functionality for synchronisation, which is instead handled by Deferred. For this reason, a Ref is always initialised to a value.

The default implementation is nonblocking and lightweight, consisting essentially of a purely functional wrapper over an AtomicReference. Consequently it ''must not'' be used to store mutable data as AtomicReference#compareAndSet and friends are dependent upon object reference equality.

See also cats.effect.std.AtomicCell class from cats-effect-std for an alternative that ensures exclusive access and effectual updates.

If your contents are an immutable Map[K, V], and all your operations are per-key, consider using cats.effect.std.MapRef.

Attributes

Companion:
object
Source:
Ref.scala
Graph
Supertypes
trait RefSink[F, A]
trait RefSource[F, A]
class Object
trait Matchable
class Any

Members list

Concise view

Value members

Abstract methods

def access: F[(A, A => F[Boolean])]

Obtains a snapshot of the current value, and a setter for updating it.

Obtains a snapshot of the current value, and a setter for updating it.

The setter attempts to modify the contents from the snapshot to the new value (and return true). If it cannot do this (because the contents changed since taking the snapshot), the setter is a noop and returns false.

Satisfies: r.access.map(_._1) == r.get and r.access.flatMap { case (v, setter) => setter(f(v)) } == r.tryUpdate(f).map(_.isDefined).

Attributes

Source:
Ref.scala
def modify[B](f: A => (A, B)): F[B]

Like tryModify but retries until the update has been successfully made.

Like tryModify but retries until the update has been successfully made.

Attributes

Source:
Ref.scala
def modifyState[B](state: State[A, B]): F[B]

Like tryModifyState but retries the modification until successful.

Like tryModifyState but retries the modification until successful.

Attributes

Source:
Ref.scala
def tryModify[B](f: A => (A, B)): F[Option[B]]

Like tryUpdate but allows the update function to return an output value of type B. The returned action completes with None if the value is not updated successfully and Some(b) otherwise.

Like tryUpdate but allows the update function to return an output value of type B. The returned action completes with None if the value is not updated successfully and Some(b) otherwise.

Attributes

Source:
Ref.scala
def tryModifyState[B](state: State[A, B]): F[Option[B]]

Update the value of this Ref with a state computation.

Update the value of this Ref with a state computation.

The current value of this Ref is used as the initial state and the computed output state is stored in this Ref after computation completes. If a concurrent modification occurs, None is returned.

Attributes

Source:
Ref.scala
def tryUpdate(f: A => A): F[Boolean]

Attempts to modify the current value once, returning false if another concurrent modification completes between the time the variable is read and the time it is set.

Attempts to modify the current value once, returning false if another concurrent modification completes between the time the variable is read and the time it is set.

Attributes

Source:
Ref.scala
def update(f: A => A): F[Unit]

Modifies the current value using the supplied update function. If another modification occurs between the time the current value is read and subsequently updated, the modification is retried using the new value. Hence, f may be invoked multiple times.

Modifies the current value using the supplied update function. If another modification occurs between the time the current value is read and subsequently updated, the modification is retried using the new value. Hence, f may be invoked multiple times.

Satisfies: r.update(_ => a) == r.set(a)

Attributes

Source:
Ref.scala

Concrete methods

def flatModify[B](f: A => (A, F[B]))(implicit F: MonadCancel[F, _]): F[B]

Like modify but schedules resulting effect right after modification.

Like modify but schedules resulting effect right after modification.

Useful for implementing effectful transition of a state machine, in which an effect is performed based on current state and the state must be updated to reflect that this effect will be performed.

Both modification and finalizer are within a single uncancelable region, to prevent canceled finalizers from leaving the Ref's value permanently out of sync with effects actually performed. if you need cancellation mechanic in finalizer please see flatModifyFull.

Attributes

See also:
Source:
Ref.scala
def flatModifyFull[B](f: (Poll[F], A) => (A, F[B]))(implicit F: MonadCancel[F, _]): F[B]

Like modify but schedules resulting effect right after modification.

Like modify but schedules resulting effect right after modification.

Unlike flatModify finalizer cancellation could be unmasked via supplied Poll. Modification itself is still uncancelable.

When used as part of a state machine, cancelable regions should usually have an onCancel finalizer to update the state to reflect that the effect will not be performed.

Attributes

See also:
Source:
Ref.scala
def flatModifyState[B](state: State[A, F[B]])(implicit F: MonadCancel[F, _]): F[B]

Like modifyState but schedules resulting effect right after state computation & update.

Like modifyState but schedules resulting effect right after state computation & update.

Both modification and finalizer are uncancelable, if you need cancellation mechanic in finalizer please see flatModifyStateFull.

Attributes

See also:
Source:
Ref.scala
def flatModifyStateFull[B](state: Poll[F] => State[A, F[B]])(implicit F: MonadCancel[F, _]): F[B]

Like modifyState but schedules resulting effect right after modification.

Like modifyState but schedules resulting effect right after modification.

Unlike flatModifyState finalizer cancellation could be masked via supplied Poll[F]. Modification itself is still uncancelable.

Attributes

See also:
Source:
Ref.scala
def getAndSet(a: A): F[A]

Replaces the current value with a, returning the previous value.

Replaces the current value with a, returning the previous value.

Attributes

Source:
Ref.scala
def getAndUpdate(f: A => A): F[A]

Updates the current value using f and returns the previous value.

Updates the current value using f and returns the previous value.

In case of retries caused by concurrent modifications, the returned value will be the last one before a successful update.

Attributes

Source:
Ref.scala
def mapK[G[_]](f: FunctionK[F, G])(implicit F: Functor[F]): Ref[G, A]

Modify the context F using transformation f.

Modify the context F using transformation f.

Attributes

Source:
Ref.scala
def updateAndGet(f: A => A): F[A]

Updates the current value using f, and returns the updated value.

Updates the current value using f, and returns the updated value.

Attributes

Source:
Ref.scala

Inherited methods

def get: F[A]

Obtains the current value.

Obtains the current value.

Since Ref is always guaranteed to have a value, the returned action completes immediately after being bound.

Attributes

Inherited from:
RefSource
Source:
Ref.scala
def set(a: A): F[Unit]

Sets the current value to a.

Sets the current value to a.

The returned action completes after the reference has been successfully set.

Attributes

Inherited from:
RefSink
Source:
Ref.scala