Skip to content

Instantly share code, notes, and snippets.

View raganwald's full-sized avatar

Reg Braithwaite raganwald

View GitHub Profile
@raganwald
raganwald / enumerations.es6
Last active March 9, 2019 20:28
Code from "Enumerations, Denumerables, and Cardinals"
// See: http://raganwald.com/2019/02/27/enumerability.html
// combinators
function slice (generator, n, limit = Infinity) {
return function * sliced () {
let i = 0;
for (const element of generator()) {
if (i++ < n) continue;
// Inspired by:
//
// "Eh, have another semi-periodic reminder that ()() is not a palindrome but ())( is"
//
// --https://twitter.com/_julesh_/status/1101262745092218882
const END = Symbol('end');
class PushdownAutomaton {
constructor(internal = 'start', external = []) {
@raganwald
raganwald / generate-balanced-parentheses.es6
Last active March 1, 2019 03:13
A generator function that enumerates all finite balanced parentheses strings
// memoizes ordinary functions
const memoized = (fn, keymaker = JSON.stringify) => {
const lookupTable = new Map();
return function (...args) {
const key = keymaker.call(this, args);
return lookupTable[key] || (lookupTable[key] = fn.apply(this, args));
}
};
@raganwald
raganwald / balanced-dpa.es6
Last active February 16, 2019 16:39
A Deterministic Pushdown Automaton ("DPA") that recognizes balanced parentheses
// The Deterministic Pushdown Automata Engine
const END = Symbol('end');
const RECOGNIZED = Symbol('recognized');
const UNRECOGNIZED = Symbol('unrecognized');
const POP = Symbol('pop');
function DPA (start) {
return string => {
const stack = [];
@raganwald
raganwald / implicit.js
Last active February 15, 2019 08:31
Balanced parentheses solution with implicit state
function balanced (string) {
const iterator = string[Symbol.iterator]();
return balancedIterator(iterator) === true;
}
const CLOSE = {
'(': ')',
'[': ']',
'{': '}'
@raganwald
raganwald / why-indeed.js
Last active February 12, 2019 13:01
Recursive Pattern Matching using the Why Combinator
const just =
target =>
input =>
input.startsWith(target) &&
target;
const cases =
(...patterns) =>
input => {
const matches = patterns.map(p => p(input)).filter(m => m !== false);
//
// http://raganwald.com/2019/01/14/structural-sharing-and-copy-on-write.html
// http://raganwald.com/2019/01/26/reduce-reuse-recycle.html
//
const SliceHandler = {
has (slice, property) {
if (property in slice) {
return true;
}
@raganwald
raganwald / lisp.js
Last active January 11, 2019 20:02
A very leaky abstraction that Greenspuns Lisp's CAR/CDR, plus support for [first, ...rest]
const ComposableCarCdr = {
has (target, name) {
if (name in target) {
return true;
}
if (name === Symbol.isConcatSpreadable) {
return true;
}
function scoop(before, fromPit) {
const after = before.slice(0);
const seedsInHand = after[fromPit];
after[fromPit] = 0;
return [after, seedsInHand];
}
function nextPit(pit) {
@raganwald
raganwald / balanced.js
Last active November 12, 2018 19:55
Ridiculously Simple Balanced Parentheses Algorithm
function isBalancedSimple (before) {
if (before === '') return true;
const after = before.replace('()','');
return (before !== after) && isBalancedSimple(after);
}
function isBalancedMultiple (before) {
if (before === '') return true;