let weakMemoize = function ( func: (arg: Arg) => Return ): (arg: Arg) => Return { let cache = new WeakMap() return (arg: Arg) => { if (cache.has(arg)) { // Use non-null assertion because we just checked that the cache `has` it // This allows us to remove `undefined` from the return value return cache.get(arg)! } let ret = func(arg) cache.set(arg, ret) return ret } } export default weakMemoize