diff --git a/README.md b/README.md
index a9540ed..02f6ee1 100644
--- a/README.md
+++ b/README.md
@@ -21,3 +21,10 @@ with the arrow keys.
## Broken
This one is not working. Not bothering to fix it, got no git history.
+
+
+## Functional
+
+Functional implementation.
+
+
diff --git a/fp/ca-fp.html b/fp/ca-fp.html
new file mode 100755
index 0000000..4d72c74
--- /dev/null
+++ b/fp/ca-fp.html
@@ -0,0 +1,36 @@
+
+
+
+ CA
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fp/ca-fp.js b/fp/ca-fp.js
new file mode 100755
index 0000000..0578d93
--- /dev/null
+++ b/fp/ca-fp.js
@@ -0,0 +1,124 @@
+
+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 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 0.8) ? 1:0;
+ }
+ }
+ console.log(grid);
+ return grid;
+}
+
+//app("board", 500, grid0);
+app("board", 500, random_grid(200, 200));
diff --git a/fp/fplib.js b/fp/fplib.js
new file mode 100755
index 0000000..1ffe33c
--- /dev/null
+++ b/fp/fplib.js
@@ -0,0 +1,27 @@
+"use strict";
+
+var fp = {
+ curry,
+ compose,
+ pipe
+};
+
+
+function curry(fn) {
+ return function(...args) {
+ if(fn.length > args.length) {
+ var arg = args;
+ return function(...args) {return fn.apply(null, arg.concat(args));};
+ }
+ return fn.apply(null, args);
+ };
+}
+
+function compose(f,g) {
+ return function(...x) {return f(g(...x));}
+}
+
+function pipe(...fns) {
+ return fns.reduce(compose);
+}
+
diff --git a/fp/recording.gif b/fp/recording.gif
new file mode 100644
index 0000000..f470b7d
Binary files /dev/null and b/fp/recording.gif differ