ca/fp/ca-fp.js
2021-08-19 00:50:18 +02:00

125 lines
2.6 KiB
JavaScript
Executable File

var getEle = fp.curry(function(ele) {
return (document.querySelectorAll(ele).length === 1) ? document.querySelector(ele) : [...document.querySelectorAll(ele)];
});
function hexColor() {
var values = "01233456789ABCDEF";
var result = [];
for(var i = 0; i < 6; i++) {
result.push(values[Math.floor(Math.random() * 16)]);
}
return '#'+result.join('');
}
var css = fp.curry(function(cssObj, ele) {
for(var key in cssObj) {
ele.style[key] = cssObj[key];
}
return ele;
});
//--------------------------------
var count_neighbours = function(r, c, grid) {
var count = 0;
if (r > 0) {
count += grid[r-1][c];
}
if (r < grid.length-1) {
count += grid[r+1][c];
}
if (c > 0) {
count += grid[r][c-1];
}
if (c < grid.length[0]-1) {
count += grid[r][c+1];
}
return count;
};
var update_grid = function(grid) {
var count;
var nrows = grid.length;
var ncols = grid[0].length;
for (var r=0; r<nrows; r++) {
for (var c=0; c<ncols; c++) {
count = count_neighbours(r, c, grid);
if (grid[r][c] == 1 && count > 2) {
grid[r][c] = 0;
}
if (grid[r][c] == 0 && count <= 2) {
grid[r][c] = 1;
}
}
}
return grid;
};
var render_grid = fp.curry(function(ctx, grid) {
var height = ctx.canvas.height;
var width= ctx.canvas.width;
var nrows = grid.length;
var ncols = grid[0].length;
ctx.clearRect(0, 0, width, height);
for (var r=0; r<nrows; r++) {
for (var c=0; c<ncols; c++) {
ctx.fillStyle = (grid[r][c] == 0) ? '#fff':'#000';
ctx.fillRect(c*width/ncols+0.5, r*height/nrows+0.5, width/ncols-0.5, height/nrows-0.5);
}
}
return grid;
});
var app = function(canvas_id, timestep, grid_init) {
var canvas = document.getElementById(canvas_id);
var ctx = canvas.getContext('2d');
var render = render_grid(ctx);
var state = grid_init;
setInterval(function() {
//state = render_grid(ctx, update_grid(state));
state = fp.pipe(render, update_grid)(state);
}, timestep);
};
var grid0 = [
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,1,1,0],
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,0,0,0],
[1,0,0,0,1,1,1,1,0,0,0,0]
];
var random_grid = function(nrows, ncols) {
var grid = []
for (var r=0; r<nrows; r++) {
grid[r] = [];
for (var c=0; c<ncols; c++) {
grid[r][c] = (Math.random() > 0.8) ? 1:0;
}
}
console.log(grid);
return grid;
}
//app("board", 500, grid0);
app("board", 500, random_grid(200, 200));