Hyperlinkv0.8.0-beta.28

TxSemaphore

TxSemaphore.acquireNconsteffect/TxSemaphore.ts:292
(self: TxSemaphore, n: number): Effect.Effect<void>

Acquires the specified number of permits from the semaphore.

When to use

Use to manually acquire multiple permits transactionally, waiting until all requested permits are available.

Details

If fewer than n permits are available, the transaction retries until enough permits are released.

Gotchas

Passing a non-positive n dies with a defect. Passing a value greater than the semaphore capacity can wait forever because the capacity is fixed.

Example (Acquiring multiple permits)

import { Console, Effect, TxSemaphore } from "effect"

const program = Effect.gen(function*() {
  const semaphore = yield* TxSemaphore.make(5)

  yield* Console.log("Acquiring 3 permits...")
  yield* TxSemaphore.acquireN(semaphore, 3)
  yield* Console.log("3 permits acquired")

  const available = yield* TxSemaphore.available(semaphore)
  yield* Console.log(`Available permits: ${available}`) // 2
})
export const acquireN = (self: TxSemaphore, n: number): Effect.Effect<void> => {
  if (n <= 0) {
    return Effect.die(new Error("Number of permits must be positive"))
  }
  return Effect.gen(function*() {
    const permits = yield* TxRef.get(self.permitsRef)
    if (permits < n) {
      return yield* Effect.txRetry
    }
    yield* TxRef.set(self.permitsRef, permits - n)
  }).pipe(Effect.tx)
}
Referenced by 1 symbols