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?