import { Observable } from 'rxjs';
import { TagNotification } from '../notifications';
import { Logger, BasicLogger, LogOn } from '../logging';
declare type Timestamp = [number, number];
interface IDetails {
    [key: string]: string | number | boolean;
}
interface IState {
    hit(name: string): void;
    memo(name: string, details?: IDetails, transformTookTime?: (metric: number) => number): number | null;
}
export declare function createState(deps?: {
    timestamp: () => [number, number];
    timestampDiff: (timestamp: Timestamp) => [number, number];
}): IState;
export declare function attach(params: {
    name: string;
    from: TagNotification;
    till: TagNotification;
    cb?: (value: number) => void;
    details?: IDetails;
    transformTimeTook?: (value: number) => number;
    state?: IState;
}): <T>(source: Observable<T>) => Observable<T>;
export declare function registerStarts(params: {
    name: string;
    on: Observable<unknown>;
}, state?: IState): Observable<never>;
export declare function start(paramsRaw: {
    name: string;
    on?: TagNotification;
    logger?: BasicLogger;
}, state?: IState): <T>(stream: Observable<T>) => Observable<T>;
export declare function registerStops(params: {
    name: string;
    on: Observable<unknown>;
    details?: IDetails;
    cb?: (time: number) => void;
    transformTookTime?: (time: number) => number;
}, state?: IState): Observable<never>;
export declare function stop(paramsRaw: {
    name: string;
    till: TagNotification;
    details?: IDetails;
    cb?: (time: number) => void;
    transformTookTime?: (time: number) => number;
    logger?: BasicLogger;
}, state?: IState): <T>(stream: Observable<T>) => Observable<T>;
interface ISummary {
    numberOfSamples: number;
    average: number;
    mostOfTheTimesLessThan: number;
    min: number;
    max: number;
}
export declare function logSummaries(params: {
    name: string;
    on?: LogOn;
    logger?: Logger;
}): Observable<never>;
export declare function timesRegistered(name?: string | RegExp): Observable<{
    name: string;
    time: number;
    details?: IDetails | undefined;
}>;
export declare function summariesLogged(name?: string): Observable<{
    name: string;
    summary: ISummary;
}>;
export {};
