# reduceRight

Apply a function against an accumulator and each element in a collection and return the accumulated result, iterating from right to left.

## Usage

``````var reduceRight = require( '@stdlib/utils/reduce-right' );
``````

#### reduceRight( collection, initial, reducer[, thisArg ] )

Applies a `function` against an accumulator and each element in a `collection` and returns the accumulated result, iterating from right to left.

``````function sum( accumulator, value ) {
return accumulator + value;
}

var arr = [ 1, 2, 3, 4 ];

var out = reduceRight( arr, 0, sum );
// returns 10
``````

The `reducer` function is provided four arguments:

• `accumulator`: accumulated value
• `value`: collection element
• `index`: collection index
• `collection`: input collection

Basic support for dynamic collections is provided. Note, however, that index incrementation is not guaranteed to be monotonically decreasing.

``````var arr = [ 1, 2, 3, 4 ];
var i = 0;

function sum1( accumulator, value, index, collection ) {
i += 1;
if ( index === 0 && collection.length < 10 ) {
collection.unshift( i+1 );
}
return accumulator + value;
}

var out = reduceRight( arr, 0, sum1 );
// returns 55

function sum2( accumulator, value, index, collection ) {
collection.pop();
return accumulator + value;
}

arr = [ 1, 2, 3, 4 ];

out = reduceRight( arr, 0, sum2 );
// returns 6
``````

To set the function execution context, provide a `thisArg`.

``````function sum( accumulator, value ) {
this.count += 1;
return accumulator + value;
}

var arr = [ 1, 2, 3, 4 ];

var context = {
'count': 0
};

var out = reduceRight( arr, 0, sum, context );
// returns 10

var mean = out / context.count;
// returns 2.5
``````
• A `collection` may be either an `Array`, `Typed Array`, or an array-like `Object` (excluding `strings` and `functions`).

• The function differs from `Array.prototype.reduceRight` in the following ways:

• The function requires an `initial` value for the `accumulator`. The `initial` value is used during the first invocation of the `reducer` function.

• The function does not skip the first element in the `collection`.

• The function does not skip `undefined` elements.

``````function log( accumulator, value, index ) {
console.log( '%s: %s', index, value );
return accumulator;
}

var arr = [ 1, , , 4 ];

var out = reduceRight( arr, 0, log );
/* =>
3: 4
2: undefined
1: undefined
0: 1
*/
``````
• The function provides limited support for dynamic collections (i.e., collections whose `length` changes during execution).