Skip to content

Instantly share code, notes, and snippets.

View ccnokes's full-sized avatar

Cameron Nokes ccnokes

View GitHub Profile
@ccnokes
ccnokes / SafeSetState.ts
Last active January 3, 2019 21:44
mixin class that extends your component and makes `setState` "safe". See https://codesandbox.io/s/6438ymvk8z
import * as React from 'react';
// see https://github.com/Microsoft/TypeScript/pull/13743 for what the typing in here's all about
type Constructor<T> = new (...args: any[]) => T;
const isMounted_Symbol = Symbol('isMounted');
/**
* This is for when you're calling setState in uncancellable async callbacks.
* NOTE: Doing this can mask memory leaks so be careful
@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
);
@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 / format-url.js
Last active June 17, 2018 03:42
`formatUrl` function that formats query params and such
import * as _ from 'lodash';
let n = 2;
let someString;
// NOTE `_.pickBy(params, _.negate(_.isNil))` removes undefined/null entries
// so you don't have to worry about `undefined` getting coerced to a string
const formatUrl = (urlStr, params) => urlStr + '?' +
new URLSearchParams(_.pickBy(params, _.negate(_.isNil))).toString();
@ccnokes
ccnokes / url-search-params-utils.js
Last active June 23, 2020 23:31
Utils for URLSearchParams
function objToParams(obj) {
const params = new URLSearchParams();
for(let key in obj) {
if(Array.isArray(obj[key])) {
obj[key].forEach(item => params.append(key, item));
}
else if(typeof obj[key] === 'object') {
continue;
}
else {
@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 / 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 / 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 / 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 / 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) {