interface Selector<T, R> {
    (state: T): R;
}
interface SelectorOptions<T> {
    equals?: (a: T, b: T) => boolean;
    name?: string;
}
interface Subscriber<T> {
    notify: (value: T) => void | Promise<void>;
}
interface SelectorAPI<T> {
    select: () => Promise<T>;
    subscribe: (subscriber: Subscriber<T>) => VoidFunction;
    getId: () => string;
}
/**
 * Интерфейс для модуля селекторов
 * Определяет контракт для работы с селекторами, который должен реализовывать SelectorModule
 */
interface ISelectorModule<TStore extends Record<string, any>> {
    /**
     * Имя связанного хранилища
     */
    readonly storageName: string;
    /**
     * Создает простой селектор на основе функции выбора
     *
     * @param selector Функция, извлекающая данные из состояния
     * @param options Опции селектора
     * @returns API селектора
     *
     * @example
     * const isActive = selectorModule.createSelector(
     *   (state) => state.user.isActive,
     *   { name: 'userIsActive' }
     * );
     */
    createSelector<T>(selector: Selector<TStore, T>, options?: SelectorOptions<T>): SelectorAPI<T>;
    /**
     * Создает комбинированный селектор на основе других селекторов
     *
     * @param dependencies Массив селекторов, от которых зависит новый селектор
     * @param resultFn Функция, комбинирующая результаты зависимостей
     * @param options Опции селектора
     * @returns API селектора
     *
     * @example
     * const userWithStatus = selectorModule.createSelector(
     *   [userSelector, statusSelector],
     *   (user, status) => ({ ...user, status }),
     *   { name: 'userWithStatus' }
     * );
     */
    createSelector<Deps extends unknown[], T>(dependencies: {
        [K in keyof Deps]: SelectorAPI<Deps[K]>;
    }, resultFn: (...args: Deps) => T, options?: SelectorOptions<T>): SelectorAPI<T>;
    /**
     * Освобождает ресурсы, связанные с модулем селекторов
     */
    destroy(): void;
}

export type { ISelectorModule as I, SelectorAPI as S, Selector as a, SelectorOptions as b };
