/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 1 7 , ĠPeter ĠV in cent Ċ Ġ* Ġ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 , ĠAndroid ĠPromise . Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ġ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ċ Ġ* Ġ Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġpromise . model Ċ Ċ import Ġpromise . commons . create Instance Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect . K Class Ċ Ċ object ĠStore Repository Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* Ġused Ġto Ġpre populate Ġargs Ġpassed Ġto Ġstore Ġcalls Ġif Ġtheir Ġneeds Ġto Ġbe Ġdefault ĊĠĠ Ġ* Ġvariables Ġpresent Ġin Ġevery Ġcall ĊĠĠ Ġ*/ ĊĠ Ġinternal Ġvar Ġon Setup Listener : ĠOn Setup Listener ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġinitializes Ġthe Ġrepo Ġif Ġits Ġundefined ĊĠĠ Ġ* Ġ@ param Ġsetup ĊĠĠ Ġ*/ ĊĠ Ġ@ Jvm Static ĊĠ Ġ@ Jvm Over loads ĊĠ Ġfun Ġsetup ( setup : ĠOn Setup Listener ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġon Setup Listener Ġ= Ġsetup ĊĠĠĠ Ġrepos Ġ= ĠWeak HashMap () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġcontains Ġall Ġthe Ġstores Ġcreated ĊĠĠ Ġ*/ ĊĠ Ġvar Ġrepos : ĠWeak HashMap < String , ĠRepository <* >> ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġget Ġthe Ġstore Ġin Ġthe Ġrepo Ġwith Ġthe Ġspecified Ġkey ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġkey Ġstore Ġidentifier ĊĠĠ Ġ* Ġ@ return Ġa Ġstore Ġor Ġnull Ġif Ġnot Ġfound ĊĠĠ Ġ*/ ĊĠ Ġfun Ġinstance ( key : ĠString ): ĠRepository < *> ? Ġ= Ġtry Ġ{ ĊĠĠĠ Ġif Ġ( repos Ġ== Ġnull ) Ġsetup () ĊĠĠĠ Ġrepos ! ![ key ] Ġas ĠRepository < *> ĊĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġnull ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġcreates Ġa Ġstore Ġrepository Ġfrom Ġinject ors ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param ĠT Ġtype Ġof Ġthe Ġrepository ĊĠĠ Ġ* Ġ@ param Ġsync Injector Ġmodels Ġan Ġinstance Ġof ĠS ynchronous Ġstore ĊĠĠ Ġ* Ġ@ param Ġasync Injector Ġmodels Ġan Ġinstance Ġof ĠAs ynchronous Ġstore ĊĠĠ Ġ* Ġ@ return Ġa Ġstore Ġrepository Ġinstance ĊĠĠ Ġ*/ ĊĠ Ġinline Ġfun Ġ< re ified ĠT > Ġcreate ( sync Injector : ĠInject or < Sync I DataStore < T >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Injector : ĠInject or < Async I DataStore < T >> ): ĠRepository < T > Ġ{ ĊĠĠĠ Ġvar Ġrepo Ġ= Ġinstance ( T :: class . java . simple Name ) ĊĠĠĠ Ġif Ġ( repo Ġ!= Ġnull ) Ġreturn Ġrepo Ġas ĠRepository < T > ĊĠĠĠ Ġrepo Ġ= ĠRepository Impl ( object Ġ: ĠStore Helper < T > Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġsync Store (): ĠSync I DataStore < T >? Ġ= Ġsync Injector . inject () ĊĠĠĠĠĠ Ġoverride Ġfun Ġasync Store (): ĠAsync I DataStore < T >? Ġ= Ġasync Injector . inject () ĊĠĠĠ Ġ}) ĊĠĠĠ Ġrepos ?. put ( T :: class . java . simple Name , Ġrepo !! ) ĊĠĠĠ Ġreturn Ġrepo ĊĠ Ġ} ĊĊĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġcreate ( injector : ĠInject or < Either I DataStore < T >> ): ĠRepository < T > Ġ{ ĊĠĠĠ Ġvar Ġrepo Ġ= Ġinstance ( T :: class . java . simple Name ) ĊĠĠĠ Ġif Ġ( repo Ġ!= Ġnull ) Ġreturn Ġrepo Ġas ĠRepository < T > ĊĠĠĠ Ġrepo Ġ= ĠEither Repository Impl ( object Ġ: ĠInject or < Either I DataStore < T >> Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġinject (): ĠEither I DataStore < T > Ġ= Ġinjector . inject () !! ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġrepos ?. put ( T :: class . java . simple Name , Ġrepo !! ) ĊĠĠĠ Ġreturn Ġrepo ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġcreate Ġa Ġrepository Ġfrom Ġclasses Ġto Ġbe Ġinitialized Ġwhen Ġthe Ġrepository Ġis Ġnot Ġfound ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param ĠT Ġtype Ġof Ġthe Ġrepository Ġ{@ code ĠStore Repository < Some Type >} ĊĠĠ Ġ* Ġ@ param Ġsync Class Ġclass Ġof Ġthe Ġsynchronous Ġstore ĊĠĠ Ġ* Ġ@ param Ġasync Class Ġclass Ġof Ġthe Ġasynchronous Ġstore ĊĠĠ Ġ* Ġ@ param Ġsync Args Ġconstructor Ġarguments Ġfor Ġsynchronous Ġstore Ġclass ĊĠĠ Ġ* Ġ@ param Ġasync Args Ġconstructor Ġarguments Ġfor Ġasynchronous Ġstore Ġclass ĊĠĠ Ġ* Ġ@ return Ġa Ġstore Repository Ġinstance ĊĠĠ Ġ*/ ĊĠ Ġinline Ġfun Ġ< re ified ĠT > Ġof ( sync Class : ĠK Class < out ĠSync I DataStore < T >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Class : ĠK Class < out ĠAsync I DataStore < T >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Args : ĠArray < out ĠAny ?> ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Args : ĠArray < out ĠAny ?> ? Ġ= Ġnull ) Ġ= ĊĠĠĠĠĠ Ġcreate ( object Ġ: ĠInject or < Sync I DataStore < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinject (): ĠSync I DataStore < T > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Instance ( sync Class , Ġsync Args ) Ġas ĠSync I DataStore < T > ĊĠĠĠĠĠ Ġ}, Ġobject Ġ: ĠInject or < Async I DataStore < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinject (): ĠAsync I DataStore < T > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Instance ( async Class , Ġasync Args ) Ġas ĠAsync I DataStore < T > ĊĠĠĠĠĠ Ġ}) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġinline Ġfun Ġ< re ified ĠT > Ġsync ( sync Class : ĠK Class < out ĠSync I DataStore < T >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Args : ĠArray < out ĠAny ?> ? Ġ= Ġnull ) Ġ= ĊĠĠĠĠĠ Ġcreate ( object Ġ: ĠInject or < Sync I DataStore < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinject (): ĠSync I DataStore < T > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Instance ( sync Class , Ġsync Args ) Ġas ĠSync I DataStore < T > ĊĠĠĠĠĠ Ġ}, Ġobject Ġ: ĠInject or < Async I DataStore < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinject (): ĠAsync I DataStore < T >? Ġ= Ġnull ĊĠĠĠĠĠ Ġ}) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġinline Ġfun Ġ< re ified ĠT > Ġasync ( async Class : ĠK Class < out ĠAsync I DataStore < T >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Args : ĠArray < out ĠAny ?> ? Ġ= Ġnull ) Ġ= ĊĠĠĠĠĠ Ġcreate ( object Ġ: ĠInject or < Sync I DataStore < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinject (): ĠSync I DataStore < T >? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠ Ġ}, Ġobject Ġ: ĠInject or < Async I DataStore < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinject (): ĠAsync I DataStore < T > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Instance ( async Class , Ġasync Args ) Ġas ĠAsync I DataStore < T > ĊĠĠĠĠĠ Ġ}) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġof ( either Class : ĠK Class < out ĠEither I DataStore < T >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeither Args : ĠArray < out ĠAny ?> ? Ġ= Ġnull ) Ġ= ĊĠĠĠĠĠ Ġcreate ( object Ġ: ĠInject or < Either I DataStore < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinject (): ĠEither I DataStore < T >? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Instance ( either Class , Ġeither Args ) ĊĠĠĠĠĠ Ġ}) ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġclear Ġall Ġthe Ġcached Ġstores Ġfrom Ġthe Ġrepo ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġfun Ġclear () Ġ{ ĊĠĠĠ Ġrepos ?. clear () ĊĠ Ġ} Ċ }