Transduce

by wuct

JavaScript

var compose = (...funcs) => arg => {
  return funcs.reduce((result, func) => {
    return func(result)
  }, arg)
}


function mapping(transform) {
    return function (reduce) {
        console.log('mapping reduce', reduce)
        return function (result, input) {
        		console.log('mapping', input)
            return reduce(result, transform(input));
        };
    };
}

function filtering(predicate) {
    return function (reduce) {
        console.log('filtering reduce', reduce)
        return function (result, input) {
            console.log('filtering', input)
            return (
                predicate(input) ?
                    reduce(result, input) :
                    result
            );
        };
    };
}

var filterLessThanThreeAndIncrement = compose(
    //filtering(i => i < 3),
    mapping(i => i + 1),
    filtering(i => i < 3)
);

function concat(a, b) {
    console.log('concat', a)
    return a.concat([b]);
}

var result = [1,2,3,4].reduce(filterLessThanThreeAndIncrement(concat), [])
console.log(result)