import { Observable } from 'rxjs';
import { I as ISelectorModule } from './selector.interface-CA5y-kD_.js';
import { j as IStorage } from './storage.interface-2HKvqdAJ.js';
import { l as ExternalStates, n as Effect } from './dispatcher.module-DjMloBXe.js';

type ExtractDispatchType<T> = T extends {
    dispatch: infer D;
} ? D : never;
type StorageCreatorFunction<T extends Record<string, any>> = () => Promise<IStorage<T>>;
type SynapseDependency = {
    storage: IStorage<any>;
    [key: string]: any;
};
/**
 * Базовая конфигурация хранилища
 */
type BaseSynapseConfig<TStore extends Record<string, any>, TSelectors = any, TExternalSelectors extends Record<string, any> = Record<string, any>> = ({
    storage: IStorage<TStore>;
    createStorageFn?: undefined;
} | {
    storage?: undefined;
    createStorageFn: StorageCreatorFunction<TStore>;
}) & {
    dependencies?: SynapseDependency[];
    externalSelectors?: TExternalSelectors;
    createSelectorsFn?: (selectorModule: ISelectorModule<TStore>, externalSelectors: TExternalSelectors) => TSelectors;
};
/**
 * Конфигурация с dispatcher и effects
 */
type CreateSynapseConfigWithEffects<TStore extends Record<string, any>, TSelectors = any, TDispatcher = any, TApi extends Record<string, any> = Record<string, never>, TConfig extends Record<string, any> = Record<string, never>, TExternalSelectors extends Record<string, any> = Record<string, any>> = BaseSynapseConfig<TStore, TSelectors, TExternalSelectors> & {
    createDispatcherFn: (storage: IStorage<TStore>) => TDispatcher;
    createEffectConfig: (dispatcher: TDispatcher) => {
        dispatchers: Record<string, any>;
        api?: TApi;
        config?: TConfig;
        externalStates?: ExternalStates;
    };
    effects?: Effect<TStore, any, TApi, TConfig, any>[];
};
/**
 * Конфигурация только с dispatcher
 */
type CreateSynapseConfigWithDispatcher<TStore extends Record<string, any>, TSelectors = any, TDispatcher = any, TExternalSelectors extends Record<string, any> = Record<string, any>> = BaseSynapseConfig<TStore, TSelectors, TExternalSelectors> & {
    createDispatcherFn: (storage: IStorage<TStore>) => TDispatcher;
    createEffectConfig?: never;
    effects?: never;
};
/**
 * Конфигурация без dispatcher
 */
type CreateSynapseConfigBasic<TStore extends Record<string, any>, TSelectors = any, TExternalSelectors extends Record<string, any> = Record<string, any>> = BaseSynapseConfig<TStore, TSelectors, TExternalSelectors> & {
    createDispatcherFn?: never;
    createEffectConfig?: never;
    effects?: never;
};
/**
 * Результат с dispatcher и effects
 */
interface SynapseStoreWithEffects<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors, TActions> {
    storage: TStorage;
    selectors: TSelectors;
    actions: TActions;
    state$: Observable<TStore>;
    dispatcher: any;
    destroy: () => Promise<void>;
}
/**
 * Результат только с dispatcher
 */
interface SynapseStoreWithDispatcher<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors, TActions> {
    storage: TStorage;
    selectors: TSelectors;
    actions: TActions;
    dispatcher: any;
    destroy: () => Promise<void>;
}
/**
 * Результат без dispatcher
 */
interface SynapseStoreBasic<TStore extends Record<string, any>, TStorage extends IStorage<TStore>, TSelectors> {
    storage: TStorage;
    selectors: TSelectors;
    destroy: () => Promise<void>;
}
/**
 * Union-тип для всех возможных результатов createSynapse
 */
type AnySynapseStore<TStore extends Record<string, any> = any, TStorage extends IStorage<TStore> = IStorage<any>, TSelectors = any, TActions = any> = SynapseStoreWithEffects<TStore, TStorage, TSelectors, TActions> | SynapseStoreWithDispatcher<TStore, TStorage, TSelectors, TActions> | SynapseStoreBasic<TStore, TStorage, TSelectors>;
/**
 * Перегрузки функции createSynapse
 */
declare function createSynapse<TStore extends Record<string, any>, TSelectors = any, TDispatcher = any, TApi extends Record<string, any> = Record<string, never>, TConfig extends Record<string, any> = Record<string, never>, TExternalSelectors extends Record<string, any> = Record<string, any>, TStorage extends IStorage<TStore> = IStorage<TStore>>(config: CreateSynapseConfigWithEffects<TStore, TSelectors, TDispatcher, TApi, TConfig, TExternalSelectors>): Promise<SynapseStoreWithEffects<TStore, TStorage, TSelectors, ExtractDispatchType<TDispatcher>>>;
declare function createSynapse<TStore extends Record<string, any>, TSelectors = any, TDispatcher = any, TExternalSelectors extends Record<string, any> = Record<string, any>, TStorage extends IStorage<TStore> = IStorage<TStore>>(config: CreateSynapseConfigWithDispatcher<TStore, TSelectors, TDispatcher, TExternalSelectors>): Promise<SynapseStoreWithDispatcher<TStore, TStorage, TSelectors, ExtractDispatchType<TDispatcher>>>;
declare function createSynapse<TStore extends Record<string, any>, TSelectors = any, TExternalSelectors extends Record<string, any> = Record<string, any>, TStorage extends IStorage<TStore> = IStorage<TStore>>(config: CreateSynapseConfigBasic<TStore, TSelectors, TExternalSelectors>): Promise<SynapseStoreBasic<TStore, TStorage, TSelectors>>;

export { type AnySynapseStore as A, type SynapseStoreBasic as S, type SynapseStoreWithDispatcher as a, type SynapseStoreWithEffects as b, createSynapse as c };
