type Dict<T> = Record<string, T>;

type Mutation<TState = unknown> = (
    payload: unknown,
    action: Record<string, unknown>
) => (state: TState) => TState;

export * from './actions';


export class Updux<TState = unknown> {
    constructor(config: Partial<UpduxConfig<TState>>);

    get initial(): TState;
    get selectors(): unknown;

    /**
     * Sets the local mutation for the given action.
     *
     * The action can be specified via its type
     * or its generator.
     *
     * Returns the same mutation function.
     */
    setMutation<TMutation extends Mutation>(
        actionType: string,
        mutation: TMutation
    ): TMutation;
    setMutation<TMutation extends Mutation>(
        action: ActionGenerator,
        mutation: TMutation
    ): TMutation;

    /**
     * Registers the action for the dux.
     * If no payload function is provided, whatever is
     * given as an argument to the action generator will
     * be set as-is in the action's payload.
     */
    setAction(actionType: string, payloadFunc?: Function);

    /**
     * Registers a selector for the dux.
     */
    setSelector(name: string, selector: Selector);
}

