{{alias}}( collection, initial, [options,] reducer, done ) Applies a function against an accumulator and each element in a collection and returns the accumulated result, iterating from right to left. When invoked, `reducer` is provided a maximum of five arguments: - `accumulator`: accumulated value - `value`: collection value - `index`: collection index - `collection`: the input collection - `next`: a callback to be invoked after processing a collection `value` The actual number of provided arguments depends on function length. If `reducer` accepts three arguments, `reducer` is provided: - `accumulator` - `value` - `next` If `reducer` accepts four arguments, `reducer` is provided: - `accumulator` - `value` - `index` - `next` For every other `reducer` signature, `reducer` is provided all five arguments. The `next` callback accepts two arguments: - `error`: error argument - `accumulator`: accumulated value If a provided function calls the `next` callback with a truthy `error` argument, the function suspends execution and immediately calls the `done` callback for subsequent `error` handling. Execution is *not* guaranteed to be asynchronous. To guarantee asynchrony, wrap the `done` callback in a function which either executes at the end of the current stack (e.g., `nextTick`) or during a subsequent turn of the event loop (e.g., `setImmediate`, `setTimeout`). The function does not support dynamic collection resizing. If provided an empty collection, the function invokes the `done` callback with the `initial` value as the second argument. The function does not skip `undefined` elements. When processing collection elements concurrently, *beware* of race conditions when updating an accumulator. This is especially true when an accumulator is a primitive (e.g., a number). In general, prefer object accumulators. Parameters ---------- collection: Array|TypedArray|Object Input collection over which to iterate. If provided an object, the object must be array-like (excluding strings and functions). initial: any Accumulator value used in the first invocation of the reduction function. options: Object (optional) Function options. options.limit: integer (optional) Maximum number of pending invocations. Default: Infinity. options.series: boolean (optional) Boolean indicating whether to process each collection element sequentially. Default: true. options.thisArg: any (optional) Execution context. reducer: Function The function to invoke for each element in a collection. done: Function A callback invoked either upon processing all collection elements or upon encountering an error. Examples -------- // Basic usage: > function fcn( acc, value, index, next ) { ... setTimeout( onTimeout, value ); ... function onTimeout() { ... console.log( value ); ... acc.sum += value; ... next( null, acc ); ... } ... }; > function done( error, acc ) { ... if ( error ) { ... throw error; ... } ... console.log( acc.sum ); ... }; > var arr = [ 1000, 2500, 3000 ]; > var acc = { 'sum': 0 }; > {{alias}}( arr, acc, fcn, done ) 3000 2500 1000 6500 // Limit number of concurrent invocations: > function fcn( acc, value, index, next ) { ... setTimeout( onTimeout, value ); ... function onTimeout() { ... console.log( value ); ... acc.sum += value; ... next( null, acc ); ... } ... }; > function done( error, acc ) { ... if ( error ) { ... throw error; ... } ... console.log( acc.sum ); ... }; > var opts = { 'limit': 2 }; > var arr = [ 1000, 2500, 3000 ]; > var acc = { 'sum': 0 }; > {{alias}}( arr, acc, opts, fcn, done ) 2500 3000 1000 6500 // Process concurrently: > function fcn( acc, value, index, next ) { ... setTimeout( onTimeout, value ); ... function onTimeout() { ... console.log( value ); ... acc.sum += value; ... next( null, acc ); ... } ... }; > function done( error, acc ) { ... if ( error ) { ... throw error; ... } ... console.log( acc.sum ); ... }; > var opts = { 'series': false }; > var arr = [ 1000, 2500, 3000 ]; > var acc = { 'sum': 0 }; > {{alias}}( arr, acc, opts, fcn, done ) 1000 2500 3000 6500 {{alias}}.factory( [options,] fcn ) Returns a function which applies a function against an accumulator and each element in a collection and returns the accumulated result, iterating from right to left. Parameters ---------- options: Object (optional) Function options. options.limit: integer (optional) Maximum number of pending invocations. Default: Infinity. options.series: boolean (optional) Boolean indicating whether to process each collection element sequentially. Default: true. options.thisArg: any (optional) Execution context. fcn: Function The function to invoke for each element in a collection. Returns ------- out: Function A function which invokes a function for each element in a collection. Examples -------- > function fcn( acc, value, index, next ) { ... setTimeout( onTimeout, value ); ... function onTimeout() { ... console.log( value ); ... acc.sum += value; ... next( null, acc ); ... } ... }; > var opts = { 'series': false }; > var f = {{alias}}.factory( opts, fcn ); > function done( error, acc ) { ... if ( error ) { ... throw error; ... } ... console.log( acc.sum ); ... }; > var arr = [ 1000, 2500, 3000 ]; > var acc = { 'sum': 0 }; > f( arr, acc, done ) 1000 2500 3000 6500 > acc = { 'sum': 0 }; > arr = [ 1000, 1500, 2000 ]; > f( arr, acc, done ) 1000 1500 2000 4500 See Also --------