/** @module array/reduceArray.ts */
import { untypedCurry } from '../function/untypedCurry'
interface ReduceArrayCurried {
( initialValue: V, arr: A[] ): V
( initialValue: V ): ( arr: A[] ) => V
}
export function reduceArray( reducerFn: ( acc: V, item: A ) => V, initialValue: V, arr: A[] ): V
export function reduceArray( fn: ( acc: V, item: A ) => V, initialValue: V ): ( arr: A[] ) => V
export function reduceArray( fn: ( acc: V, item: A ) => V ): ReduceArrayCurried
/**
* Reduce an array
*
* @param reducerFn function that reduces the function
* @param initialValue initial value (and final type) array is catamorphised into
* @param arr the array to reduce
* @example
* reduceArray( (acc,item) => acc + item, 0, [1,2,3,4] )
* // => 10
*/
export function reduceArray( ...args ) {
return untypedCurry( ( fn, initialValue, arr ) => arr.reduce( fn, initialValue ) )( ...args )
}