type OperationFunction = (value: P) => R export function pipe(op1: OperationFunction): (initial: P) => A export function pipe(op1: OperationFunction, op2: OperationFunction): (initial?: P) => B export function pipe( op1: OperationFunction, op2: OperationFunction, op3: OperationFunction ): (initial?: P) => C export function pipe( op1: OperationFunction, op2: OperationFunction, op3: OperationFunction, op4: OperationFunction ): (initial?: P) => D export function pipe( op1: OperationFunction, op2: OperationFunction, op3: OperationFunction, op4: OperationFunction, op5: OperationFunction ): (initial?: P) => E export function pipe( op1: OperationFunction, op2: OperationFunction, op3: OperationFunction, op4: OperationFunction, op5: OperationFunction, op6: OperationFunction ): (initial?: P) => F export function pipe( op1: OperationFunction, op2: OperationFunction, op3: OperationFunction, op4: OperationFunction, op5: OperationFunction, op6: OperationFunction, op7: OperationFunction ): (initial?: P) => G export function pipe(...ops: Array>): (initial?: any) => any export function pipe(...fns: any[]) { return (initial: any) => fns.reduce((p, f) => f(p), initial) }