-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
commuteMap.js
34 lines (32 loc) · 1.27 KB
/
commuteMap.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
var _curry3 = require('./internal/_curry3');
var _reduce = require('./internal/_reduce');
var ap = require('./ap');
var append = require('./append');
var map = require('./map');
/**
* Turns a list of Functors into a Functor of a list, applying
* a mapping function to the elements of the list along the way.
*
* @func
* @memberOf R
* @category List
* @see R.commute
* @sig Functor f => (f a -> f b) -> (x -> f x) -> [f a] -> f [b]
* @param {Function} fn The transformation function
* @param {Function} of A function that returns the data type to return
* @param {Array} list An array of functors of the same type
* @return {*}
* @example
*
* R.commuteMap(R.map(R.add(10)), R.of, [[1], [2, 3]]); //=> [[11, 12], [11, 13]]
* R.commuteMap(R.map(R.add(10)), R.of, [[1, 2], [3]]); //=> [[11, 13], [12, 13]]
* R.commuteMap(R.map(R.add(10)), R.of, [[1], [2], [3]]); //=> [[11, 12, 13]]
* R.commuteMap(R.map(R.add(10)), Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([11, 12, 13])
* R.commuteMap(R.map(R.add(10)), Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()
*/
module.exports = _curry3(function commuteMap(fn, of, list) {
function consF(acc, ftor) {
return ap(map(append, fn(ftor)), acc);
}
return _reduce(consF, of([]), list);
});