Hyperlinkv0.8.0-beta.28

SubscriptionRef

SubscriptionRef.modifyconsteffect/SubscriptionRef.ts:464
<A, B>(modify: (a: A) => readonly [B, A]): (
  self: SubscriptionRef<A>
) => Effect.Effect<B>
<A, B>(
  self: SubscriptionRef<A>,
  f: (a: A) => readonly [B, A]
): Effect.Effect<B>

Modifies the SubscriptionRef atomically with a function that computes a return value and a new value, notifying subscribers of the change.

Example (Modifying a value)

import { Effect, SubscriptionRef } from "effect"

const program = Effect.gen(function*() {
  const ref = yield* SubscriptionRef.make(10)

  const result = yield* SubscriptionRef.modify(ref, (n) => [
    `Old value was ${n}`,
    n * 2
  ])
  console.log(result)

  const newValue = yield* SubscriptionRef.get(ref)
  console.log("New value:", newValue)
})
modifications
export const modify: {
  <A, B>(modify: (a: A) => readonly [B, A]): (self: SubscriptionRef<A>) => Effect.Effect<B>
  <A, B>(self: SubscriptionRef<A>, f: (a: A) => readonly [B, A]): Effect.Effect<B>
} = dual(2, <A, B>(
  self: SubscriptionRef<A>,
  modify: (a: A) => readonly [B, A]
) =>
  self.semaphore.withPermit(Effect.sync(() => {
    const [b, newValue] = modify(self.value)
    setUnsafe(self, newValue)
    return b
  })))