import type { ILogger, IStorage } from '../storage';
import type { ISelectorModule, Selector, SelectorAPI, SelectorOptions } from './selector.interface';
/**
 * Глубокое сравнение объектов по структуре с защитой от циклических ссылок и лимитом глубины.
 * Используется только при явной передаче через options.equals.
 */
export declare function deepEquals<T>(a: T, b: T, depth?: number, visited?: WeakSet<object>): boolean;
export declare class SelectorModule<S extends Record<string, any>> implements ISelectorModule<S> {
    private readonly source;
    private readonly logger?;
    storageName: string;
    private selectorIdCounter;
    private subscriptions;
    private localSelectorCache;
    private batchUpdateInProgress;
    private pendingUpdates;
    private readonly disposeStatusListener;
    constructor(source: IStorage<S>, logger?: ILogger | undefined);
    /**
     * Собирает публичный `SelectorAPI` поверх подписки. `$` — Observable-вид с той же
     * семантикой, что у `subscribe`: синхронный снапшот при подписке + emit на изменение.
     *
     * `sourceReadiness` переопределяет дефолтную (локальную) готовность источника: для
     * combined-селекторов туда передаётся агрегированная готовность по всем источникам
     * зависимостей (см. {@link createCombinedSelector}).
     */
    private buildSelectorApi;
    private isSourceReady;
    private onSourceStatusChange;
    /**
     * Генерирует уникальное имя для селектора через автоинкрементный счётчик
     */
    private generateName;
    /**
     * Обрабатывает отложенные обновления синхронно
     */
    private processPendingUpdates;
    createSelector<T>(selector: Selector<S, T>, options?: SelectorOptions<T>): SelectorAPI<T>;
    createSelector<Deps extends unknown[], T>(dependencies: {
        [K in keyof Deps]: SelectorAPI<Deps[K]>;
    }, resultFn: (...args: Deps) => T, options?: SelectorOptions<T>): SelectorAPI<T>;
    private createSimpleSelector;
    private createCombinedSelector;
    /**
     * Точечно удаляет селектор по id: снимает его подписки на хранилище, чистит подписку
     * и кэш. Остальные селекторы модуля не затрагиваются. Имя кэша совпадает с id подписки
     * (`generateName()`/`options.name`), поэтому достаточно одного ключа.
     */
    removeSelector(id: string): void;
    destroy(): void;
}
