import type Redis from "ioredis";
import type { RedisKey } from "ioredis";
declare type Key = RedisKey | number;
declare type Awaitable<T> = T | Promise<T>;
export declare class AcquireFailedError extends Error {
    readonly cause?: unknown;
    constructor(message?: string, cause?: unknown);
}
export declare class ReleaseFailedError extends Error {
    readonly cause?: unknown;
    constructor(message?: string, cause?: unknown);
}
export declare type AcquireDesire<K extends string | number> = {
    key: K;
    desireAmount: number;
    limitAmount?: number;
};
export declare type AcquiredResult<K extends string | number> = {
    key: K;
    currentAmount: number;
    acquiredAmount: number;
    lackingAmount: number;
};
export declare type AcquireOptions = {
    prefix?: string;
    float?: boolean;
    limit?: number;
};
export declare type AcquireOptionsInput = AcquireOptions | boolean;
export declare type ReleaseItem<K extends string | number> = {
    key: K;
    amount: number;
};
export declare class Acquire {
    private readonly redis;
    constructor(redis: Redis);
    acquire<T>(key: Key, amount: number, fn: (currentAmount: number, acquiredAmount: number, lackingAmount: number) => Awaitable<T>, options?: AcquireOptionsInput): Promise<T>;
    hashAcquire<T>(key: Key, id: Key, amount: number, fn: (currentAmount: number, acquiredAmount: number, lackingAmount: number) => Awaitable<T>, options?: AcquireOptionsInput): Promise<T>;
    acquireMany<K extends string | number, T>(items: AcquireDesire<K>[], fn: (acquireResult: AcquiredResult<K>[]) => Awaitable<T>, options?: AcquireOptions): Promise<T>;
    hashAcquireMany<K extends string | number, T>(hashKey: string, items: AcquireDesire<K>[], fn: (acquireResult: AcquiredResult<K>[]) => Awaitable<T>, options?: AcquireOptions): Promise<T>;
    private getChangeCommand;
    private getHashChangeCommand;
    private getAcquireCommand;
    private getHashAcquireCommand;
    private releaseMany;
    private hashReleaseMany;
    private getReleaseCommand;
    private getHashReleaseCommand;
    private releaseBy;
    private acquireBy;
    private executeAcquirePipeline;
    private releaseAfterAcquireFailure;
    private releaseLackingAmounts;
    private releaseSingleLackingAmount;
    private releaseSingleHashLackingAmount;
    private runAcquireCallback;
    private releaseAfterCallbackFailure;
    private getFailedIndexes;
    private getDesiredReleaseItems;
    private getAcquiredReleaseItems;
    private getAcquiredResults;
    private getAcquiredResult;
}
export {};
