crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
69 lines (59 loc) • 2.12 kB
JavaScript
/** @license ISC License (c) copyright 2018 original and current authors */
/** @author Karthik Iyengar (karthikiyengar) */
var curry = require('../core/curry')
var isFunction = require('../core/isFunction')
var isInteger = require('../core/isInteger')
var isSameType = require('../core/isSameType')
var Tuple = require('./index')
var validTuple = function (n, m) { return isSameType(Tuple(n), m); }
function runMap(m, fns) {
var n = fns.length
if (!validTuple(n, m)) {
throw new TypeError(("nmap: " + n + "-Tuple required"))
}
fns.forEach(function (fn) {
if (!isFunction(fn)) {
throw new TypeError('nmap: Functions required for all arguments')
}
})
return m.mapAll.apply(m, fns)
}
var withLength = function (n, fn) {
return Object.defineProperty(fn, 'length', {
value: n
})
}
function nmap(n) {
if (!(isInteger(n) && n >= 1)) {
throw new TypeError('nmap: Integer required for first argument')
}
switch (n) {
case 1:
return function (a, m) { return runMap(m, [ a ]); }
case 2:
return function (a, b, m) { return runMap(m, [ a, b ]); }
case 3:
return function (a, b, c, m) { return runMap(m, [ a, b, c ]); }
case 4:
return function (a, b, c, d, m) { return runMap(m, [ a, b, c, d ]); }
case 5:
return function (a, b, c, d, e, m) { return runMap(m, [ a, b, c, d, e ]); }
case 6:
return function (a, b, c, d, e, f, m) { return runMap(m, [ a, b, c, d, e, f ]); }
case 7:
return function (a, b, c, d, e, f, g, m) { return runMap(m, [ a, b, c, d, e, f, g ]); }
case 8:
return function (a, b, c, d, e, f, g, h, m) { return runMap(m, [ a, b, c, d, e, f, g, h ]); }
case 9:
return function (a, b, c, d, e, f, g, h, i, m) { return runMap(m, [ a, b, c, d, e, f, g, h, i ]); }
case 10:
return function (a, b, c, d, e, f, g, h, i, j, m) { return runMap(m, [ a, b, c, d, e, f, g, h, i, j ]); }
default:
return withLength(n + 1, function() {
var parts = [].slice.call(arguments)
return runMap(parts[parts.length - 1], parts.slice(0, parts.length - 1))
})
}
}
module.exports =
curry(nmap)