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:...