import { Function1 } from "./abstractions" export function cachedFn(f: Function1): Function1 export function cachedFn(f: Function): any { let previous: [any[], any] | null = null return function (...args: any[]) { if (previous !== null && equals(previous[0], args)) { return previous[1] } const result = f(...args) previous = [args, result] return result } } function equals(xs: any[], ys: any[]) { if (xs.length !== ys.length) throw Error("Argument count mismatch") for (let i = 0; i < xs.length; i++) { if (xs[i] !== ys[i]) return false } return true }