Hyperlinkv0.8.0-beta.28

SynchronizedRef

SynchronizedRef.updateSomeEffectconsteffect/SynchronizedRef.ts:592
<A, R, E>(pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>): (
  self: SynchronizedRef<A>
) => Effect.Effect<void, E, R>
<A, R, E>(
  self: SynchronizedRef<A>,
  pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>
): Effect.Effect<void, E, R>

Runs an effectful partial update while holding the ref's semaphore. Option.some stores the new value; Option.none leaves the ref unchanged.

When to use

Use to run an effectful conditional SynchronizedRef update without returning a value.

export const updateSomeEffect: {
  <A, R, E>(
    pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>
  ): (self: SynchronizedRef<A>) => Effect.Effect<void, E, R>
  <A, R, E>(self: SynchronizedRef<A>, pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>): Effect.Effect<void, E, R>
} = dual(
  2,
  <A, R, E>(self: SynchronizedRef<A>, pf: (a: A) => Effect.Effect<Option.Option<A>, E, R>): Effect.Effect<void, E, R> =>
    self.semaphore.withPermit(Effect.suspend(() => {
      const value = getUnsafe(self)
      return Effect.map(pf(value), (option) => {
        if (Option.isNone(option)) {
          return
        }
        self.backing.ref.current = option.value
      })
    }))
)