package Ġdev . ne effect . nee . effects . cache Ċ Ċ import Ġdev . ne effect . nee . Effect Ċ import Ġdev . ne effect . nee . effects . Out Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ class ĠCache Effect < R , ĠE , ĠP >( ĊĠĠĠ Ġprivate Ġval Ġp : ĠP , ĊĠĠĠ Ġprivate Ġval Ġcache Provider : ĠCache Provider Ċ ) Ġ: ĠEffect < R , ĠE > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< A > Ġwrap ( f : Ġ( R ) Ġ-> ĠA ): Ġ( R ) Ġ-> ĠPair < Out < E , ĠA >, ĠR > Ġ= Ġ{ Ġr : ĠR Ġ-> ĊĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOut . right < E , ĠA >( cache Provider . compute If Absent ( p , Ġ{ Ġf ( r ) Ġ})), Ġr ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠCache Provider Ġ{ ĊĠĠĠ Ġfun Ġ< K , ĠV > Ġcompute If Absent ( key : ĠK , Ġfunc : Ġ( K ) Ġ-> ĠV ): ĠV Ċ } Ċ Ċ @ Suppress (" Mutable Collections ") Ċ class ĠNa ive Cache Provider Ġ: ĠCache Provider Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmap : ĠConcurrent HashMap < Any , ĠAny > Ġ= ĠConcurrent HashMap () ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġ< K , ĠV > Ġcompute If Absent ( key : ĠK , Ġfunc : Ġ( K ) Ġ-> ĠV ): ĠV Ġ= ĊĠĠĠĠĠĠĠ Ġmap . compute If Absent ( key Ġas ĠAny ) Ġ{ Ġk : ĠAny Ġ-> Ġfunc ( k Ġas ĠK ) Ġas ĠAny Ġ} Ġas ĠV Ċ } Ċ