Skip to content

Instantly share code, notes, and snippets.

View jbreckmckye's full-sized avatar
🛸

Jimmy Breck-McKye jbreckmckye

🛸
View GitHub Profile
@jbreckmckye
jbreckmckye / bundle.js
Created June 14, 2017 12:02
Bundle files from the internet into a local zip
let fs = require('fs');
let archiver = require('archiver');
let request = require('request');
let archive = archiver('zip', { store: true});
let out = fs.createWriteStream(__dirname + '/sports.zip');
let sport1 = request('http://lorempixel.com/400/200/sports/1/');
let sport2 = request('http://lorempixel.com/400/200/sports/2/');
@jbreckmckye
jbreckmckye / gist:4553c47e1b26dbe6130f1d7736f148d9
Last active November 10, 2023 02:07
JSTOR Open Access Book List
Title Subtitle Authors JSTOR Discipline 1
Tracking Rural Change "Community, Policy and Technology in Australia, New Zealand and Europe" Socio
@jbreckmckye
jbreckmckye / update-config.js
Created March 13, 2018 11:04
Beanstalk / general-purpose JSON mass updater
const fs = require('fs');
const cliArgs = process.argv.slice(2);
const key = cliArgs[0];
const val = cliArgs[1];
function parseJSON(string) {
const sanitised = string.replace(/\s\$\w*/g, substr => `"__SANITISED__${substr}"`);
return JSON.parse(sanitised);
}
@jbreckmckye
jbreckmckye / example.adoc
Created July 7, 2018 22:56
ASCIIDoc callout compatibility check
require 'sinatra' (1)

get '/hi' do (2) (3)
  "Hello World!"
end
  1. Library import

  2. URL mapping

## Personas
## Subjects/Verbs :: Characters/Action
## Sentences should flow old information -> new
## Keep topics coherent
## Use topics to assign responsibility
@jbreckmckye
jbreckmckye / watchr.d.ts
Created November 22, 2018 15:56
TypeScript definition for watchr js
/// <reference types="node" />
declare module 'watchr' {
import {Stats, FSWatcher} from 'fs';
import {EventEmitter} from 'events';
export type ChangeType = 'update' | 'create' | 'delete';
export type State = 'pending' | 'active' | 'deleted' | 'closed';
@jbreckmckye
jbreckmckye / promise-first-truthy.ts
Created December 6, 2018 12:11
Get first truthy promise result
function firstTruthy<T>(promises: Array<Promise<any>>): Promise<T|null> {
return new Promise((resolve, reject) => {
// If any promise returns truthy value, immediately resolve with it
promises.forEach(async promise => {
const result = await promise;
if (!!result) resolve(result);
});
// If any promise rejects, immediately throw the error
Promise.race(promises).catch(reject);
// Get a WebGL context
import {Perhaps, None, Some, Any} from 'highly-questionable';
const canvas = document.createElement('canvas');
const context = Perhaps
.of(canvas.getContext('webgl2'))
.or(canvas.getContext('webgl'))
.orFrom(()=> canvas.getContext('experimental-webgl'));
@jbreckmckye
jbreckmckye / groupedThrottle.js
Created April 24, 2019 16:57
Grouped throttle function
function throttleGroup(fn, count, delay) {
let queue = [];
let nextDrain = null;
function scheduleDrain() {
nextDrain = window.setTimeout(drainQueue, delay);
}
function drainQueue() {
const groupSize = Math.min(count, queue.length);
@jbreckmckye
jbreckmckye / group.js
Last active October 10, 2019 15:48
Group objects by a string field
function group (rows, discriminant) {
const asMap = rows.reduce(
(acc, item) => {
const key = item[discriminant]
return {
...acc,
[key]: acc[key] ? [...acc[key], item] : [item]
}
},
{}