import { Action, AnyAction } from 'redux';
import { PayloadAction, PayloadActionCreator, ActionCreatorWithoutPayload, ActionCreatorWithPreparedPayload } from '@reduxjs/toolkit';
import { CallEffect, AllEffect } from 'redux-saga/effects';
import { SagaIterator } from 'redux-saga';
export declare enum SagaType {
    Watch = 0,
    Normal = 1,
    TakeLatest = 2,
    TakeEvery = 3
}
export declare type CaseSagas<A extends Action = AnyAction> = (action: A) => Generator<unknown, unknown, SagaIterator>;
declare type CustomCaseSaga = {
    fn: CaseSagas<PayloadAction<any>>;
    sagaType?: SagaType;
};
export declare type SliceCaseSagas = {
    [K: string]: CaseSagas<PayloadAction<any>> | CustomCaseSaga;
};
declare type ActionCreatorForCaseSagaWithPrepare<CR extends {
    prepare: any;
}> = ActionCreatorWithPreparedPayload<CR['prepare'], string>;
declare type ActionCreatorForCaseSagas<CR> = CR extends CustomCaseSaga ? CR['fn'] extends (action: infer Action) => any ? Action extends {
    payload: infer P;
} ? PayloadActionCreator<P> : ActionCreatorWithoutPayload : ActionCreatorWithoutPayload : CR extends (action: infer Action) => any ? Action extends {
    payload: infer P;
} ? PayloadActionCreator<P> : ActionCreatorWithoutPayload : ActionCreatorWithoutPayload;
export declare type CaseSagaActions<CaseSagas extends SliceCaseSagas> = {
    [Type in keyof CaseSagas]: CaseSagas[Type] extends {
        prepare: any;
    } ? ActionCreatorForCaseSagaWithPrepare<CaseSagas[Type]> : ActionCreatorForCaseSagas<CaseSagas[Type]>;
};
export declare type ValidateSliceCaseSagas<ACR extends SliceCaseSagas> = ACR & {
    [T in keyof ACR]: ACR[T] extends {
        saga(action?: infer A): any;
    } ? {
        prepare(...a: never[]): Omit<A, 'type'>;
    } : {};
};
export interface CreateOptionsSliceSaga<CR extends SliceCaseSagas = SliceCaseSagas, Name extends string = string> {
    name: Name;
    caseSagas: ValidateSliceCaseSagas<CR>;
    sagaType?: SagaType;
}
declare type SagaFunReturnType = Generator<AllEffect<CallEffect<any>>, void, unknown>;
export interface Slice<CaseSagas extends SliceCaseSagas = SliceCaseSagas, Name extends string = string> {
    name: Name;
    saga: () => SagaFunReturnType;
    actions: CaseSagaActions<CaseSagas>;
    sagaType: SagaType;
}
export declare function createSaga(sagaType: string | number, type: string, sagaFunction: CaseSagas<PayloadAction<any>>): any;
export declare function createSagas(sagas: (() => Generator<unknown, void, SagaIterator>)[]): any;
export declare function getType(slice: string, actionKey: string): string;
export declare function createSliceSaga<CaseSagas extends SliceCaseSagas, Name extends string = string>(options: CreateOptionsSliceSaga<CaseSagas, Name>): Slice<CaseSagas, Name>;
export {};
//# sourceMappingURL=createSliceSaga.d.ts.map