|
| 1 | +// copied from just-curry-it |
| 2 | + |
| 3 | +interface CurriedFunction1<T1, R> { |
| 4 | + (): CurriedFunction1<T1, R> |
| 5 | + |
| 6 | + (t1: T1): R |
| 7 | +} |
| 8 | + |
| 9 | +interface CurriedFunction2<T1, T2, R> { |
| 10 | + (): CurriedFunction2<T1, T2, R> |
| 11 | + |
| 12 | + (t1: T1): CurriedFunction1<T2, R> |
| 13 | + |
| 14 | + (t1: T1, t2: T2): R |
| 15 | +} |
| 16 | + |
| 17 | +interface CurriedFunction3<T1, T2, T3, R> { |
| 18 | + (): CurriedFunction3<T1, T2, T3, R> |
| 19 | + |
| 20 | + (t1: T1): CurriedFunction2<T2, T3, R> |
| 21 | + |
| 22 | + (t1: T1, t2: T2): CurriedFunction1<T3, R> |
| 23 | + |
| 24 | + (t1: T1, t2: T2, t3: T3): R |
| 25 | +} |
| 26 | + |
| 27 | +interface CurriedFunction4<T1, T2, T3, T4, R> { |
| 28 | + (): CurriedFunction4<T1, T2, T3, T4, R> |
| 29 | + |
| 30 | + (t1: T1): CurriedFunction3<T2, T3, T4, R> |
| 31 | + |
| 32 | + (t1: T1, t2: T2): CurriedFunction2<T3, T4, R> |
| 33 | + |
| 34 | + (t1: T1, t2: T2, t3: T3): CurriedFunction1<T4, R> |
| 35 | + |
| 36 | + (t1: T1, t2: T2, t3: T3, t4: T4): R |
| 37 | +} |
| 38 | + |
| 39 | +interface CurriedFunction5<T1, T2, T3, T4, T5, R> { |
| 40 | + (): CurriedFunction5<T1, T2, T3, T4, T5, R> |
| 41 | + |
| 42 | + (t1: T1): CurriedFunction4<T2, T3, T4, T5, R> |
| 43 | + |
| 44 | + (t1: T1, t2: T2): CurriedFunction3<T3, T4, T5, R> |
| 45 | + |
| 46 | + (t1: T1, t2: T2, t3: T3): CurriedFunction2<T4, T5, R> |
| 47 | + |
| 48 | + (t1: T1, t2: T2, t3: T3, t4: T4): CurriedFunction1<T5, R> |
| 49 | + |
| 50 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5): R |
| 51 | +} |
| 52 | + |
| 53 | +interface CurriedFunction6<T1, T2, T3, T4, T5, T6, R> { |
| 54 | + (): CurriedFunction6<T1, T2, T3, T4, T5, T6, R> |
| 55 | + |
| 56 | + (t1: T1): CurriedFunction5<T2, T3, T4, T5, T6, R> |
| 57 | + |
| 58 | + (t1: T1, t2: T2): CurriedFunction4<T3, T4, T5, T6, R> |
| 59 | + |
| 60 | + (t1: T1, t2: T2, t3: T3): CurriedFunction3<T4, T5, T6, R> |
| 61 | + |
| 62 | + (t1: T1, t2: T2, t3: T3, t4: T4): CurriedFunction2<T5, T6, R> |
| 63 | + |
| 64 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5): CurriedFunction1<T6, R> |
| 65 | + |
| 66 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6): R |
| 67 | +} |
| 68 | + |
| 69 | +interface CurriedFunction7<T1, T2, T3, T4, T5, T6, T7, R> { |
| 70 | + (): CurriedFunction7<T1, T2, T3, T4, T5, T6, T7, R> |
| 71 | + |
| 72 | + (t1: T1): CurriedFunction6<T2, T3, T4, T5, T6, T7, R> |
| 73 | + |
| 74 | + (t1: T1, t2: T2): CurriedFunction5<T3, T4, T5, T6, T7, R> |
| 75 | + |
| 76 | + (t1: T1, t2: T2, t3: T3): CurriedFunction4<T4, T5, T6, T7, R> |
| 77 | + |
| 78 | + (t1: T1, t2: T2, t3: T3, t4: T4): CurriedFunction3<T5, T6, T7, R> |
| 79 | + |
| 80 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5): CurriedFunction2<T6, T7, R> |
| 81 | + |
| 82 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6): CurriedFunction1<T7, R> |
| 83 | + |
| 84 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7): R |
| 85 | +} |
| 86 | + |
| 87 | +interface CurriedFunction8<T1, T2, T3, T4, T5, T6, T7, T8, R> { |
| 88 | + (): CurriedFunction8<T1, T2, T3, T4, T5, T6, T7, T8, R> |
| 89 | + |
| 90 | + (t1: T1): CurriedFunction7<T2, T3, T4, T5, T6, T7, T8, R> |
| 91 | + |
| 92 | + (t1: T1, t2: T2): CurriedFunction6<T3, T4, T5, T6, T7, T8, R> |
| 93 | + |
| 94 | + (t1: T1, t2: T2, t3: T3): CurriedFunction5<T4, T5, T6, T7, T8, R> |
| 95 | + |
| 96 | + (t1: T1, t2: T2, t3: T3, t4: T4): CurriedFunction4<T5, T6, T7, T8, R> |
| 97 | + |
| 98 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5): CurriedFunction3<T6, T7, T8, R> |
| 99 | + |
| 100 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6): CurriedFunction2<T7, T8, R> |
| 101 | + |
| 102 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7): CurriedFunction1<T8, R> |
| 103 | + |
| 104 | + (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8): R |
| 105 | +} |
| 106 | + |
| 107 | +/** |
| 108 | + * Creates a function that accepts one or more arguments of func that when called either invokes func returning |
| 109 | + * its result, if all func arguments have been provided, or returns a function that accepts one or more of the |
| 110 | + * remaining func arguments, and so on. The arity of func may be specified if func.length is not sufficient. |
| 111 | + * @param func The function to curry. |
| 112 | + * @param arity The arity of func. |
| 113 | + * @return Returns the new curried function. |
| 114 | + */ |
| 115 | +export function curry<T1, R>(func: (t1: T1) => R, arity?: number): CurriedFunction1<T1, R> |
| 116 | +export function curry<T1, T2, R>(func: (t1: T1, t2: T2) => R, arity?: number): CurriedFunction2<T1, T2, R> |
| 117 | +export function curry<T1, T2, T3, R>( |
| 118 | + func: (t1: T1, t2: T2, t3: T3) => R, |
| 119 | + arity?: number, |
| 120 | +): CurriedFunction3<T1, T2, T3, R> |
| 121 | +export function curry<T1, T2, T3, T4, R>( |
| 122 | + func: (t1: T1, t2: T2, t3: T3, t4: T4) => R, |
| 123 | + arity?: number, |
| 124 | +): CurriedFunction4<T1, T2, T3, T4, R> |
| 125 | +export function curry<T1, T2, T3, T4, T5, R>( |
| 126 | + func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R, |
| 127 | + arity?: number, |
| 128 | +): CurriedFunction5<T1, T2, T3, T4, T5, R> |
| 129 | +export function curry<T1, T2, T3, T4, T5, T6, R>( |
| 130 | + func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6) => R, |
| 131 | + arity?: number, |
| 132 | +): CurriedFunction6<T1, T2, T3, T4, T5, T6, R> |
| 133 | +export function curry<T1, T2, T3, T4, T5, T6, T7, R>( |
| 134 | + func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7) => R, |
| 135 | + arity?: number, |
| 136 | +): CurriedFunction7<T1, T2, T3, T4, T5, T6, T7, R> |
| 137 | +export function curry<T1, T2, T3, T4, T5, T6, T7, T8, R>( |
| 138 | + func: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8) => R, |
| 139 | + arity?: number, |
| 140 | +): CurriedFunction8<T1, T2, T3, T4, T5, T6, T7, T8, R> |
| 141 | +export function curry(fn: (...args: any[]) => any, arity?: number) { |
| 142 | + return function curried() { |
| 143 | + if (arity == null) { |
| 144 | + arity = fn.length |
| 145 | + } |
| 146 | + const args = [].slice.call(arguments) |
| 147 | + if (args.length >= arity) { |
| 148 | + // @ts-ignore |
| 149 | + return fn.apply(this, args) |
| 150 | + } else { |
| 151 | + return function() { |
| 152 | + // @ts-ignore |
| 153 | + return curried.apply(this, args.concat([].slice.call(arguments))) |
| 154 | + } |
| 155 | + } |
| 156 | + } |
| 157 | +} |
0 commit comments