crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
53 lines (38 loc) • 1.06 kB
JavaScript
/** @license ISC License (c) copyright 2016 original and current authors */
/** @author Ian Hofmann-Hicks (evil) */
var isFunction = require('./isFunction')
var CURRY_SYMB =
'@@crocks/curried'
function applyCurry(fn, arg) {
if(!isFunction(fn)) { return fn }
return fn.length > 1 ? fn.bind(null, arg) : fn.call(null, arg)
}
// curry : ((a, b, c) -> d) -> a -> b -> c -> d
function curry(fn) {
if(fn[CURRY_SYMB]) {
return fn
}
function curried() {
var xs = [], len = arguments.length;
while ( len-- ) xs[ len ] = arguments[ len ];
var args =
xs.length ? xs : [ undefined ]
if(args.length < fn.length) {
return curry(Function.bind.apply(fn, [ null ].concat(args)))
}
var val = args.length === fn.length
? fn.apply(null, args)
: args.reduce(applyCurry, fn)
if(isFunction(val)) {
return curry(val)
}
return val
}
Object.defineProperty(curried, CURRY_SYMB, {
enumerable: false,
writable: false,
value: true
})
return curried
}
module.exports = curry