1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
'use strict';
export function cells_update(cells, update_rules) {
return cells
.map((row, y) => row.map((cell, x) => [x, y, cell.type]))
.flat()
.reduce((acc, [x, y, type]) => [...acc, update_rules[type](cells, x, y)], [])
.filter(x => x !== undefined)
}
export function cells_valid(cells, proposal) {
if (!proposal.world_updates) { return true; }
return proposal.world_updates.reduce(
(acc, update) => {
const valid =
(update.x >= 0 && update.x < cells[0].length) &&
(update.y >= 0 && update.y < cells.length) &&
(cells[update.y][update.x].type == update.from)
return valid && acc;
},
true
);
}
export function cells_apply(cells, proposals) {
return proposals.reduce(
(acc, prop) => {
const change = (prop.world_updates || []).reduce(
(acc_, update) => {
acc_[update.y][update.x].type = update.to;
return acc_
},
[...acc]
);
return change;
},
[...cells]
);
}
|