UNPKG

ciorent

Version:

A lightweight, low-overhead concurrency library

45 lines (44 loc) 1.15 kB
import { type Extend } from "./utils.js"; type QueueItem = (value: true) => void; export type Semaphore = [(QueueItem | null)[], len: number, head: number, tail: number, remain: number]; /** * Create a semaphore. * * @example * // maximum of 10 concurrent tasks and 200 waiting tasks. * const sem = semaphore.init(10, 200); */ export declare const init: (permits: number, capacity: number) => Semaphore; /** * Acquire a permit. * * @example * * if (!await semaphore.acquire(sem)) { * // Internal queue is full * } * * // Do something and then release the permit. * semaphore.release(sem); */ export declare const acquire: (sem: Extend<Semaphore>) => Promise<true> | boolean; /** * Release a permit. * * @example * semaphore.release(sem); */ export declare const release: (sem: Extend<Semaphore>) => void; /** * Run a task with concurrency control. * * @param sem Semaphore to acquire from * @param task Task to run * @throws When `sem` internal queue is full * @returns The limited function */ export declare const run: < Args extends any[], R >(sem: Extend<Semaphore>, task: (...args: Args) => Promise<R>, ...args: Args) => Promise<R>; export {};