-
Notifications
You must be signed in to change notification settings - Fork 1
/
reduce.js
45 lines (40 loc) · 1.21 KB
/
reduce.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import { pipe } from "../pipe/pipe.js"
const _reduce = (_fn, defaultAcc, _input) => {
let acc = defaultAcc
const input = Array.isArray(_input) ? _input : [_input]
const fn = Array.isArray(_fn) ? pipe(..._fn) : _fn
for (let index = 0, length = input.length; index < length; index++) {
acc = fn(acc, input[index], index, input)
}
return acc
}
/**
* Apply a function against an accumulator and each element in the array (from
* left to right) to reduce it to a single value.
*
* @param {Function} fn Reduce function
* @param {Object} defaultAcc Default accumulator value
* @param {Array} input Source input
* @param {...any} params Function params
*
* @returns {any}
*
* @name reduce
* @tag Array
* @signature (fn: Function, defaultAcc: mixed) => (input: Array): mixed
* @signature (fn: Function, defaultAcc: mixed, input: Array): mixed
*
* @example
* const sum = (acc, item) => acc + item
*
* reduce(sum, 0, [1, 2])
* // => 3
*/
export const reduce = (...params) => {
// @signature (fn, defaultAcc) => (input)
if (params.length <= 2) {
return input => _reduce(params[0], params[1], input)
}
// @signature (fn, defaultAcc, input)
return _reduce(...params)
}