package Ġcom . so y wiz . kor io . resources Ċ Ċ import Ġcom . so y wiz . kor io . async .* Ċ import Ġcom . so y wiz . kor io . file . V fs File Ċ import Ġcom . so y wiz . kor io . file . std . resources V fs Ċ import Ġkotlin . coroutines .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . reflect .* Ċ Ċ annotation Ġclass ĠResource Path () Ċ Ċ interface ĠResource able < T Ġ: ĠAny > Ġ{ ĊĠĠĠ Ġfun Ġget OrNull (): ĠT ? ĊĠĠĠ Ġsuspend Ġfun Ġget (): ĠT Ċ } Ċ Ċ class ĠResource < T Ġ: ĠAny >( ĊĠĠĠ Ġval Ġresources : ĠResources , ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġcache : ĠResource Cache , ĊĠĠĠ Ġprivate Ġval Ġgen : Ġsuspend ĠResources . () Ġ-> ĠT Ċ ) Ġ: ĠResource able < T > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġvalue Deferred : ĠDeferred < T >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġvalue OrNull : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget OrNull (): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġget Deferred () ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue OrNull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Deferred (): ĠDeferred < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Deferred Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Deferred Ġ= Ġasync Immediate ly ( resources . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . add ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen ( resources ). also Ġ{ Ġvalue OrNull Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Deferred !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget (): ĠT Ġ= Ġget Deferred (). await () ĊĊĠĠĠ Ġsuspend Ġfun Ġpreload (): ĠT Ġ= Ġget () ĊĊĠĠĠ Ġfun Ġpreload No Wait () Ġ{ ĊĠĠĠĠĠĠĠ Ġget Deferred () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun load () Ġ{ ĊĠĠĠĠĠĠĠ Ġresources . remove ( name ) ĊĠĠĠĠĠĠĠ Ġvalue OrNull Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠGlobal Resources ( coroutine Context : ĠCor outine Context , Ġroot : ĠV fs File Ġ= Ġresources V fs ) Ġ: ĠResources ( coroutine Context , Ġroot , Ġnull ) Ċ Ċ interface ĠResources Container Ġ{ ĊĠĠĠ Ġval Ġresources : ĠResources Ċ } Ċ Ċ open Ġclass ĠResources ( val Ġcoroutine Context : ĠCor outine Context , Ġval Ġroot : ĠV fs File Ġ= Ġresources V fs , Ġval Ġparent : ĠResources ? Ġ= Ġnull ) Ġ: ĠResources Container Ġ{ ĊĠĠĠ Ġoverride Ġval Ġresources : ĠResources Ġget () Ġ= Ġthis ĊĠĠĠ Ġinternal Ġval Ġmap Ġ= ĠLinkedHashMap < String , ĠResource <* >>() ĊĠĠĠ Ġinternal Ġfun Ġremove ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( map . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . remove ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent ?. remove ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġinternal Ġfun Ġadd ( resource : ĠResource <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resource . cache Ġ== ĠResource Cache . NONE ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull Ġ&& Ġresource . cache Ġ== ĠResource Cache . GLOBAL ) Ġreturn Ġparent ?. add ( resource ) ĊĠĠĠĠĠĠĠ Ġmap [ resource . name ] Ġ= Ġresource ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġinternal Ġfun Ġ< T Ġ: ĠAny > Ġget ( name : ĠString , Ġcache : ĠResource Cache Ġ= ĠResource Cache . GLOBAL ): ĠResource < T >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cache Ġ== ĠResource Cache . NONE ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġ( map Ġas ĠMap < String , ĠResource < T >> )[ name ] ĊĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= Ġnull ) Ġreturn Ġres ĊĠĠĠĠĠĠĠ Ġif Ġ( cache Ġ== ĠResource Cache . GLOBAL ) Ġreturn Ġparent ?. get ( name ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠResource Cache Ġ{ ĠGLOBAL , ĠLOCAL , ĠNONE Ġ} Ċ Ċ class ĠResource Ref < T Ġ: ĠAny >( val Ġcache : ĠResource Cache Ġ= ĠResource Cache . GLOBAL , Ġval Ġgen : Ġsuspend ĠResources . () Ġ-> ĠT ) Ġ{ ĊĠĠĠ Ġoperator Ġfun ĠgetValue ( resources Container : ĠResources Container , Ġproperty : ĠK Property < *> ): ĠResource < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġresources Container . resources ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġresources . get < T >( property . name , Ġcache ) ĊĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= Ġnull ) Ġreturn Ġres ĊĠĠĠĠĠĠĠ Ġval Ġres 2 Ġ= ĠResource ( resources , Ġproperty . name , Ġcache , Ġgen ) ĊĠĠĠĠĠĠĠ Ġresources . add ( res 2 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġres 2 ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T Ġ: ĠAny > Ġresource ( cache : ĠResource Cache Ġ= ĠResource Cache . LOCAL , Ġgen : Ġsuspend ĠResources . () Ġ-> ĠT ) Ġ= ĠResource Ref ( cache , Ġgen ) Ċ fun Ġ< T Ġ: ĠAny > Ġresource Global ( gen : Ġsuspend ĠResources . () Ġ-> ĠT ) Ġ= ĠResource Ref ( Resource Cache . GLOBAL , Ġgen ) Ċ fun Ġ< T Ġ: ĠAny > Ġresource Local ( gen : Ġsuspend ĠResources . () Ġ-> ĠT ) Ġ= ĠResource Ref ( Resource Cache . LOCAL , Ġgen ) Ċ fun Ġ< T Ġ: ĠAny > Ġresource Un cached ( gen : Ġsuspend ĠResources . () Ġ-> ĠT ) Ġ= ĠResource Ref ( Resource Cache . NONE , Ġgen ) Ċ