Skip to content

Instantly share code, notes, and snippets.

@zoontek
Created March 8, 2019 13:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zoontek/13dd5e64d201cf57fb04ac8e070e2f47 to your computer and use it in GitHub Desktop.
Save zoontek/13dd5e64d201cf57fb04ac8e070e2f47 to your computer and use it in GitHub Desktop.
type ReturnType<F> = F extends (...args: any[]) => infer R ? R : any;
type MemoizeResolver<F extends (...args: any[]) => any> = (
...args: Parameters<F>
) => string;
type MemoizedFuntion<F extends (...args: any[]) => any> = ((
...args: Parameters<F>
) => ReturnType<F>) & {
clear: () => void;
};
function memoize<F extends (...args: any[]) => any>(
fn: F,
resolver: MemoizeResolver<F>,
): MemoizedFuntion<F> {
let cache: { [key: string]: ReturnType<F> } = {};
const memoizedFn = function(...args: Parameters<F>) {
const key = resolver(...args);
return cache[key] === undefined ? (cache[key] = fn(...args)) : cache[key];
};
memoizedFn.clear = () => (cache = {});
return memoizedFn;
}
const add = (a: number, b: number) => a + b;
const memoizedAdd = memoize(add, (a, b) => `${a}.${b}`);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment