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)