/** @module array/foldArray.ts */
import { untypedCurry } from '../function/untypedCurry'
export interface FoldArrayCurried {
( fn: ( acc: V, item: A ) => V ): ( arr: A[] ) => V
( fn: ( acc: V, item: A ) => V, arr: A[] ): V
}
export function foldArray( initial: V, fn: ( acc: V, item: A ) => V, arr: A[] ): V
export function foldArray( initialValue: V, fn: ( acc: V, item: A ) => V ): ( arr: A[] ) => V
export function foldArray( initialValue: V ): FoldArrayCurried
/**
* Folds an array -- like reduce. Here we have initial and fn parameters
* positions are flipped for convenience
*
* @param initial
* @param fn
* @param arr
* @sig b -> ( (b,a) -> b ) -> a[] -> b
* @example
* foldArray( 0, (acc,item) => acc + item, [1,2,3] )
* //=> 6 : number
*/
export function foldArray( ...args ) {
return untypedCurry( ( initialValue, fn, arr ) => arr.reduce( fn, initialValue ) )( ...args )
}