// https://www.codementor.io/@agustinchiappeberrini/lazy-evaluation-and-javascript-a5m7g8gs3 export interface Lazy { (): T isLazy: boolean } export const lazy = (getter: () => T): Lazy => { let evaluated: boolean = false let _res: T = null const res = >function (): T { if (evaluated) return _res _res = getter.apply(this, arguments) evaluated = true return _res } res.isLazy = true return res }