Skip to content

Instantly share code, notes, and snippets.

@dphilipson
Created February 28, 2018 22:33
Show Gist options
  • Save dphilipson/10b4bb7c899dc537f8915899c7a3d896 to your computer and use it in GitHub Desktop.
Save dphilipson/10b4bb7c899dc537f8915899c7a3d896 to your computer and use it in GitHub Desktop.
Combine redux-saga with Redoodle for marginally better static typing
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