node-cond
Version:
lisp "cond" special form realization for js
42 lines (36 loc) • 1.13 kB
JavaScript
var isFn = (some) => typeof some === "function",
cond = function (...args) {
return loopByArgs(args, false);
};
cond.all = function (...args) {
return loopByArgs(args, true);
};
cond.doif = function (Then, Else) {
return function (condition) {
return cond(
condition, returnValue(Then, condition),
returnValue(Else, condition) )
}
};
module.exports = cond;
function loopByArgs(args, all) {
var i = 0,
argsLen = args.length,
defaultValue = argsLen % 2 ? args.pop() : undefined,
lastValue;
for(; i < argsLen; i += 2) {
let condition = args[i];
if(condition) {
let returnedValue = args[i+1];
if(all) {
lastValue = returnValue(returnedValue, condition)
} else {
return returnValue(returnedValue, condition);
}
}
}
return defaultValue ? returnValue(defaultValue) : lastValue;
};
function returnValue(value, condition) {
return isFn(value) ? value(condition) : value;
};