crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
40 lines (30 loc) • 905 B
JavaScript
/** @license ISC License (c) copyright 2017 original and current authors */
/** @author Ian Hofmann-Hicks (evil) */
var isChain = require('../core/isChain')
var isFunction = require('../core/isFunction')
var err = 'pipeK: Chain returning functions of the same type required'
function pipeK(head) {
var fns = [], len = arguments.length - 1;
while ( len-- > 0 ) fns[ len ] = arguments[ len + 1 ];
if(!(arguments.length && isFunction(head))) {
throw new TypeError(err)
}
if(arguments.length === 1) {
return head
}
var tail = fns.reduce(function (comp, fn) {
if(!isFunction(fn)) {
throw new TypeError(err)
}
return function(m) {
if(!isChain(m)) {
throw new TypeError(err)
}
return comp(m).chain(fn)
}
}, function (x) { return x; })
return function() {
return tail(head.apply(null, arguments))
}
}
module.exports = pipeK