Skip to content

Instantly share code, notes, and snippets.

@owanturist
Created May 12, 2017 09:16
Show Gist options
  • Save owanturist/88e6fa36268dc4e4c3bb3b27058b4dc2 to your computer and use it in GitHub Desktop.
Save owanturist/88e6fa36268dc4e4c3bb3b27058b4dc2 to your computer and use it in GitHub Desktop.
/* @flow */
const curryResolver = (fn, arity, mem) => (...args) => {
const resultArgs = args.concat(mem);
return resultArgs.length >= arity
? fn(...resultArgs)
: curryResolver(fn, arity, resultArgs)
};
const curry: CurryFunction = fn => curryResolver(fn, fn.length, []);
interface CurryFunction {
<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R>((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) => R): CurriedFunction10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R>;
<T1, T2, T3, T4, T5, T6, T7, T8, T9, R>((T1, T2, T3, T4, T5, T6, T7, T8, T9) => R): CurriedFunction9<T1, T2, T3, T4, T5, T6, T7, T8, T9, R>;
<T1, T2, T3, T4, T5, T6, T7, T8, R>((T1, T2, T3, T4, T5, T6, T7, T8) => R): CurriedFunction8<T1, T2, T3, T4, T5, T6, T7, T8, R>;
<T1, T2, T3, T4, T5, T6, T7, R>((T1, T2, T3, T4, T5, T6, T7) => R): CurriedFunction7<T1, T2, T3, T4, T5, T6, T7, R>;
<T1, T2, T3, T4, T5, T6, R>((T1, T2, T3, T4, T5, T6) => R): CurriedFunction6<T1, T2, T3, T4, T5, T6, R>;
<T1, T2, T3, T4, T5, R>((T1, T2, T3, T4, T5) => R): CurriedFunction5<T1, T2, T3, T4, T5, R>;
<T1, T2, T3, T4, R>((T1, T2, T3, T4) => R): CurriedFunction4<T1, T2, T3, T4, R>;
<T1, T2, T3, R>((T1, T2, T3) => R): CurriedFunction3<T1, T2, T3, R>;
<T1, T2, R>((T1, T2) => R): CurriedFunction2<T1, T2, R>;
}
interface CurriedFunction1<T1, R> {
(T1): R;
}
interface CurriedFunction2<T1, T2, R> {
(T1, T2): R;
(T1): CurriedFunction1<T2, R>;
}
interface CurriedFunction3<T1, T2, T3, R> {
(T1, T2, T3): R;
(T1, T2): CurriedFunction1<T3, R>;
(T1): CurriedFunction2<T2, T3, R>;
}
interface CurriedFunction4<T1, T2, T3, T4, R> {
(T1, T2, T3, T4): R;
(T1, T2, T3): CurriedFunction1<T4, R>;
(T1, T2): CurriedFunction2<T3, T4, R>;
(T1): CurriedFunction3<T2, T3, T4, R>;
}
interface CurriedFunction5<T1, T2, T3, T4, T5, R> {
(T1, T2, T3, T4, T5): R;
(T1, T2, T3, T4): CurriedFunction1<T5, R>;
(T1, T2, T3): CurriedFunction2<T4, T5, R>;
(T1, T2): CurriedFunction3<T3, T4, T5, R>;
(T1): CurriedFunction4<T2, T3, T4, T5, R>;
}
interface CurriedFunction6<T1, T2, T3, T4, T5, T6, R> {
(T1, T2, T3, T4, T5, T6): R;
(T1, T2, T3, T4, T5): CurriedFunction1<T6, R>;
(T1, T2, T3, T4): CurriedFunction2<T5, T6, R>;
(T1, T2, T3): CurriedFunction3<T4, T5, T6, R>;
(T1, T2): CurriedFunction4<T3, T4, T5, T6, R>;
(T1): CurriedFunction5<T2, T3, T4, T5, T6, R>;
}
interface CurriedFunction7<T1, T2, T3, T4, T5, T6, T7, R> {
(T1, T2, T3, T4, T5, T6, T7): R;
(T1, T2, T3, T4, T5, T6): CurriedFunction1<T7, R>;
(T1, T2, T3, T4, T5): CurriedFunction2<T6, T7, R>;
(T1, T2, T3, T4): CurriedFunction3<T5, T6, T7, R>;
(T1, T2, T3): CurriedFunction4<T4, T5, T6, T7, R>;
(T1, T2): CurriedFunction5<T4, T4, T5, T6, T7, R>;
(T1): CurriedFunction6<T2, T3, T4, T5, T6, T7, R>;
}
interface CurriedFunction8<T1, T2, T3, T4, T5, T6, T7, T8, R> {
(T1, T2, T3, T4, T5, T6, T7, T8): R;
(T1, T2, T3, T4, T5, T6, T7): CurriedFunction1<T8, R>;
(T1, T2, T3, T4, T5, T6): CurriedFunction2<T7, T8, R>;
(T1, T2, T3, T4, T5): CurriedFunction3<T6, T7, T8, R>;
(T1, T2, T3, T4): CurriedFunction4<T5, T6, T7, T8, R>;
(T1, T2, T3): CurriedFunction5<T4, T5, T6, T7, T8, R>;
(T1, T2): CurriedFunction6<T3, T4, T5, T6, T7, T8, R>;
(T1): CurriedFunction7<T2, T3, T4, T5, T6, T7, T8, R>;
}
interface CurriedFunction9<T1, T2, T3, T4, T5, T6, T7, T8, T9, R> {
(T1, T2, T3, T4, T5, T6, T7, T8, T9): R;
(T1, T2, T3, T4, T5, T6, T7, T8): CurriedFunction1<T9, R>;
(T1, T2, T3, T4, T5, T6, T7): CurriedFunction2<T8, T9, R>;
(T1, T2, T3, T4, T5, T6): CurriedFunction3<T7, T8, T9, R>;
(T1, T2, T3, T4, T5): CurriedFunction4<T6, T7, T8, T9, R>;
(T1, T2, T3, T4): CurriedFunction5<T5, T6, T7, T8, T9, R>;
(T1, T2, T3): CurriedFunction6<T4, T5, T6, T7, T8, T9, R>;
(T1, T2): CurriedFunction7<T3, T4, T5, T6, T7, T8, T9, R>;
(T1): CurriedFunction8<T2, T3, T4, T5, T6, T7, T8, T9, R>;
}
interface CurriedFunction10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> {
(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10): R;
(T1, T2, T3, T4, T5, T6, T7, T8, T9): CurriedFunction1<T10, R>;
(T1, T2, T3, T4, T5, T6, T7, T8): CurriedFunction2<T9, T10, R>;
(T1, T2, T3, T4, T5, T6, T7): CurriedFunction3<T8, T9, T10, R>;
(T1, T2, T3, T4, T5, T6): CurriedFunction4<T7, T8, T9, T10, R>;
(T1, T2, T3, T4, T5): CurriedFunction5<T6, T7, T8, T9, T10, R>;
(T1, T2, T3, T4): CurriedFunction6<T5, T6, T7, T8, T9, T10, R>;
(T1, T2, T3): CurriedFunction7<T4, T5, T6, T7, T8, T9, T10, R>;
(T1, T2): CurriedFunction8<T3, T4, T5, T6, T7, T8, T9, T10, R>;
(T1): CurriedFunction9<T2, T3, T4, T5, T6, T7, T8, T9, T10, R>;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment