var toString = Object.prototype.toString;
var isArray = Array.isArray || function _isArray(val) {
return val && val.length >= 0 && toString.call(val) === "[object Array]";
};
var isArrayLike = function(x) {
return x != null && x.length >= 0 && (isArray(x) || !R.is(String, x));
};
var curry = R.curry = function _curry(fn, fnArity) {
fnArity = typeof fnArity === "number" ? fnArity : fn.length;
function recurry(args) {
return arity(Math.max(fnArity - (args && args.length || 0), 0), function () {
if (arguments.length === 0) { throw NO_ARGS_EXCEPTION; }
var newArgs = concat(args, arguments);
if (newArgs.length >= fnArity) {
return fn.apply(this, newArgs);
}
else {
return recurry(newArgs);
}
});
}
return recurry([]);
};
var NO_ARGS_EXCEPTION = new TypeError('Function called with no arguments');
function curry2(fn) {
return function(a, b) {
switch (arguments.length) {
case 0: throw NO_ARGS_EXCEPTION;
case 1: return function(b) {
return fn(a, b);
};
}
return fn(a, b);
};
}
function curry3(fn) {
return function(a, b, c) {
switch (arguments.length) {
case 0: throw NO_ARGS_EXCEPTION;
case 1: return curry2(function(b, c) {
return fn(a, b, c);
});
case 2: return function(c) {
return fn(a, b, c);
};
}
return fn(a, b, c);
};
}
var hasMethod = function _hasMethod(methodName, obj) {
return obj && !isArray(obj) && typeof obj[methodName] === 'function';
};
function checkForMethod(methodname, func) {
return function(a, b, c) {
var length = arguments.length;
var obj = arguments[length - 1],
callBound = obj && !isArray(obj) && typeof obj[methodname] === 'function';
switch (arguments.length) {
case 0: return func();
case 1: return callBound ? obj[methodname]() : func(a);
case 2: return callBound ? obj[methodname](a) : func(a, b);
case 3: return callBound ? obj[methodname](a, b) : func(a, b, c);
case 4: return callBound ? obj[methodname](a, b, c) : func(a, b, c, obj);
}
};
}
var mkArgStr = function _makeArgStr(n) {
var arr = [], idx = -1;
while (++idx < n) {
arr[idx] = "arg" + idx;
}
return arr.join(", ");
};
var nAry = R.nAry = (function () {
var cache = {
0: function (func) {
return function () {
return func.call(this);
};
},
1: function (func) {
return function (arg0) {
return func.call(this, arg0);
};
},
2: function (func) {
return function (arg0, arg1) {
return func.call(this, arg0, arg1);
};
},
3: function (func) {
return function (arg0, arg1, arg2) {
return func.call(this, arg0, arg1, arg2);
};
}
};