import { IInternalItem } from './items';
import { MaybeRef } from '../utils';
import { PropType, Ref } from 'vue';
export type TFilterMath = boolean | number | [number, number] | [number, number][];
export interface IFilterProps {
    customFilter?: TFilterFunction;
    customKeyFilter?: TFilterKeyFunctions;
    filterKeys?: TFilterKeys;
    filterMode?: TFilterMode;
    noFilter?: boolean;
}
export interface IUseFilter<T> {
    getMatches: (item: T) => Record<string, TFilterMath> | undefined;
    filteredItems: Ref<T[]>;
    filteredMatches: Ref<Map<unknown, Record<string, TFilterMath>>>;
}
export declare const makeFilterProps: <Defaults extends {
    customFilter?: unknown;
    customKeyFilter?: unknown;
    filterKeys?: unknown;
    filterMode?: unknown;
    noFilter?: unknown;
} = {}>(defaults?: Defaults | undefined) => import('../utils').AppendDefault<{
    /**
     * Функция, используемая для фильтрации элементов списка.
     * Вызывается для каждого фильтруемого ключа и для каждого элемента списка.
     * Первый аргумент - это фильтруемое значение, второй - поисковой запрос, а третий - внутренний объект элемента списка.
     * Функция должна возвращать true если элемент должен быть включен в результаты фильтрации, или индекс соответствия в значении, если он должен быть включен с выделенным результатом.
     */
    customFilter: {
        type: PropType<TFilterFunction>;
        default: null;
    };
    /**
     * Функция, используемая для определенных ключей внутри объекта элемента списка. customFilter не будет учитывать элементы с указанным customKeyFilter
     */
    customKeyFilter: {
        type: PropType<TFilterKeyFunctions>;
        default: null;
    };
    /**
     * Массив ключей, по которым будет производиться фильтрация
     */
    filterKeys: {
        type: PropType<TFilterKeys>;
        default: string;
    };
    /**
     * Управляет объединением результатов customFilter и customKeyFilter. Все варианты применяют customFilter только к элементам, не указанным в customKeyFilter.
     * - 'some' - имеется хотя бы одно совпадение либо с customFilter, либо с customKeyFilter
     * - 'every' - все элементы соответствуют либо customFilter, либо customKeyFilter
     * - 'union' - имеется хотя бы одно совпадение из customFilter и все совпадения из customKeyFilter
     * - 'intersection' - имеется хотя бы одно совпадение из customFilter и все совпадения из customKeyFilter
     */
    filterMode: {
        type: PropType<TFilterMode>;
        default: string;
    };
    /**
     * Не применяйте фильтрацию при поиске. Полезно, когда данные фильтруются на стороне сервера
     */
    noFilter: {
        type: PropType<boolean>;
        default: boolean;
    };
}, Defaults>;
export declare function useFilter<T extends IInternalItem>(props: IFilterProps, items: MaybeRef<T[]>, query: Ref<string | number | undefined> | (() => string | undefined), options?: {
    transform?: (item: T) => {};
}): IUseFilter<T>;
export declare function defaultFilter(value: string, query: string): TFilterMath;
export declare function filterItems(items: readonly (readonly [item: IInternalItem, transformed: {}])[] | readonly IInternalItem[], query: string, options: Omit<IFilterProps, 'customFilter'> & {
    default?: TFilterFunction;
}): TFilteredItems[];
type TFilteredItems = {
    index: number;
    matches: Record<string, TFilterMath>;
};
type TFilterFunction = (value: string, query: string, item?: any) => TFilterMath;
type TFilterKeyFunctions = Record<string, TFilterFunction>;
type TFilterKeys = string | string[];
type TFilterMode = 'some' | 'every' | 'union' | 'intersection';
export {};
