JSFiddle - React, Tailwind, and code Playground

by dimitrs_papadimitriou

JavaScript

var Id = v => ({ v: v, map: f => Id(f(v)) });

const kleisli_comp = (f, g) => x => f(x).chain(g);
//foldMap :: Monoid m => (a -> m) -> t a -> m
const Free = {
  Pure: x => ({
    map: f => Free.Pure(f(x)),
    chain: f => f(x),
    foldMap: (_, typeRep) => {
      return typeRep(x);
    }
  }),
  Impure: (x, g) => ({
    map: f => Free.Impure(x, y => g(y).map(f)),
    chain: f => Free.Impure(x, y => g(y).chain(f)),
    foldMap: (interpreter, typeRep) => {
      var t = x
        .e(interpreter)
        .chain(result => g(result).foldMap(interpreter, typeRep));
      return t;
    }
  })
};

var d =   Free.Impure( ({ e: i => i.d() }), Free.Pure);

var g =  Free.Impure(({ e: i => i.g({ v: 5} ) }), Free.Pure);

var r = g.chain(  d );

var int = {
  g: o => o.v,
  d: o => {
    console.log(o);
  }
};

  r.foldMap(int, Id);