package Ġru . n cher net so v . joy _ of _ kotlin Ċ Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval ĠstartTime 1 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġval Ġresult 1 Ġ= Ġlong Computation ( 4 3 ) ĊĠĠĠ Ġval Ġtime 1 Ġ= ĠSystem . currentTimeMillis () Ġ- ĠstartTime 1 ĊĠĠĠ Ġval Ġmemoized Long Computation Ġ= ĊĠĠĠĠĠĠĠ ĠM emo izer . memo ize (:: long Computation ) ĊĠĠĠ Ġval ĠstartTime 2 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġval Ġresult 2 Ġ= Ġmemoized Long Computation ( 4 3 ) ĊĠĠĠ Ġval Ġtime 2 Ġ= ĠSystem . currentTimeMillis () Ġ- ĠstartTime 2 ĊĠĠĠ Ġval ĠstartTime 3 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġval Ġresult 3 Ġ= Ġmemoized Long Computation ( 4 3 ) ĊĠĠĠ Ġval Ġtime 3 Ġ= ĠSystem . currentTimeMillis () Ġ- ĠstartTime 3 ĊĊĠĠĠ Ġprintln (" Call Ġto Ġnon - memo ized Ġfunction : Ġresult Ġ= Ġ$ result 1 , Ġtime Ġ= Ġ$ time 1 ") ĊĠĠĠ Ġprintln (" First Ġcall Ġto Ġmemoized Ġfunction : Ġresult Ġ= Ġ$ result 2 , Ġtime Ġ= Ġ$ time 2 ") ĊĠĠĠ Ġprintln (" Second Ġcall Ġto Ġmemoized Ġfunction : Ġresult Ġ= Ġ$ result 3 , Ġtime Ġ= Ġ$ time 3 ") Ċ } Ċ Ċ fun Ġlong Computation ( number : ĠInt ): ĠInt Ġ{ ĊĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠ Ġreturn Ġnumber Ċ } Ċ Ċ class ĠM emo izer < T , ĠU > Ġprivate Ġconstructor () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠConcurrent HashMap < T , ĠU >() ĊĊĠĠĠ Ġprivate Ġfun Ġdo Memo ize ( function : Ġ( T ) Ġ-> ĠU ): Ġ( T ) Ġ-> ĠU Ġ= ĊĠĠĠĠĠĠĠ Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . compute If Absent ( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T , ĠU > Ġmemo ize ( function : Ġ( T ) Ġ-> ĠU ): Ġ( T ) Ġ-> ĠU Ġ= ĠM emo izer < T , ĠU >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Memo ize ( function ) ĊĠĠĠ Ġ} Ċ } Ċ