Skip to content

Instantly share code, notes, and snippets.

@Avaq
Avaq / combinators.js
Last active May 1, 2024 09:38
Common combinators in JavaScript
const I = x => x
const K = x => y => x
const A = f => x => f (x)
const T = x => f => f (x)
const W = f => x => f (x) (x)
const C = f => y => x => f (x) (y)
const B = f => g => x => f (g (x))
const S = f => g => x => f (x) (g (x))
const S_ = f => g => x => f (g (x)) (x)
const S2 = f => g => h => x => f (g (x)) (h (x))
@Avaq
Avaq / algebraic-laws.md
Last active January 14, 2024 10:02
Algebraic Law Cheatsheet

Algebraic Law Cheatsheet

An overview of algebraic laws from the perspective of a functional programmer. I've used a Haskell-esque syntax for the definitions of the laws and examples.

General Laws

name definition example
Identity [¹][] f x = x add 0 42 = 42
@Avaq
Avaq / pull-private.sh
Created November 4, 2014 12:25
Exporting and importing GPG keys over SSH
ssh user@remote gpg --export-secret-key KeyId | gpg --allow-secret-key-import --import
# Exit with code 1 if the FILE has *modified* lines
git diff --quiet $FILE || [ $(git diff --numstat $FILE | cut -f 2) = '0' ]
# Output a visual graph of commits
git log --all --graph --pretty='format:%C(auto)%h% D%Creset %Cgreen%an, %ar%Creset %C(white)(%s)%Creset'
@Avaq
Avaq / dangerous-promises.js
Last active October 12, 2021 04:13
Dangerous Promises
//
// utils
//
const thrush = x => f => f(x);
const indexBy = k => xs => xs.reduce((index, x) => {
if(index[x[k]] != null) index[x[k]].push(x);
else index[x[k]] = [x];
return index;
@Avaq
Avaq / upgrade-guide-fluture-12.md
Last active August 18, 2021 10:59
Breaking Changes Upgrade Guide for Fluture version 12

Fluture v12 Upgrade Guide

Modular version made compatible with Node 12

The modular version of Fluture no longer works with Node version 9, 10, and 11 using --experimental-modules. In order to load the modular version into those runtimes, one has to use the esm loader.

Furthermore, the modular code must now be "deep" imported from fluture/index.js. That is, import 'fluture/index.js' for EcmaScript modules, or require ('fluture') for CommonJS modules.

Future constructor no longer overloaded

@Avaq
Avaq / request.js
Last active November 24, 2020 14:42
Request adapted to work with Fluture
'use strict';
const request = require('request');
const Future = require('fluture');
module.exports = o => Future((l, r) => {
const socket = request(o, (err, res) => err ? l(err) : r(res));
return () => socket.abort();
});
@Avaq
Avaq / SKI.js
Last active April 23, 2020 18:36
Combinatory Fun
const S = f => g => x => f(x)(g(x))
const K = x => y => x
const I = S(K)(K)
const B = S(K(S))(K)
const C = S(S(K(B))(S))(K(K))
const A = S(K(I))
const T = C(A)
const W = S(S)(K(I))
const after = (n, x) => Future((l, r) => setTimeout(r, n, x));
const Do = (f, of) => {
return of(undefined).chain(() => {
const g = f()
const step = value => {
const result = g.next(value)
return result.done ?
of(result.value) :
result.value.chain(step)
@Avaq
Avaq / keybase.md
Created July 24, 2019 10:12
Keybase proof of Github

Keybase proof

I hereby claim:

  • I am avaq on github.
  • I am avaq (https://keybase.io/avaq) on keybase.
  • I have a public key ASAlzUb3ZvdW8CYnTo0SaI0TuaSBUyNS9vxUUFYFbDpgUgo

To claim this, I am signing this object: