/**
* Returns a single item by iterating over an array like object and call a function on each item, starting from the first item in the iterator
* The initial value is taken from the iterator.
* Reduce works only on Arrays and returns a valueof the type of the first element in the Array
*
* @function reduce
* @desc Returns a single item by iterating over an array like object and call a function on each item, starting from the first item in the iterator
* @since v1.0.4
* @param {Function} cb - receives 4 values: the accumulator, the item, the index, and the initial value.
* @param {Array} a - The iterator to apply the function
* @return {*}
**/
import curry from './curry'
import fold from './array/fold'
export default curry(function reduce (cb, a) {
const arr = a.slice()
const init = arr.shift()
return fold(cb, init, arr)
})