export type ReduceCallbackFunction = ( previousValue: ReduceTo, currentValue: ArrOf, currentIndex: number, array: readonly ArrOf[] ) => ReduceTo; export type ReduceArguments = [ReduceCallbackFunction, ReduceTo]; export function toReduceArguments( arrOp: (arr: readonly ArrOf[], ...params: Params) => ReduceTo, ...params: Params ): ReduceArguments { let outWrap: [ReduceTo] | [] = []; const reduceCallbackFunction: ReduceCallbackFunction = (...[, , , array]) => { let out: ReduceTo; if (outWrap.length === 1) { out = outWrap[0]; } else { out = arrOp(array, ...params); outWrap = [out]; } return out; }; return [ reduceCallbackFunction, arrOp([], ...params) ]; }