crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
29 lines (22 loc) • 806 B
JavaScript
/** @license ISC License (c) copyright 2016 original and current authors */
/** @author Ian Hofmann-Hicks (evil) */
var _chain = require('../core/array').chain
var curry = require('../core/curry')
var isArray = require('../core/isArray')
var isChain = require('../core/isChain')
var isFunction = require('../core/isFunction')
var fl = require('../core/flNames')
// chain : Chain m => (a -> m b) -> m a -> m b
function chain(fn, m) {
if(!isFunction(fn)) {
throw new TypeError('chain: Chain returning function required for first argument')
}
if(!(isChain(m) || isArray(m))) {
throw new TypeError('chain: Chain of the same type required for second argument')
}
if(isArray(m)) {
return _chain(fn, m)
}
return (m[fl.chain] || m.chain).call(m, fn)
}
module.exports = curry(chain)