UNPKG

@ndhoule/foldl

Version:

Apply a function to each value in a collection, accumulating the results into a single return value.

55 lines (47 loc) 1.53 kB
'use strict'; /* * Module dependencies. */ var each = require('@ndhoule/each'); /** * Reduces all the values in a collection down into a single value. Does so by iterating through the * collection from left to right, repeatedly calling an `iterator` function and passing to it four * arguments: `(accumulator, value, index, collection)`. * * Returns the final return value of the `iterator` function. * * @name foldl * @api public * @param {Function} iterator The function to invoke per iteration. * @param {*} accumulator The initial accumulator value, passed to the first invocation of `iterator`. * @param {Array|Object} collection The collection to iterate over. * @return {*} The return value of the final call to `iterator`. * @example * foldl(function(total, n) { * return total + n; * }, 0, [1, 2, 3]); * //=> 6 * * var phonebook = { bob: '555-111-2345', tim: '655-222-6789', sheila: '655-333-1298' }; * * foldl(function(results, phoneNumber) { * if (phoneNumber[0] === '6') { * return results.concat(phoneNumber); * } * return results; * }, [], phonebook); * // => ['655-222-6789', '655-333-1298'] */ var foldl = function foldl(iterator, accumulator, collection) { if (typeof iterator !== 'function') { throw new TypeError('Expected a function but received a ' + typeof iterator); } each(function(val, i, collection) { accumulator = iterator(accumulator, val, i, collection); }, collection); return accumulator; }; /* * Exports. */ module.exports = foldl;