crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
41 lines (31 loc) • 1.02 kB
JavaScript
/** @license ISC License (c) copyright 2016 original and current authors */
/** @author Ian Hofmann-Hicks (evil) */
var compose = require('../core/compose')
var curry = require('../core/curry')
var isArray = require('../core/isArray')
var isObject = require('../core/isObject')
var isFunction = require('../core/isFunction')
var isFunctor= require('../core/isFunctor')
var array = require('../core/array')
var object = require('../core/object')
var fl = require('../core/flNames')
// map : Functor f => (a -> b) -> f a -> f b
function map(fn, m) {
if(!isFunction(fn)) {
throw new TypeError('map: Function required for first argument')
}
if(isFunction(m)) {
return compose(fn, m)
}
if(isArray(m)) {
return array.map(fn, m)
}
if(m && isFunctor(m)) {
return (m[fl.map] || m.map).call(m, fn)
}
if(isObject(m)) {
return object.map(fn, m)
}
throw new TypeError('map: Object, Function or Functor of the same type required for second argument')
}
module.exports = curry(map)