/* ARRAY METHOD COMPOSITION */

function curry(util) {
	return fn => list => util(fn,list);
}

function pipe(...fns) {
	return v => fns.reduce(
		(v,fn) => fn(v),
		v
	);
}

var map = curry(function map(fn,list){
	return list.map(fn);
});
var filter = curry(function filter(fn,list){
  return list.filter(fn);
});


// ****************************

var f = pipe(
	map(v => v + 1),
	map(v => v * 2),
	map(v => v + 3),
	filter(v => v % 3 == 0),
	map(v => "v: " + v)
);

f([0,1,2,3,4,5,6,7,8,9]);
// [ "v: 9", "v: 15", "v: 21" ]