JSFiddle - React, Tailwind, and code Playground
by kentaromiura
JavaScript
function Monad(value) {
if(value instanceof Monad || (value && value.constructor === Monad)) return value;
var monad = {
value: function (){ return value },
bind: value === null || value === undefined ? function (func) {} : function (func) {
if (func === Monad) {
return monad;
}
if (typeof (func) == 'function') {
return new Monad(func(value))
}
return monad;
}
}
monad.constructor = Monad
return monad;
}
var thisalert = function(x){
alert('>>>' + x);
}
//new Monad(e).bind(k) === k(e)
new Monad(1).bind(alert) //1
//monad.bind(Monad) === monad
var monad = new Monad(1)
alert(monad.bind(Monad) === monad) //true
/*
monad.bind(f).bind(g) === monad.bind(function(value){
return f(value).bind(g)
})
*/
var identity = function identity(v) {
return v
};
var add1 = function (v) {
return v + 1
};
alert(
monad.bind(add1).bind(identity).value() ===
monad.bind(function (value) {
return new Monad(add1(value)).bind(identity);
}).value()
) //true
monad.bind(add1).bind(add1).bind(add1).bind(alert)