import { FCancellationToken } from "../cancellation/index.js";
import { FDisposable } from "../lifecycle/index.js";
export declare namespace FLimit {
    type Weight = number;
    interface Opts {
        perSecond?: Weight;
        perMinute?: Weight;
        perHour?: Weight;
        perTimespan?: {
            delay: number;
            count: Weight;
        };
        parallel?: Weight;
    }
    interface Token {
        rollback(): void;
        commit(): void;
    }
    type TokenLazyCallback = (err: any, limitToken?: Token) => void;
    function isLimitOpts(probablyOpts: any): probablyOpts is Opts;
    function ensureLimitOpts(probablyOpts: any): Opts;
}
export interface FLimit extends FDisposable {
    readonly availableWeight: number;
    readonly maxWeight: number;
    /**
     * @param tokenWeight default: 1
     */
    accrueTokenImmediately(): FLimit.Token;
    accrueTokenImmediately(tokenWeight?: FLimit.Weight): FLimit.Token;
    accrueTokenLazy(timeout: number): Promise<FLimit.Token>;
    accrueTokenLazy(cancellationToken: FCancellationToken): Promise<FLimit.Token>;
    accrueTokenLazy(timeout: number, cb: FLimit.TokenLazyCallback): void;
    accrueTokenLazy(cancellationToken: FCancellationToken, cb: FLimit.TokenLazyCallback): void;
    accrueTokenLazy(timeout: number, cancellationToken: FCancellationToken): Promise<FLimit.Token>;
    accrueTokenLazy(tokenWeight: FLimit.Weight, timeout: number): Promise<FLimit.Token>;
    accrueTokenLazy(timeout: number, cancellationToken: FCancellationToken, cb: FLimit.TokenLazyCallback): void;
    accrueTokenLazy(tokenWeight: FLimit.Weight, timeout: number, cb: FLimit.TokenLazyCallback): void;
    accrueTokenLazy(tokenWeight: FLimit.Weight, timeout: number, cancellationToken: FCancellationToken): Promise<FLimit.Token>;
    accrueTokenLazy(tokenWeight: FLimit.Weight, timeout: number, cancellationToken: FCancellationToken, cb: FLimit.TokenLazyCallback): void;
}
