import {Action} from "redux"; import {Channel, Task, Buffer, Predicate} from "./types"; type Pattern = string | string[] | Predicate; interface TakeEffectDescriptor { pattern: Pattern; channel: Channel; maybe?: boolean; } interface TakeEffect { TAKE: TakeEffectDescriptor; } export function take(pattern: Pattern): TakeEffect; export function take(channel: Channel, pattern?: Pattern): TakeEffect; export function takem(pattern: Pattern): TakeEffect; export function takem(channel: Channel, pattern?: Pattern): TakeEffect; interface PutEffectDescriptor { action: T; channel: Channel; } interface PutEffect { PUT: PutEffectDescriptor; } export function put(action: T): PutEffect; export function put(channel: Channel, action: T): PutEffect; type RaceEffectDescriptor = {[key: string]: Effect}; interface RaceEffect { RACE: RaceEffectDescriptor; } export function race(effects: {[key: string]: Effect}): RaceEffect; interface CallEffectDescriptor { context: any; fn: Function; args: any[]; } type CallFunc0 = () => any; type CallFunc1 = (arg1: T1) => any; type CallFunc2 = (arg1: T1, arg2: T2) => any; type CallFunc3 = (arg1: T1, arg2: T2, arg3: T3) => any; type CallFunc4 = (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => any; type CallFunc5 = (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => any; type CallFuncRest = (...args: any[]) => any; type CallEffectArg = F | [any, F] | {context: any, fn: F}; interface CallEffectFactory { (fn: CallEffectArg): R; (fn: CallEffectArg>, arg1: T1): R; (fn: CallEffectArg>, arg1: T1, arg2: T2): R; (fn: CallEffectArg>, arg1: T1, arg2: T2, arg3: T3): R; (fn: CallEffectArg>, arg1: T1, arg2: T2, arg3: T3, arg4: T4): R; (fn: CallEffectArg, ...args: any[]): R; } interface CallEffect { CALL: CallEffectDescriptor; } export const call: CallEffectFactory; export function apply(context: any, fn: CallFunc0): CallEffect; export function apply(context: any, fn: CallFunc1, args: [T1]): CallEffect; export function apply(context: any, fn: CallFunc2, args: [T1, T2]): CallEffect; export function apply(context: any, fn: CallFunc3, args: [T1, T2, T3]): CallEffect; export function apply(context: any, fn: CallFunc4, args: [T1, T2, T3, T4]): CallEffect; export function apply(context: any, fn: CallFuncRest, ...args: any[]): CallEffect; interface CpsEffect { CPS: CallEffectDescriptor; } type CpsCallback = (error: any, result: any) => void; export function cps(fn: CallEffectArg>): CpsEffect; export function cps(fn: CallEffectArg>, arg1: T1): CpsEffect; export function cps(fn: CallEffectArg>, arg1: T1, arg2: T2): CpsEffect; export function cps( fn: CallEffectArg>, arg1: T1, arg2: T2, arg3: T3): CpsEffect; export function cps( fn: CallEffectArg>, arg1: T1, arg2: T2, arg3: T3, arg4: T4): CpsEffect; interface ForkEffectDescriptor extends CallEffectDescriptor { detached?: boolean; } interface ForkEffect { FORK: ForkEffectDescriptor; } export const fork: CallEffectFactory; export const spawn: CallEffectFactory; interface JoinEffect { JOIN: Task; } export function join(task: Task): JoinEffect; interface CancelEffect { CANCEL: Task; } export function cancel(task: Task): CancelEffect; interface SelectEffectDescriptor { selector(state: any, ...args: any[]): any; args: any[]; } interface SelectEffect { SELECT: SelectEffectDescriptor; } export function select(): SelectEffect; export function select(selector: CallFunc1): SelectEffect; export function select(selector: CallFunc2, arg1: T1): SelectEffect; export function select(selector: CallFunc3, arg1: T1, arg2: T2): SelectEffect; export function select(selector: CallFunc4, arg1: T1, arg2: T2, arg3: T3): SelectEffect; export function select( selector: CallFunc5, arg1: T1, arg2: T2, arg3: T3, arg4: T4): SelectEffect; interface ActionChannelEffectDescriptor { pattern: Pattern; buffer: Buffer; } interface ActionChannelEffect { ACTION_CHANNEL: ActionChannelEffectDescriptor; } export function actionChannel(pattern: Pattern, buffer?: Buffer): ActionChannelEffect; interface CancelledEffect { CANCELLED: {}; } export function cancelled(): CancelledEffect; export type Effect = TakeEffect | PutEffect | RaceEffect | CallEffect | CpsEffect | ForkEffect | JoinEffect | CancelEffect | SelectEffect | ActionChannelEffect | CancelledEffect; type HelperFunc0 = (action?: A) => any; type HelperFunc1 = (arg1: T1, action?: A) => any; type HelperFunc2 = (arg1: T1, arg2: T2, action?: A) => any; type HelperFunc3 = (arg1: T1, arg2: T2, arg3: T3, action?: A) => any; type HelperFunc4 = (arg1: T1, arg2: T2, arg3: T3, arg4: T4, action?: A) => any; type HelperFuncRest = (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, ...rest: any[]) => any; interface TakeHelper { (pattern: Pattern, worker: HelperFunc0): ForkEffect; (pattern: Pattern, worker: HelperFunc1, arg1: T1): ForkEffect; (pattern: Pattern, worker: HelperFunc2, arg1: T1, arg2: T2): ForkEffect; (pattern: Pattern, worker: HelperFunc3, arg1: T1, arg2: T2, arg3: T3): ForkEffect; (pattern: Pattern, worker: HelperFunc4, arg1: T1, arg2: T2, arg3: T3, arg4: T4): ForkEffect; (pattern: Pattern, worker: HelperFuncRest, arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, ...rest: any[]): ForkEffect; } interface ThrottleHelper { (ms: number, pattern: Pattern, worker: HelperFunc0): ForkEffect; (ms: number, pattern: Pattern, worker: HelperFunc1, arg1: T1): ForkEffect; (ms: number, pattern: Pattern, worker: HelperFunc2, arg1: T1, arg2: T2): ForkEffect; (ms: number, pattern: Pattern, worker: HelperFunc3, arg1: T1, arg2: T2, arg3: T3): ForkEffect; (ms: number, pattern: Pattern, worker: HelperFunc4, arg1: T1, arg2: T2, arg3: T3, arg4: T4): ForkEffect; (ms: number, pattern: Pattern, worker: HelperFuncRest, arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, ...rest: any[]): ForkEffect; } export const takeEvery: TakeHelper; export const takeLatest: TakeHelper; export const throttle: ThrottleHelper;