Hyperlinkv0.8.0-beta.28

TxRef

TxRef.modifyconsteffect/TxRef.ts:163
<A, R>(f: (current: NoInfer<A>) => [returnValue: R, newValue: A]): (
  self: TxRef<A>
) => Effect.Effect<R>
<A, R>(
  self: TxRef<A>,
  f: (current: A) => [returnValue: R, newValue: A]
): Effect.Effect<R>

Modifies the value of the TxRef using the provided function.

When to use

Use to update a TxRef and return a computed result from the same transaction step.

Example (Modifying transactional references)

import { Effect, TxRef } from "effect"

const program = Effect.gen(function*() {
  const counter = yield* TxRef.make(0)

  // Modify and return both old and new value
  const result = yield* TxRef.modify(counter, (current) => [current * 2, current + 1])

  console.log(result) // 0 (the return value: current * 2)
  console.log(yield* TxRef.get(counter)) // 1 (the new value: current + 1)
})
combinators
Source effect/TxRef.ts:16321 lines
export const modify: {
  <A, R>(f: (current: NoInfer<A>) => [returnValue: R, newValue: A]): (self: TxRef<A>) => Effect.Effect<R>
  <A, R>(self: TxRef<A>, f: (current: A) => [returnValue: R, newValue: A]): Effect.Effect<R>
} = dual(2, <A, R>(
  self: TxRef<A>,
  f: (current: A) => [returnValue: R, newValue: A]
): Effect.Effect<R> =>
  Effect.Transaction.pipe(
    Effect.flatMap((state) =>
      Effect.sync(() => {
        if (!state.journal.has(self)) {
          state.journal.set(self, { version: self.version, value: self.value })
        }
        const current = state.journal.get(self)!
        const [returnValue, next] = f(current.value)
        current.value = next
        return returnValue
      })
    ),
    Effect.tx
  ))
Referenced by 9 symbols