Skip to content

Instantly share code, notes, and snippets.

View francisrstokes's full-sized avatar
🎥
Low Byte Productions on YouTube

Francis Stokes francisrstokes

🎥
Low Byte Productions on YouTube
View GitHub Profile
@francisrstokes
francisrstokes / PipeDriveForm.js
Created July 12, 2019 08:47
PipeDrive Web Forms React Component
import React from 'react';
class PipeDriveForm extends React.Component {
constructor(props) {
super(props);
this.state = {
randomId: 'id' + Math.random().toString(36).substring(7)
};
}
@francisrstokes
francisrstokes / CompositionDSLGenerators.js
Created December 29, 2018 00:53
Function Composition DSL using generators
const getDSLValue = (iterator, last) => {
const {value, done} = iterator.next(last);
if (done) {
return value.slice(1).reduce((x, f) => f(x), value[0]);
}
return getDSLValue(iterator, last ? [...last, value] : [value]);
}
const pipe = gen => getDSLValue(gen(null, ));
@francisrstokes
francisrstokes / GeneratorDSL.js
Last active November 3, 2021 16:39
Game-style DSL using generators
const getDSLValue = (iterator, last) => {
const {value, done} = iterator.next(last);
if (done) {
return value;
}
switch (value) {
case 'sword': {
return getDSLValue(iterator, {
weaponType: "Shiny Sword",
@francisrstokes
francisrstokes / AsyncAwaitGenerators.js
Created December 28, 2018 23:50
Async/Await in 5 lines
const interpret = iterator => last => {
const {value, done} = iterator.next(last);
return (done) ? Promise.resolve(value) : value.then(interpret(iterator));
};
const asyncAwait = g => interpret(g())();
// ... Usage ...
const addOneSoon = (x, t) => new Promise(resolve => {
@francisrstokes
francisrstokes / CSVParser.js
Last active December 27, 2018 10:05
Arcsecond Article
const {
parse,
char,
many,
regex,
anythingExcept,
sepBy
} = require('arcsecond');
const joinedMany = parser => many (parser) .map(x => x.join(''));
@francisrstokes
francisrstokes / FullParser.js
Created December 26, 2018 12:37
Arcsecond Article
const {
between,
many,
choice,
sequenceOf,
char,
whitespace,
anythingExcept,
possibly,
regex,
@francisrstokes
francisrstokes / UsingParser.js
Last active December 17, 2021 06:03
Arcsecond Article
const { parse, char, str, sequenceOf, choice } = require('arcsecond');
// parse creates a function we can use for parsing text
const parseText = parse (combinedParser);
console.log(
parseText ('hello world')
)
// -> [ 'hello', ' ', 'world' ]
const ArrayMonad = xs => {
const map = fn => ArrayMonad(xs.map(x => fn(x)))
const chain = fn => ArrayMonad(xs.reduce((ys, x) => [...ys, ...fn(x).xs], []))
const ap = mys => chain(f => mys['fantasy-land/map'](y => f(y)));
return {
xs,
'fantasy-land/map': map,
'fantasy-land/chain': chain,
'fantasy-land/ap': ap,
'constructor': ArrayMonad
@francisrstokes
francisrstokes / StateDispatcher.js
Last active May 28, 2019 02:31
Redux without redux - sharing state and one way data flow using only standard react
import React from 'react';
export class StateDispatcher extends React.Component {
constructor(props) {
super(props);
this.state = props.state || {};
this._dispatch = this.dispatch.bind(this);
}
dispatch(action) {
class HashTable {
constructor(bucketSize = 1024) {
this._bucketSize = bucketSize;
this._data = new Array(bucketSize);
}
hashKey(key) {
const h = JSON.stringify(key, Object.keys(key).sort())
.split('')
.reduce((acc, cur, i) => acc + cur.charCodeAt(0) * (i+1), 0);