ambjs
Version:
amb(iguous) operator in javascript
38 lines • 1.63 kB
JavaScript
var expr$642 = require('./expression'), trampoline$643 = require('./trampoline');
var ambSet$644 = function (values$649) {
return expr$642(function (succ$650, fail$651, ff$652) {
return trampoline$643(function () {
var next$653 = function (j$654) {
var t$655 = ff$652 === undefined, l$656 = j$654 < values$649.length;
return t$655 && l$656 || l$656 && j$654 < ff$652 ? succ$650(values$649[j$654], function () {
return next$653(j$654 + 1);
}, t$655 ? undefined : ff$652 - 1) : fail$651();
};
return values$649 === undefined ? fail$651() : next$653(0);
});
});
};
var EndObject$645 = function () {
};
EndObject$645.prototype.toString = function () {
return '#end_object';
};
var end_object$646 = new EndObject$645();
var ambGenerator$647 = function (gen$657) {
return expr$642(function (succ$658, fail$659, ff$660) {
return trampoline$643(function () {
var next$661 = function (j$662) {
var val$663 = gen$657(), t$664 = ff$660 === undefined, l$665 = !(val$663 instanceof EndObject$645);
return t$664 && l$665 || l$665 && j$662 < ff$660 ? succ$658(val$663, function () {
return next$661(j$662 + 1);
}, t$664 ? undefined : ff$660 - 1) : fail$659();
};
return next$661(0);
});
});
};
var amb$648 = function (args$666) {
return args$666 instanceof Function ? ambGenerator$647(args$666) : ambSet$644(args$666);
};
amb$648.end_object = end_object$646;
module.exports = amb$648;