Created
February 28, 2018 22:33
-
-
Save dphilipson/10b4bb7c899dc537f8915899c7a3d896 to your computer and use it in GitHub Desktop.
Combine redux-saga with Redoodle for marginally better static typing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { TypedAction, TypedActionString } from "redoodle"; | |
import { | |
ForkEffect, | |
takeEvery, | |
takeLatest, | |
throttle, | |
} from "redux-saga/effects"; | |
type HelperFunc0<A> = (action: A) => any; | |
type HelperFunc1<A, T1> = (arg1: T1, action: A) => any; | |
type HelperFunc2<A, T1, T2> = (arg1: T1, arg2: T2, action: A) => any; | |
type HelperFunc3<A, T1, T2, T3> = ( | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
action: A, | |
) => any; | |
type HelperFunc4<A, T1, T2, T3, T4> = ( | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
action: A, | |
) => any; | |
type HelperFunc5<A, T1, T2, T3, T4, T5> = ( | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
action: A, | |
) => any; | |
type HelperFunc6Rest<_A, T1, T2, T3, T4, T5, T6> = ( | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
arg6: T6, | |
arg7: any, | |
...rest: any[] | |
) => any; | |
export function takeEveryTyped<PayloadT>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc0<TypedAction<PayloadT>>, | |
): ForkEffect; | |
export function takeEveryTyped<PayloadT, T1>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc1<TypedAction<PayloadT>, T1>, | |
arg1: T1, | |
): ForkEffect; | |
export function takeEveryTyped<PayloadT, T1, T2>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc2<TypedAction<PayloadT>, T1, T2>, | |
arg1: T1, | |
arg2: T2, | |
): ForkEffect; | |
export function takeEveryTyped<PayloadT, T1, T2, T3>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc3<TypedAction<PayloadT>, T1, T2, T3>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
): ForkEffect; | |
export function takeEveryTyped<PayloadT, T1, T2, T3, T4>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc4<TypedAction<PayloadT>, T1, T2, T3, T4>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
): ForkEffect; | |
export function takeEveryTyped<PayloadT, T1, T2, T3, T4, T5>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc5<TypedAction<PayloadT>, T1, T2, T3, T4, T5>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
): ForkEffect; | |
export function takeEveryTyped<PayloadT, T1, T2, T3, T4, T5, T6>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc6Rest<TypedAction<PayloadT>, T1, T2, T3, T4, T5, T6>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
arg6: T6, | |
...rest: any[] | |
): ForkEffect; | |
export function takeEveryTyped(this: any, ...args: any[]): ForkEffect { | |
return takeEvery.call(this, ...args); | |
} | |
// tslint:disable-next-line:no-shadowed-variable | |
export const takeLatestTyped: typeof takeEveryTyped = function takeLatestTyped( | |
this: any, | |
...args: any[] | |
): ForkEffect { | |
return takeLatest.call(this, ...args); | |
}; | |
export function takeEveryPayload<PayloadT>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc0<PayloadT>, | |
): ForkEffect; | |
export function takeEveryPayload<PayloadT, T1>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc1<PayloadT, T1>, | |
arg1: T1, | |
): ForkEffect; | |
export function takeEveryPayload<PayloadT, T1, T2>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc2<PayloadT, T1, T2>, | |
arg1: T1, | |
arg2: T2, | |
): ForkEffect; | |
export function takeEveryPayload<PayloadT, T1, T2, T3>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc3<PayloadT, T1, T2, T3>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
): ForkEffect; | |
export function takeEveryPayload<PayloadT, T1, T2, T3, T4>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc4<PayloadT, T1, T2, T3, T4>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
): ForkEffect; | |
export function takeEveryPayload<PayloadT, T1, T2, T3, T4, T5>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc5<PayloadT, T1, T2, T3, T4, T5>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
): ForkEffect; | |
export function takeEveryPayload<PayloadT, T1, T2, T3, T4, T5, T6>( | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc6Rest<PayloadT, T1, T2, T3, T4, T5, T6>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
arg6: T6, | |
...rest: any[] | |
): ForkEffect; | |
export function takeEveryPayload<PayloadT>( | |
this: any, | |
actionType: TypedActionString<PayloadT>, | |
worker: any, | |
...args: any[] | |
) { | |
return takeEveryTyped(actionType, action => | |
worker.call(this, ...args, action.payload), | |
); | |
} | |
// tslint:disable-next-line:no-shadowed-variable | |
export const takeLatestPayload: typeof takeEveryPayload = function takeLatestPayload< | |
PayloadT | |
>( | |
this: any, | |
actionType: TypedActionString<PayloadT>, | |
worker: any, | |
...args: any[] | |
): ForkEffect { | |
return takeLatestTyped(actionType, action => | |
worker.call(this, ...args, action.payload), | |
); | |
}; | |
export function throttleTyped<PayloadT>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc0<TypedAction<PayloadT>>, | |
): ForkEffect; | |
export function throttleTyped<PayloadT, T1>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc1<TypedAction<PayloadT>, T1>, | |
arg1: T1, | |
): ForkEffect; | |
export function throttleTyped<PayloadT, T1, T2>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc2<TypedAction<PayloadT>, T1, T2>, | |
arg1: T1, | |
arg2: T2, | |
): ForkEffect; | |
export function throttleTyped<PayloadT, T1, T2, T3>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc3<TypedAction<PayloadT>, T1, T2, T3>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
): ForkEffect; | |
export function throttleTyped<PayloadT, T1, T2, T3, T4>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc4<TypedAction<PayloadT>, T1, T2, T3, T4>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
): ForkEffect; | |
export function throttleTyped<PayloadT, T1, T2, T3, T4, T5>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc5<TypedAction<PayloadT>, T1, T2, T3, T4, T5>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
): ForkEffect; | |
export function throttleTyped<PayloadT, T1, T2, T3, T4, T5, T6>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc6Rest<TypedAction<PayloadT>, T1, T2, T3, T4, T5, T6>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
arg6: T6, | |
...rest: any[] | |
): ForkEffect; | |
export function throttleTyped(this: any, ...args: any[]): ForkEffect { | |
return throttle.call(this, ...args); | |
} | |
export function throttlePayload<PayloadT>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc0<PayloadT>, | |
): ForkEffect; | |
export function throttlePayload<PayloadT, T1>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc1<PayloadT, T1>, | |
arg1: T1, | |
): ForkEffect; | |
export function throttlePayload<PayloadT, T1, T2>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc2<PayloadT, T1, T2>, | |
arg1: T1, | |
arg2: T2, | |
): ForkEffect; | |
export function throttlePayload<PayloadT, T1, T2, T3>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc3<PayloadT, T1, T2, T3>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
): ForkEffect; | |
export function throttlePayload<PayloadT, T1, T2, T3, T4>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc4<PayloadT, T1, T2, T3, T4>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
): ForkEffect; | |
export function throttlePayload<PayloadT, T1, T2, T3, T4, T5>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc5<PayloadT, T1, T2, T3, T4, T5>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
): ForkEffect; | |
export function throttlePayload<PayloadT, T1, T2, T3, T4, T5, T6>( | |
ms: number, | |
actionType: TypedActionString<PayloadT>, | |
worker: HelperFunc6Rest<PayloadT, T1, T2, T3, T4, T5, T6>, | |
arg1: T1, | |
arg2: T2, | |
arg3: T3, | |
arg4: T4, | |
arg5: T5, | |
arg6: T6, | |
...rest: any[] | |
): ForkEffect; | |
export function throttlePayload(this: any, ...args: any[]): ForkEffect { | |
return throttle.call(this, ...args); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment