/// <reference types="node" />
/// <reference types="node" />
import { ReadStream, WriteStream } from 'fs';
import csv from 'csv-parser';
import { Options as StringifyOptions } from 'csv-stringify';
declare type ArrayMethod<T, U> = (value: T, index?: number) => U | Promise<U>;
declare type CsvRowsCollection<T> = {
    /**
     * Chainable methods
     */
    uniq<U extends keyof T>(iterator?: ArrayMethod<T, string> | U | U[]): CsvRowsCollection<T>;
    filter(cb: ArrayMethod<T, boolean>): CsvRowsCollection<T>;
    map<U>(cb: ArrayMethod<T, U>): CsvRowsCollection<U>;
    pick: <U extends keyof T>(keys: U | U[]) => CsvRowsCollection<Record<U, string>>;
    forEach(cb: ArrayMethod<T, void>): CsvRowsCollection<T>;
    /**
     * Terminator methods
     */
    process: () => Promise<void>;
    find: (cb: ArrayMethod<T, boolean>) => Promise<T | null>;
    findIndex: (cb: ArrayMethod<T, boolean>) => Promise<number>;
    every: (cb: ArrayMethod<T, boolean>) => Promise<boolean>;
    some: (cb: ArrayMethod<T, boolean>) => Promise<boolean>;
    includes: (value: T) => Promise<boolean>;
    rows: () => Promise<T[]>;
    toJSON: (replacer?: (number | string)[] | null, space?: string | number) => Promise<string>;
    toCSV: (csvTarget: string | WriteStream, options?: StringifyOptions) => Promise<void>;
    key: <U extends keyof T>(property: U, filterUndefined?: true) => Promise<T[U][]>;
    first: (n: number) => Promise<T[]>;
    last: (n: number) => Promise<T[]>;
    skip: (n: number) => Promise<T[]>;
    count: () => Promise<number>;
};
export declare function withCSV(csvFileOrBuffer: string | Buffer | ReadStream, options?: csv.Options | readonly string[]): {
    columns<T extends string>(columns: T[] | readonly T[]): CsvRowsCollection<Record<T, string>>;
};
export {};
