/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . fir . cache s Ċ Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Component Ċ Ċ abstract Ġclass ĠF ir Caches Factory Ġ: ĠF ir Session Component Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġcache Ġwith Ġreturns Ġa Ġvalue Ġby Ġkey Ġon Ġdemand Ġif Ġit Ġis Ġcomputed ĊĠĠĠĠ Ġ* ĠOtherwise Ġcomputes Ġthe Ġvalue Ġin Ġ[ create Value ] Ġand Ġcaches Ġit Ġfor Ġfuture Ġinv ocations ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ F ir Cache . getValue ] Ġshould Ġnot Ġbe Ġcalled Ġinside Ġ[ create Value ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhere : ĊĠĠĠĠ Ġ* Ġ[ CONTEXT ] Ġ-- Ġtype Ġof Ġvalue Ġwhich Ġbe Ġused Ġto Ġcreate Ġvalue Ġby Ġ[ create Value ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġ< KEY Ġ: ĠAny , ĠVALUE , ĠCON TEXT > Ġcreate Cache ( create Value : Ġ( KEY , ĠCON TEXT ) Ġ-> ĠVALUE ): ĠF ir Cache < KEY , ĠVALUE , ĠCON TEXT > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġcache Ġwith Ġreturns Ġa Ġcaches Ġvalue Ġon Ġdemand Ġif Ġit Ġis Ġcomputed ĊĠĠĠĠ Ġ* ĠOtherwise Ġcomputes Ġthe Ġvalue Ġin Ġtwo Ġphases : ĊĠĠĠĠ Ġ* Ġ Ġ- Ġ[ create Value ] Ġ-- Ġcreates Ġvalues Ġand Ġstores Ġ[ VALUE ] Ġto Ġcache Ġand Ġpasses Ġ[ VALUE ] Ġ& Ġ[ DATA ] Ġto Ġ[ post Compute ] ĊĠĠĠĠ Ġ* Ġ Ġ- Ġ[ post Compute ] Ġ-- Ġperforms Ġsome Ġoperations Ġon Ġcomputed Ġvalue Ġafter Ġit Ġplaced Ġinto Ġmap ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ F ir Cache . getValue ] Ġcan Ġbe Ġsafely Ġcalled Ġin Ġpost Compute Ġfrom Ġthe Ġsame Ġthread Ġand Ġcorrect Ġvalue Ġcomputed Ġby Ġ[ create Value ] Ġwill Ġbe Ġreturned ĊĠĠĠĠ Ġ* Ġ[ F ir Cache . getValue ] Ġshould Ġnot Ġbe Ġcalled Ġinside Ġ[ create Value ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhere : ĊĠĠĠĠ Ġ* Ġ Ġ[ CONTEXT ] Ġ-- Ġtype Ġof Ġvalue Ġwhich Ġbe Ġused Ġto Ġcreate Ġvalue Ġby Ġ[ create Value ] ĊĠĠĠĠ Ġ* Ġ Ġ[ DATA ] Ġ-- Ġtype Ġof Ġadditional Ġdata Ġwhich Ġwill Ġbe Ġpassed Ġfrom Ġ[ create Value ] Ġto Ġ[ post Compute ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġ< KEY Ġ: ĠAny , ĠVALUE , ĠCON TEXT , ĠDATA > Ġcreate Cache With Post Compute ( ĊĠĠĠĠĠĠĠ Ġcreate Value : Ġ( KEY , ĠCON TEXT ) Ġ-> ĠPair < VALUE , ĠDATA >, ĊĠĠĠĠĠĠĠ Ġpost Compute : Ġ( KEY , ĠVALUE , ĠDATA ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠF ir Cache < KEY , ĠVALUE , ĠCON TEXT > Ċ } Ċ Ċ val ĠF ir Session . fir Caches Factory : ĠF ir Caches Factory Ġby ĠF ir Session . session Component Accessor () Ċ Ċ inline Ġfun Ġ< KEY Ġ: ĠAny , ĠVALUE > ĠF ir Caches Factory . create Cache ( ĊĠĠĠ Ġcross inline Ġcreate Value : Ġ( KEY ) Ġ-> ĠVALUE , Ċ ): ĠF ir Cache < KEY , ĠVALUE , ĠNothing ?> Ġ= Ġcreate Cache ( ĊĠĠĠ Ġcreate Value Ġ= Ġ{ Ġkey , Ġ_ Ġ-> Ġcreate Value ( key ) Ġ}, Ċ ) Ċ Ċ inline Ġfun Ġ< KEY Ġ: ĠAny , ĠVALUE , ĠCON TEXT > ĠF ir Caches Factory . create Cache With Post Compute ( ĊĠĠĠ Ġcross inline Ġcreate Value : Ġ( KEY , ĠCON TEXT ) Ġ-> ĠVALUE , ĊĠĠĠ Ġcross inline Ġpost Compute : Ġ( KEY , ĠVALUE ) Ġ-> ĠUnit Ċ ): ĠF ir Cache < KEY , ĠVALUE , ĠCON TEXT > Ġ= Ġcreate Cache With Post Compute ( ĊĠĠĠ Ġcreate Value Ġ= Ġ{ Ġkey , Ġcontext Ġ-> Ġcreate Value ( key , Ġcontext ) Ġto Ġnull Ġ}, ĊĠĠĠ Ġpost Compute Ġ= Ġ{ Ġkey , Ġvalue , Ġ_ Ġ-> Ġpost Compute ( key , Ġvalue ) Ġ} Ċ ) Ċ Ċ inline Ġfun Ġ< KEY Ġ: ĠAny , ĠVALUE > ĠF ir Caches Factory . create Cache With Post Compute ( ĊĠĠĠ Ġcross inline Ġcreate Value : Ġ( KEY ) Ġ-> ĠVALUE , ĊĠĠĠ Ġcross inline Ġpost Compute : Ġ( KEY , ĠVALUE ) Ġ-> ĠUnit Ċ ): ĠF ir Cache < KEY , ĠVALUE , ĠNothing ?> Ġ= Ġcreate Cache With Post Compute ( ĊĠĠĠ Ġcreate Value Ġ= Ġ{ Ġkey , Ġ_ Ġ-> Ġcreate Value ( key ) Ġto Ġnull Ġ}, ĊĠĠĠ Ġpost Compute Ġ= Ġ{ Ġkey , Ġvalue , Ġ_ Ġ-> Ġpost Compute ( key , Ġvalue ) Ġ} Ċ ) Ċ Ċ inline Ġfun Ġ< KEY Ġ: ĠAny , ĠVALUE , ĠDATA > ĠF ir Caches Factory . create Cache With Post Compute ( ĊĠĠĠ Ġcross inline Ġcreate Value : Ġ( KEY ) Ġ-> ĠPair < VALUE , ĠDATA >, ĊĠĠĠ Ġcross inline Ġpost Compute : Ġ( KEY , ĠVALUE , ĠDATA ) Ġ-> ĠUnit Ċ ): ĠF ir Cache < KEY , ĠVALUE , ĠNothing ?> Ġ= Ġcreate Cache With Post Compute ( ĊĠĠĠ Ġcreate Value Ġ= Ġ{ Ġkey , Ġ_ Ġ-> Ġcreate Value ( key ) Ġ}, ĊĠĠĠ Ġpost Compute Ġ= Ġ{ Ġkey , Ġvalue , Ġdata Ġ-> Ġpost Compute ( key , Ġvalue , Ġdata ) Ġ} Ċ ) ĊĊĊ