import * as types from '../../.types';
export declare function partition<X>(iterable: Iterable<X>, classifiers: partition.Classifier.Iter<X>): partition.Partition<X>;
export declare namespace partition {
    function fromClassifierList<X>(values: Iterable<X>, classifiers: Classifier.Iter<X>): Partition<X>;
    namespace fromClassifierList {
        function iterable<X>(values: Iterable<X>, classifiers: Classifier.Iter<X>): Partition<X>;
        function array<X>(list: ReadonlyArray<X>, classifiers: Classifier.List<X>): Partition.Array<X>;
    }
    function fromClassifierDict<X>(list: Iterable<X>, classifiers: Classifier.Dict<X>): Partition<X>;
    type Partition<X> = Partition.Set<X>;
    namespace Partition {
        interface Set<X> {
            readonly classified: Dict<ReadonlySet<X>>;
            readonly untouched: ReadonlySet<X>;
        }
        interface Array<X> {
            readonly classified: Dict<ReadonlyArray<X>>;
            readonly untouched: ReadonlyArray<X>;
        }
    }
    type Classifier<X> = [Classifier.Target, Classifier.Func<X>];
    namespace Classifier {
        type Iter<X> = Iterable<Classifier<X>>;
        type Set<X> = ReadonlySet<Classifier<X>>;
        type List<X> = ReadonlyArray<Classifier<X>>;
        type Dict<X> = partition.Dict<Func<X>>;
        type Target = string;
        type Func<X> = (x: X) => boolean;
    }
    type Dict<X> = Readonly<types.Dict.StrKey<X>>;
}
export default partition;
