Hyperlinkv0.8.0-beta.28

SynchronizedRef

SynchronizedRef.updateAndGetEffectconsteffect/SynchronizedRef.ts:538
<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>

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.

export 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>
} = dual(
  2,
  <A, R, E>(self: SynchronizedRef<A>, f: (a: A) => Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
    self.semaphore.withPermit(Effect.suspend(() => {
      const value = getUnsafe(self)
      return Effect.map(f(value), (newValue) => {
        self.backing.ref.current = newValue
        return newValue
      })
    }))
)