import { Observable } from 'rxjs';
export type Undux<State extends object> = {
    [K in keyof State]: {
        key: K;
        previousValue: State[K];
        value: State[K];
    };
};
/**
 * Public Store interface. When you want to reference the Store type,
 * this is the type to use.
 */
export interface Store<State extends object> {
    get<K extends keyof State>(key: K): State[K];
    set<K extends keyof State>(key: K): (value: State[K]) => void;
    setFrom_EXPERIMENTAL(f: (store: Store<State>) => void): void;
    on<K extends keyof State>(key: K): Observable<State[K]>;
    onAll(): Observable<Undux<State>[keyof State]>;
    getState(): Readonly<State>;
}
/**
 * Immutable snapshot of the current store state. One StoreSnapshot per
 * StoreDefinition is usually alive at a time.
 */
export declare class StoreSnapshot<State extends object> implements Store<State> {
    private state;
    private storeDefinition;
    constructor(state: State, storeDefinition: StoreDefinition<State>);
    get<K extends keyof State>(key: K): State[K];
    set<K extends keyof State>(key: K): (value: State[K]) => void;
    setFrom_EXPERIMENTAL(f: (store: Store<State>) => void): void;
    on<K extends keyof State>(key: K): Observable<State[K]>;
    onAll(): Observable<Undux<State>[keyof State]>;
    getState(): Readonly<State>;
}
export type Options = {
    isDevMode: boolean;
};
/**
 * We create a single instance of this per <Container />.
 */
export declare class StoreDefinition<State extends object> implements Store<State> {
    private storeSnapshot;
    private alls;
    private emitter;
    private setters;
    constructor(state: State, options: Options);
    on<K extends keyof State>(key: K): Observable<State[K]>;
    onAll(): Observable<Undux<State>[keyof State]>;
    get<K extends keyof State>(key: K): State[K];
    set<K extends keyof State>(key: K): (value: State[K]) => void;
    setFrom_EXPERIMENTAL(f: (store: Store<State>) => void): void;
    getCurrentSnapshot(): StoreSnapshot<State>;
    toStore(): Store<State>;
    getState(): Readonly<State>;
}
/**
 * @deprecated Use `createConnectedStore` instead.
 */
export declare function createStore<State extends object>(initialState: State, options?: Options): StoreDefinition<State>;
export type Effects<State extends object> = (store: StoreDefinition<State>) => StoreDefinition<State>;
export type EffectsAs<States extends {
    [alias: string]: any;
}> = (stores: {
    [K in keyof States]: StoreDefinition<States[K]>;
}) => {
    [K in keyof States]: StoreDefinition<States[K]>;
};
/**
 * @deprecated Use `Effects` instead.
 */
export type Plugin<State extends object> = (store: StoreDefinition<State>) => StoreDefinition<State>;
export * from './plugins/withLogger';
export * from './plugins/withReduxDevtools';
export * from './react';
export { CreateConnectedStore } from './react/createConnectedStore';
export { CreateConnectedStoreAs } from './react/createConnectedStoreAs';
