JSFiddle - React, Tailwind, and code Playground

by dimitrs_papadimitriou

JavaScript

var gr1 = [
  [false, false, false, false, false, false, false, false, false],
  [false, false, false, false, false, false, false, false, false],
  [false, false, false, false, true, false, false, false, false]
];
var mask = [
  { x: -1, y: -1 },
  { x: -1, y: 0 },
  { x: -1, y: 1 },
  { x: 0, y: 1 },
  { x: 0, y: -1 },
  { x: 1, y: -1 },
  { x: 1, y: 0 },
  { x: 1, y: 1 }
];

var gridComonad = (g, index) => ({
  g: g,
  index: index,
  getElement: (x, y) => g[x][y],
  map: f =>
    gridComonad(g.map(x => x.map(y => f(y))), {
      e: f(index.e),
      x: index.x,
      y: index.y
    }),
  fold: (acc, f) =>
    g.reduce((a, e) => e.reduce((acc, e1) => f(acc, e1), a), acc),

  dublicate: () =>
    gridComonad(
      g.map((x, i) => x.map((y, j) => gridComonad(g, { e: y, x: i, y: j }))),
      { e: gridComonad(g, index), x: index.x, y: index.y }
    ),
  extend: f => gridComonad(g, index).map(f),
  extract: () => index,
  cata: alg => {
    g.map(x => x.map(y => alg.e(y)));
    alg.i(index);
  }
});

// var n = (l, v, r, annotation) => ({
//   map: f => n(l.map(f), f(v), r.map(f), annotation),
//   foldAnn: (acc, f) => r.foldAnn(l.foldAnn(f(acc, annotation), f), f),
//   dublicate: () =>
//     gridComonad(g.map(y => gridComonad((g, y))), gridComonad(g, x)),
//   extend: f => gridComonad(g, x).map(f),
//   extract: () => annotation
// });

// var lf = (v, annotation) => ({
//   map: f => lf(f(v), annotation),
//   foldAnn: (acc, f) => f(acc, annotation),
//   extendAnn: f => lf(v, f(lf(v, annotation))),
//   extract: () => annotation
// });

var bounds = xs => ys => e => e.x < xs && e.y < ys && e.y > 0 && e.x > 0;
var box = bounds(3)(9);
var FilterMaskAtPosition = position =>
  mask
    .map(offset => ({ x: position.x + offset.x, y: position.y + offset.y }))
    .filter(box);
    
var f = x =>
  FilterMaskAtPosition({ x: x.index.x, y: x.index.y })
    .map(i => x.getElement(i.x, i.y))
    .reduce((a, i) => a + (i ? 1 : 0), 0);

gridComonad(gr1, { e: true, x: 1, y:...