function HuitaMonad(value) {
var realHuita = (value && Number.isInteger(value)) ? value : 0;
this.getHuita = function() {
return realHuita;
};
this.monadReturn = function(huita) {
return new HuitaMonad(huita);
};
this.monadBind = function(processor) {
var huita = this.getHuita();
if(huita === 0) {
return this;
}
else {
var newHuita = processor(huita);
return this.monadReturn(newHuita);
}
};
}
var main = function() {
var monadsList = [
new HuitaMonad(5),
new HuitaMonad(-10),
new HuitaMonad(0),
new HuitaMonad()
];
var newMonadsList = monadsList.map(ebaka);
newMonadsList.forEach(printHuitaMonad);
var huitaMonad1 = new HuitaMonad(10);
var huitaMonad2 = new HuitaMonad(20);
var huitaMonad3 = new HuitaMonad(0);
printHuitaMonad(huitaMonad1.monadBind(f).monadBind(g).monadBind(h));
printHuitaMonad(huitaMonad2.monadBind(f).monadBind(g).monadBind(h));
printHuitaMonad(huitaMonad3.monadBind(f).monadBind(g).monadBind(h));
};
var ebaka = function(huitaMonad) {
return huitaMonad.monadBind(f);
};
var f = function(intHuita) {
return 100/intHuita;
};
var g = function(intHuita) {
return 1 - (intHuita/5);
};
var h = function(intHuita) {
return Math.abs(10/intHuita);
};
var printHuitaMonad = function(huitaMonad) {
print(huitaMonad.getHuita());
};
main();