/// <reference types="node" />
import { WriteStream } from "tty";
type TaskType = "percentage" | "indefinite";
type TransformFn = (bar: string) => string;
type Anchor = "top" | "bottom";
interface Task {
    name: string;
    index: number;
    type: TaskType;
    message: string;
    barTransformFn: TransformFn;
    nameTransformFn: TransformFn;
    percentage?: number;
    done: boolean;
}
interface AddOptions {
    index?: number;
    type: TaskType;
    message?: string;
    nameTransformFn?: TransformFn;
    barTransformFn?: TransformFn;
    percentage?: number;
}
type UpdateOptions = Partial<Pick<Task, "message" | "barTransformFn" | "percentage" | "nameTransformFn">>;
interface Tasks {
    [key: string]: Task;
}
/**
 * Function for generating the indefinite spinner
 *
 * @param t     Current timestep
 * @param width Width of the spinner
 *
 * @returns     String of length "width"
 */
type SpinnerGenerator = (t: number, width: number) => string;
/**
 * Options for setting the border, all optional
 */
interface Border {
    message?: string;
    pattern?: string;
    left?: number;
    right?: number;
}
/**
 * Constructor Options
 * @param stream            A node TTY stream
 * @param spinnerFPS        FPS to run the indefinite spinner
 * @param numCrawlers       Optional: Number of crawlers for the indefinite spinner
 * @param progressWidth     Width of the progress bar
 * @param spinnerGenerator  See SpinnerGenerator type
 * @param initMessage       Message to display in the header
 * @param border            boolean or a string for the border design
 * @param anchor            'top' or 'bottom', default 'bottom'
 * @param persist           Keep console override even if all progress bars are 100%
 * @param header            Optional: Border object, string, or boolean. Will override initMessage and border if provided
 * @param footer            Optional: Border object, string, or boolean.
 */
interface CtorOptions {
    stream: WriteStream;
    spinnerFPS: number;
    numCrawlers: number;
    progressWidth: number;
    spinnerGenerator: SpinnerGenerator;
    initMessage: string;
    anchor: Anchor;
    persist: boolean;
    border: boolean | string;
    header: Border | string | boolean;
    footer: Border | string | boolean;
}
declare class MultiProgressBars {
    private tasks;
    private spinnerFPS;
    private progressWidth;
    private persist;
    private intervalID;
    private numCrawlers;
    private longestNameLength;
    private t;
    private resolve;
    private spinnerGenerator;
    private logger;
    private border;
    private bottomBorder;
    private endIdx; // 1 past the last index
    private allFinished;
    private headerSettings;
    private footerSettings;
    promise: Promise<void>;
    /**
     *
     * @param options   {@link CtorOptions | See CtorOptions Type}
     */
    constructor(options?: Partial<CtorOptions>);
    /** Make simple border from supplied option */
    private processSimpleBorder;
    /** Make border from message, pattern, left, right. Called internally by setHeader and setFooter
     *
     * [message] will be placed within a string surrounded by [pattern] at the specified [left] or [right]
     * Pass undefined or null to [left] if you want [right] to be used.
     */
    private makeBorder;
    cleanup: () => never;
    setHeader(options: Border | string | boolean): void;
    setFooter(options: Border | string | boolean): void;
    removeHeader(): void;
    removeFooter(): void;
    addTask(name: string, { index, ...options }: AddOptions): void;
    // Call this BEFORE you add a new task to the list
    private restartPromiseIfNeeded;
    isDone(name: string): boolean;
    removeTask(task: string | number, shift?: boolean): void;
    private progressString;
    private indefiniteString;
    private writeTask;
    incrementTask(name: string, { percentage, ...options }?: UpdateOptions): void;
    updateTask(name: string, options?: UpdateOptions): void;
    done(name: string, { message, ...options }?: Pick<UpdateOptions, "message" | "barTransformFn" | "nameTransformFn">): void;
    restartTask(name: string, { percentage, ...options }: Pick<UpdateOptions, "percentage" | "message" | "barTransformFn" | "nameTransformFn">): void;
    close(): void;
    // Returns the index of task with supplied name. Returns undefined if name not found.
    getIndex(taskName: string): number;
    // Returns the name of the task with given index. Returns undefined if name not found.
    getName(index: number): string;
    // TODO maybe make this static?
    private hilbertSpinner;
    private renderIndefinite;
}
export { TaskType, Task, AddOptions, UpdateOptions, Tasks, SpinnerGenerator, Border, CtorOptions, MultiProgressBars };
