liftN = {
function curry(arity, fn, ...args) {
if(arity <= args.length) {
return fn(...args);
}
return curry.bind(null, arity, fn, ...args);
}
const apply = (arg, fn) => fn(arg);
const pipe = (fns) => (arg) => fns.reduce(apply, arg);
return function(fn, R1, ...RN) {
const arity = RN.length + 1;
const curried = curry(arity, fn);
const flipped = data => R => ap(R, data);
const _ap = pipe(RN.map(flipped));
return _ap(map(curried, R1));
}
}