export type IAny = any; export type IBasicDelay = number; export type IComplexDelay = { period: number; count: number; }; export type TimeoutID = ReturnType; export type IMixedDelays = Array; export type INormalizedDelays = Array; export type IDelay = number; export type ITarget = (...args: IAny[]) => IAny; export type ILimit = IComplexDelay & { ttl: number; rest: number; timeout?: TimeoutID; }; export type ILimitStack = Array; export type ICall = { fail: () => void; complete: () => void; }; export type ICallStack = Array; export type IResolve = (value: IAny) => void; export type IReject = (value: IAny) => void; export type IControlled> = T & { (...args: IAny[]): Promise; flush(): void; cancel(): void; }; export type ILodashOpts = { leading?: boolean; trailing?: boolean; maxWait?: IBasicDelay; }; export type IOrder = 'fifo' | 'lifo'; export interface ILimiter { limits: ILimitStack; getNextDelay(): number; reset(): void; resetTtl(): void; decrease(): void; isAllowed(): boolean; getNextQueueSize(): number; } export type IWrapperOpts = { delay: IDelay | IComplexDelay; limit?: ILimit | ILimitStack; context?: IAny; rejectOnCancel?: boolean; order?: IOrder; limiter?: ILimiter; } & ILodashOpts; export type IWrapper = (fn: ITarget, opts: IWrapperOpts) => IControlled; export type IExposedWrapper = { (fn: ITarget, opts: IWrapperOpts): IControlled; (fn: ITarget, delay: IDelay, opts?: ILodashOpts): IControlled; (fn: ITarget, delay: IComplexDelay, opts?: ILodashOpts): IControlled; (fn: ITarget, limit: ILimitStack | ILimit, opts?: ILodashOpts): IControlled; }; export type Nullable = T | null; export type NotAlwaysDefined = T | undefined; export type Optional = Nullable | NotAlwaysDefined;