/**
* @function fold
* @description Autocurried function which returns a single item by mapping over the provided array and calls an iterator function
* @param {cbFunction} cb - Callback function to modify the item
* @param {*} init - Initial value
* @param {Array} a - Array with items to modify by the cb function
* @returns {*}
* @see reduce
* @since 1.0.2
* @example
*
* const result = fold(add, 0, [1,1,1])
* // result = 3
*/
/**
* @callback cbFunction
* @param {*} r - Accumulator which accumulates the callback's return values
* @param {*} item - the current element being processed
* @param {number} index - the indey of the item being processed
* @param {Array} a - The initial array
* @return {*}
*/
import curry from '../curry'
export default curry(function fold (cb, init, a) {
let i = -1
const l = a.length
let r = init
while (++i < l) {
r = cb(r, a[i], i, a)
}
return r
})