Hyperlinkv0.8.0-beta.28

SynchronizedRef

SynchronizedRef.modifySomeEffectconsteffect/SynchronizedRef.ts:368
<A, B, R, E>(
  fallback: B,
  pf: (a: A) => Effect.Effect<readonly [B, Option.Option<A>], E, R>
): (self: SynchronizedRef<A>) => Effect.Effect<B, E, R>
<A, B, R, E>(
  self: SynchronizedRef<A>,
  pf: (a: A) => Effect.Effect<readonly [B, Option.Option<A>], E, R>
): Effect.Effect<B, E, R>

Runs an effectful modification atomically while holding the ref's semaphore. The effect computes a return value and an optional new ref value; Option.some updates the ref and Option.none leaves it unchanged.

When to use

Use to effectfully compute a return value while optionally updating the stored SynchronizedRef value.

export const modifySomeEffect: {
  <A, B, R, E>(
    fallback: B,
    pf: (a: A) => Effect.Effect<readonly [B, Option.Option<A>], E, R>
  ): (self: SynchronizedRef<A>) => Effect.Effect<B, E, R>
  <A, B, R, E>(
    self: SynchronizedRef<A>,
    pf: (a: A) => Effect.Effect<readonly [B, Option.Option<A>], E, R>
  ): Effect.Effect<B, E, R>
} = dual(
  2,
  <A, B, R, E>(
    self: SynchronizedRef<A>,
    pf: (a: A) => Effect.Effect<readonly [B, Option.Option<A>], E, R>
  ): Effect.Effect<B, E, R> =>
    self.semaphore.withPermit(Effect.suspend(() => {
      const value = getUnsafe(self)
      return Effect.flatMap(pf(value), ([b, maybeA]) => {
        if (Option.isNone(maybeA)) {
          return Effect.succeed(b)
        }
        self.backing.ref.current = maybeA.value
        return Effect.succeed(b)
      })
    }))
)