1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| function isFunction(fn) { return Object.prototype.toString.call(fn) === '[object Function]' } function slice(arr, start) { return Array.prototype.slice.call(arr, start) }
var curry = function(fn) { if (!isFunction(fn)) { return; } var args = slice(arguments, 1) return function() { return fn.apply(this, args.concat(slice(arguments, 0))) } } function add(a, b) { return a + b } var addOne = curry(add, 1) addOne(2)
var curryApply = function(fn, arr) { if (!isFunction(fn)) { return } var args = arr.slice(0) args.unshift(fn) return curry.apply(this, args) }
var autoCurry = function(fn, n) { if (!isFunction(fn)) { return } function retFn() { var len = arguments.length var args = slice(arguments, 0) var nextn = n - len if (nextn > 0) { return autoCurry(curryApply(retFn, args), nextn) } return fn.apply(this, args) } return retFn } function compute(a, b, c) { return (a + b) * c } var curryedCompute = autoCurry(compute, 3) compute(1, 2, 3) curryedCompute(1)(2)(3)
|