Skip to content

Instantly share code, notes, and snippets.

View ccnokes's full-sized avatar

Cameron Nokes ccnokes

View GitHub Profile
@ccnokes
ccnokes / waitAtLeast.js
Created May 31, 2017 18:46
Make an async function take at least X amount of time
/**
* make an async function take at least X amount of time
* @param limit - in ms
* @param fn - returns promise
* @returns {Promise.<T>}
*/
function waitAtLeast(limit, fn) {
let start = Date.now();
let end = start + limit;
@ccnokes
ccnokes / yes.js
Last active June 30, 2017 17:12
unix yes command in node.js
// throughput is usually ~350-400 MiB/s
// run: node yes.js | pv > /dev/null
const buf = Buffer.alloc(4096, 'y\n', 'utf8');
const str = buf.toString();
const { Readable } = require('stream');
class Y extends Readable {
_read() {
this.push(str);
@ccnokes
ccnokes / retry-example.js
Created August 11, 2017 20:36
Rx.Observable.retry example
function randomErrorObs() {
return Rx.Observable.create(obs => {
let n = 0;
if(Math.random() < 0.5) {
obs.next(++n);
} else {
console.warn('producing error');
obs.error('bummer');
}
});
@ccnokes
ccnokes / SimpleStore.ts
Created August 16, 2017 16:08
A simple store thing
import { EventEmitter } from 'events';
const enum Actions {
get,
set,
delete
}
export class Store extends EventEmitter {
private data = new Map<string, any>();
@ccnokes
ccnokes / basic-$http-cache.js
Created August 21, 2017 02:51
AngularJS $http cache
// this will cache the response indefinitely in a cache created via $cacheFactory
// that cache is shared globally among all $http requests
$http.get('http://pokeapi.co/api/v2/pokemon/1/', {
cache: true
});
@ccnokes
ccnokes / custom-cache-ng1.js
Last active August 21, 2017 03:11
Use a custom cache class in angularJS $http
// This class implements the same interface that the cache created by $cacheFactory does
// See https://github.com/angular/angular.js/blob/master/src/ng/cacheFactory.js#L142
// This cache evicts an entry once it's expired (which we define as 5 seconds).
class ExpirationCache {
constructor(timeout = 5000) {
this.store = new Map();
this.timeout = timeout;
}
get(key) {
@ccnokes
ccnokes / basic-$http-lru-cache.js
Last active August 21, 2017 03:26
angularJS LRU cache
// create an LRU (least recently used) cache with up to 10 entries
const lru = $cacheFactory('my-cache', { capacity: 10 });
$http.get('http://pokeapi.co/api/v2/pokemon/1/', {
cache: lru
});
@ccnokes
ccnokes / lazy-container.js
Last active December 15, 2017 14:11
A map that lazily gets and caches values on access
function makeLazy(name, fn, obj = {}) {
const nullSym = Symbol('nil'); //could change this to be more es5 friendly
let val = nullSym; //I'm not sure if holding the value in this closure or right on the object is better
Object.defineProperty(obj, name, {
enumerable: true,
get() {
if(val === nullSym) {
val = fn();
@ccnokes
ccnokes / iterate-iterator.js
Last active January 17, 2018 03:57
basis of a functional way to traverse iterators
function iterate(iterator, cb) {
let next = iterator.next();
while(!next.done) {
cb(next.value);
next = iterator.next();
}
}
// iterate(new Set([1,2,3]).values(), console.log)
@ccnokes
ccnokes / promise-with-abort.js
Created February 13, 2018 23:43
Promise wrapper with abort function
function makeAbortablePromise(promise, abort = () => {}) {
const promiseWithAbort = {
abort,
promise,
// proxy methods
then: (...args) => {
promiseWithAbort.promise = promiseWithAbort.promise.then.apply(
promiseWithAbort.promise,
args
);