Play with Semaphore

Semaphore represents a generalized mutex, you can think of it as a physical semaphore that manages traffic

Semaphore

export interface Semaphore {
  /**
   * Acquire a permit, blocking if not all are vailable
   */
  readonly acquire: T.Effect<T.NoEnv, never, void>;
  /**
   * Release a permit
   */
  readonly release: T.Effect<T.NoEnv, never, void>;
  /**
   * Get the number of available permits
   */
  readonly available: T.Effect<T.NoEnv, never, number>;

  /**
   * Acquire multiple permits blocking if not all are available
   * @param n
   */
  acquireN(n: number): T.Effect<T.NoEnv, never, void>;
  /**
   * Release mutliple permits
   * @param n
   */
  releaseN(n: number): T.Effect<T.NoEnv, never, void>;
  /**
   * Bracket the given io with acquireN/releaseN calls
   * @param n
   * @param io
   */
  withPermitsN<R, E, A>(n: number, io: T.Effect<R, E, A>): T.Effect<R, E, A>;
  /**
   * withPermitN(1, _)
   * @param n
   */
  withPermit<R, E, A>(n: T.Effect<R, E, A>): T.Effect<R, E, A>;
}

/**
 * Allocate a semaphore.
 *
 * @param n the number of permits
 * This must be non-negative
 */
export function makeSemaphore(n: number): T.Effect<T.NoEnv, never, Semaphore> {
  return T.applySecond(
    sanityCheck(n),
    effect.map(makeRef(right(n) as State), makeSemaphoreImpl)
  );
}

Usage

Last updated

Was this helpful?