JSFiddle - React, Tailwind, and code Playground
by dimitrs_papadimitriou
JavaScript
var n = (l, v, r) => ({
map: f => n(l.map(f), f(v), r.map(f)),
fold: (acc, accf) => accf(accf(accf(acc, l.fold(acc, accf)), v), r.fold(acc, accf)),
dublicate: () => n(l.dublicate(), (l, v, r), r.dublicate()),
extend: f => n(l, v, r).dublicate().map(f),
extract : ()=>v,
});
var lf = v => ({
map: f => lf(f(v)),
fold: (acc, accf) => accf(acc, v),
dublicate: () => lf(lf(v)),
extend: f =>lf(v).dublicate().map(f),
extract : ()=>v,
});
var comonad = n( n(n(lf(2), 2, lf(3)), 2, lf(3)), 2, n(lf(2), 2, n(lf(2), 2, lf(3))));
cokleisli = (f, g) => c => g(c.extend(f));
var f = c => c.extract() * 2;
var g = c => c.extract() * 3;
var h = c => c.extract() * 5;
var composition = cokleisli(f, g);
console.log(comonad.extend(cokleisli(f, cokleisli(g, h))).extract());
console.log(comonad.extend(cokleisli(cokleisli(f, g), h)).extract());
///////////////////////////////////////////////////
const lens = get => set => ({ get, set });
const view = lens => obj => lens.get(obj);
const set = lens => val => obj => lens.set(val)(obj);
const over = lens => fn => obj => set(lens)(fn(view(lens)(obj)))(obj);
const lensProp = key => lens(prop(key))(assoc(key));
const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)));
const map = fn => list => list.map(fn);
const filter = fn => list => list.filter(fn);
const lt = left => right => left < right;
const add = left => right => left + right;
const upper = str => str.toUpperCase();
const prop = key => obj => obj[key];
const assoc = key => val => obj => Object.assign({}, obj, {[key]: val});
//var t =[{n:6}, {n:2}].filter(over(lens(prop('n'))(assoc('n')))(lt(5)));
var namelens = lensProp('n');
var t = map(view(namelens))([{n:6}, {n:2}]);
var t = compose(
map(over(namelens)(add('€ ')),
filter(compose(lt(5), view(namelens)))))
([{n:6}, {n:2}]);
/////////////////////////////////////////////////////////////////////////////////////////////
var n = (l, v, r, annotation)...