export type BaseKeyType = string | symbol | number;
export type Indexes = [
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    19,
    20,
    -1
];
export type Range<T> = [KeysOfType<T, number>, KeysOfType<T, number>, number];
export type ChooseMapper<T> = keyof T | Range<T>;
export type KeysOfType<T, V> = {
    [K in keyof T]-?: T[K] extends V ? K : never;
}[keyof T];
export type ToObjectChainValueOf<T, K extends ChooseMapper<T>> = K extends keyof T ? T[K] : K extends Range<T> ? number : never;
export type ItemType<T> = T extends Iterable<infer R> ? R : never;
export type ChooserParams<Arr extends Array<ChooseMapper<V>>, V, R = V[], Pos extends number = 0> = {
    done: [];
    any: any[];
    recur: ToObjectChainValueOf<V, Arr[Pos]> extends BaseKeyType ? [
        ToObjectChainValueOf<V, Arr[Pos]>,
        ...ChooserParams<Arr, V, R, Indexes[Pos]>
    ] : ToObjectChainValueOf<V, Arr[Pos]> extends Iterable<BaseKeyType> ? [
        ItemType<ToObjectChainValueOf<V, Arr[Pos]>>,
        ...ChooserParams<Arr, V, R, Indexes[Pos]>
    ] : [];
}[Pos extends Arr['length'] ? 'done' : Pos extends -1 ? 'any' : 'recur'];
export type Chooser<Arr extends Array<ChooseMapper<V>>, V> = (...args: ChooserParams<Arr, V>) => V[] | undefined;
export declare function chooserFactory<T extends object, Keys extends Array<ChooseMapper<T>>>(list: T[], ...keys: Keys): Chooser<Keys, T>;
