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 {};
