Hyperlinkv0.8.0-beta.28

SynchronizedRef

SynchronizedRef.getAndUpdateSomeEffectconsteffect/SynchronizedRef.ts:248
<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 atomically while holding the ref's semaphore and returns the previous value. Option.some updates the ref; Option.none leaves it unchanged.

When to use

Use to return the previous SynchronizedRef value while running an effectful conditional update.

export const getAndUpdateSomeEffect: {
  <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(value)
      })
    }))
)