UNPKG

use-game-of-life

Version:

An easy to use custom react hook implementation gives anyone the power to hook on to the game of life.

96 lines (91 loc) 3.44 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var react = require('react'); var immer = require('immer'); var useGameOfLife = function (_a) { var _b = _a.updateInterval, updateInterval = _b === void 0 ? 500 : _b, _c = _a.gridRows, gridRows = _c === void 0 ? 50 : _c, _d = _a.gridColumns, gridColumns = _d === void 0 ? 50 : _d, _e = _a.randomizeGrid, randomizeGrid = _e === void 0 ? false : _e, _f = _a.randomGridAlivePercent, randomGridAlivePercent = _f === void 0 ? 50 : _f; var _getEmptyGrid = function () { var rows = []; for (var i = 0; i < gridRows; i++) { rows.push(Array.from(new Array(gridColumns), function () { return 0; })); } return rows; }; var _getRandomGrid = function () { var rows = []; for (var i = 0; i < gridRows; i++) { rows.push(Array.from(new Array(gridColumns), function () { return Math.random() < (randomGridAlivePercent / 100) ? 1 : 0; })); } return rows; }; var runningRef = react.useRef(false); var _g = react.useState(false), running = _g[0], setrunning = _g[1]; var _h = react.useState(function () { return randomizeGrid ? _getRandomGrid() : _getEmptyGrid(); }), grid = _h[0], setGrid = _h[1]; var setCell = function (r, c, value) { setGrid(function (g) { return immer.produce(g, function (draft) { draft[r][c] = value ? 1 : 0; }); }); }; var isRunning = function () { return running; }; var start = function () { setrunning(true); runningRef.current = true; runSimulation(); }; var stop = function () { setrunning(false); runningRef.current = false; }; var clearGrid = function () { setGrid(_getEmptyGrid()); }; var countNeightBours = react.useCallback(function (g, r, c) { var n = 0; var operations = [ [-1, -1], [-1, 0], [-1, 1], [0, 1], [0, -1], [1, -1], [1, 0], [1, 1], ]; operations.forEach(function (pair) { var newR = r + pair[0]; var newC = c + pair[1]; if (newR >= 0 && newR < gridRows && newC >= 0 && newC < gridColumns && g[newR][newC] == 1) { n += 1; } }); return n; }, []); var runSimulation = react.useCallback(function () { if (!runningRef.current) return; setGrid(function (g) { return immer.produce(g, function (gCopy) { return gCopy.forEach(function (row, r) { return row.forEach(function (_col, c) { var n = countNeightBours(g, r, c); if (gCopy[r][c] == 0 && n == 3) { gCopy[r][c] = 1; } else { if (n < 2 || n > 3) gCopy[r][c] = 0; } }); }); }); }); setTimeout(runSimulation, updateInterval); }, []); return { grid: grid, setCell: setCell, start: start, stop: stop, isRunning: isRunning, clearGrid: clearGrid }; }; exports.default = useGameOfLife; //# sourceMappingURL=index.js.map