|
| 1 | +export type UnaryFunc<T, R> = (arg: T) => R |
1 | 2 | export type Func<TArgs = any, KReturn = any | void> = (
|
2 | 3 | ...args: TArgs[]
|
3 | 4 | ) => KReturn
|
4 | 5 |
|
5 |
| -export const chain = |
6 |
| - (...funcs: Func[]) => |
7 |
| - (...args: any[]) => { |
8 |
| - return funcs.slice(1).reduce((acc, fn) => fn(acc), funcs[0](...args)) |
| 6 | +export function chain<T1, T2, R>(fn1: UnaryFunc<T1, T2>, fn2: UnaryFunc<T2, R>): UnaryFunc<T1, R>; |
| 7 | +export function chain<T1, T2, T3, R>(fn1: UnaryFunc<T1, T2>, fn2: UnaryFunc<T2, T3>, fn3: UnaryFunc<T3, R>): UnaryFunc<T1, R>; |
| 8 | +export function chain<T1, T2, T3, T4, R>(fn1: UnaryFunc<T1, T2>, fn2: UnaryFunc<T2, T3>, fn3: UnaryFunc<T3, T4>, fn4: UnaryFunc<T4, R>): UnaryFunc<T1, R>; |
| 9 | +export function chain<T1, T2, T3, T4, T5, R>(fn1: UnaryFunc<T1, T2>, fn2: UnaryFunc<T2, T3>, fn3: UnaryFunc<T3, T4>, fn4: UnaryFunc<T4, T5>, fn5: UnaryFunc<T5, R>): UnaryFunc<T1, R>; |
| 10 | +export function chain<T1, T2, T3, T4, T5, T6, R>(fn1: UnaryFunc<T1, T2>, fn2: UnaryFunc<T2, T3>, fn3: UnaryFunc<T3, T4>, fn4: UnaryFunc<T4, T5>, fn5: UnaryFunc<T5, T6>, fn6: UnaryFunc<T6, R>): UnaryFunc<T1, R>; |
| 11 | +export function chain<T1, T2, T3, T4, T5, T6, T7, R>(fn1: UnaryFunc<T1, T2>, fn2: UnaryFunc<T2, T3>, fn3: UnaryFunc<T3, T4>, fn4: UnaryFunc<T4, T5>, fn5: UnaryFunc<T5, T6>, fn6: UnaryFunc<T6, T7>, fn7: UnaryFunc<T7, R>): UnaryFunc<T1, R>; |
| 12 | +export function chain<T = any, R = any>(...fns: ((arg: any) => any)[]): UnaryFunc<T, R>; |
| 13 | +export function chain(...funcs: Func[]): Func { |
| 14 | + return function forX(initialParam: Parameters<Func>[0]) { |
| 15 | + return funcs.reduce((acc, fn) => fn(acc), initialParam) |
9 | 16 | }
|
| 17 | +} |
10 | 18 |
|
11 | 19 | export const compose = (...funcs: Func[]) => {
|
12 | 20 | return funcs.reverse().reduce((acc, fn) => fn(acc))
|
|
0 commit comments