export interface Lazy < T > { ( ) : T ; isLazy : boolean ; } export const lazy = < T > ( getter ) : Lazy < T > => { let evaluated = false ; let _res = null ; const res = < Lazy < T > > function ( ) : T { if ( evaluated ) return _res ; _res = getter . apply ( this , arguments ) ; evaluated = true ; return _res ; } ; res . isLazy = true ; return res ; } ;