UNPKG

crocks

Version:

A collection of well known Algebraic Datatypes for your utter enjoyment.

69 lines (59 loc) 2.12 kB
/** @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)