Hyperlinkv0.8.0-beta.28

SynchronizedRef

SynchronizedRef.updateSomeAndGetEffectconsteffect/SynchronizedRef.ts:652
<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>

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.

export 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>
} = dual(
  2,
  <A, R, E>(self: SynchronizedRef<A>, pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>): Effect.Effect<A, E, R> =>
    self.semaphore.withPermit(Effect.suspend(() => {
      const value = getUnsafe(self)
      return Effect.flatMap(pf(value), (option) => {
        if (Option.isNone(option)) {
          return Effect.succeed(value)
        }
        self.backing.ref.current = option.value
        return Effect.succeed(option.value)
      })
    }))
)