Skip to content

Instantly share code, notes, and snippets.

@CrossEye
CrossEye / permutations.js
Last active October 23, 2018 04:26
Find permutations of a list of (distinct) values. Uses Ramda
const R = require('ramda');
const permutations = (tokens, subperms = [[]]) =>
R.isEmpty(tokens) ?
subperms :
R.addIndex(R.chain)((token, idx) => permutations(
R.remove(idx, 1, tokens),
R.map(R.append(token), subperms)
), tokens);
@CrossEye
CrossEye / transpose.js
Created October 30, 2015 14:58
Simple matrix transposition
const R = require('ramda');
const mapIndexed = R.addIndex(R.map);
// transpose :: [[a]] -> [[a]] -- (row, col) becomes (col, row)
const transpose = function(matrix) {
return mapIndexed(function (_, col) {
return R.reject(R.isNil, R.map(R.prop(col), matrix));
}, R.head(matrix));
};
@CrossEye
CrossEye / namedCurry.js
Last active February 19, 2017 02:15
Named Curry
var R = require('./ramda');
// Discussion at https://github.com/ramda/ramda/issues/1258
var namedCurry = function(fn, argNames) {
// TODO: what if fn.length != argNames.length?
var f = R.curryN(fn.length, function() {
return fn.apply(this, arguments);
});
f['secret-sauce'] = {

Technical Review of Functional Javascript

Review by Scott Sauyet

Functional JavaScript
Michael Fogus
O'Reilly, 2013
987-1-449-36072-6

I was very excited when I heard this book was coming out. I'd enjoyed

This came out of the recent JS Promises debate. @ForbesLindesay was confused by liftA2, so I thought I’d try to explain it.

Let me explain liftA2. I’ll tweak @pufuwozu’s examples so that they return values.

// Promises (called when both succeed)
liftA2(readFIle('hello.txt'), readFile('world.txt'), function(hello, world) {
 return hello + ' ' + world;
});
// Optional values (only inserted into database when both exist)

liftA2(optionalUsername, optionalPassword, function(username, password) {

@CrossEye
CrossEye / index.js
Last active August 29, 2015 14:07
requirebin sketch
var transform = function(n) {return 3 * n + 2;}
var log = function(n, idx, arr) {
return 'n: ' + n + ', idx: ' + idx + ', arr: ' + arr;
}
console.log('----------------------------------------');
var Fk = require('fkit');
console.log('fkit');
console.log(Fk.compose(Fk.map(log), Fk.map(transform))([0, 1, 2]).join('\n'));
@CrossEye
CrossEye / index.js
Created October 18, 2014 23:39
requirebin sketch
var transform = function(n) {return 3 * n + 2;};
var log = function(n, idx, obj) {
return 'n: ' + n + ', idx: ' + idx + ', obj: ' + obj;
};
var Lazy = require('lazy.js');
console.log("lazy.js")
console.log(Lazy.range(3).map(transform).map(log).toArray().join('\n'));
console.log("----------------------------------------");
@CrossEye
CrossEye / lens.js
Created June 5, 2014 15:36 — forked from andyhd/lens.js
function lens(get, set) {
var f = function (a) { return get(a); };
f.set = set;
f.mod = function (f, a) { return set(a, f(get(a))); };
return f;
}
var first = lens(
function (a) { return a[0]; },
function (a, b) { return [b].concat(a.slice(1)); }
@CrossEye
CrossEye / where.js
Last active August 29, 2015 13:56 — forked from buzzdecafe/where.js
var where = curry(function where(matchThis, testObj) {
return ramda.all(function (key) {
var val = matchThis[key];
return typeof val == "function" ? val(testObj[key], testObj) :
(testObj[key] === matchThis[key]);
}, Object.keys(matchThis));
});
x1y2 = where({x: 1, y: 2});
x1y2({x: 1}); //=> false
(function() {
var split = {}, intervalData,
timeComponent = {
seconds: function (split) {return split.seconds * 6;},
minutes: function (split) {return (split.minutes + (split.seconds / 60)) * 6;},
hours: function (split) {return (split.hours % 12 * 30 ) + split.minutes / 2;}
};
var SVG = (function() {
var SVG = function(config) {