package Ġm ary k . core . properties . definitions . wrapper Ċ Ċ import Ġm ary k . core . properties . definitions . Is Property Definition Ċ import Ġm ary k . core . properties . references . Any Property Reference Ċ import Ġm ary k . core . properties . references . Is Property Reference Ċ import Ġm ary k . core . properties . references . Is Property Reference With Parent Ċ import Ġm ary k . lib . concurrency . Atomic Reference Ċ import Ġm ary k . lib . freeze Ċ Ċ /** ĠTo Ġsave Ġcreation Ġof Ġnew Ġreferences Ġto Ġsame Ġfields , Ġthe Ġreferences Ġare Ġcached . Ġ*/ Ċ interface ĠCache able Reference Creator Ġ{ ĊĠĠĠ Ġval Ġref Cache : ĠAtomic Reference < Array < Is Property Reference < *, Ġ*, Ġ* >> ?> ĊĊĠĠĠ Ġfun Ġ< T : ĠAny , ĠR : ĠIs Property Reference < T , ĠIs Property Definition < T >, Ġ* >> Ġcache Ref ( ĊĠĠĠĠĠĠĠ Ġparent Ref : ĠAny Property Reference ?, ĊĠĠĠĠĠĠĠ Ġcache : ĠAtomic Reference < Array < Is Property Reference < *, Ġ*, Ġ* >> ?> Ġ= Ġthis . ref Cache , ĊĠĠĠĠĠĠĠ Ġmatcher : Ġ( R ) Ġ-> ĠBoolean Ġ= Ġcreate Parent Matcher ( parent Ref ), ĊĠĠĠĠĠĠĠ Ġcreator : Ġ() Ġ-> ĠR ĊĠĠĠ Ġ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġ( cache . get () Ġas ĠArray < R > ?) ?. first OrNull ( matcher )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreator (). also Ġ{ Ġcreated Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Array Ġ= Ġcache . get ()?. let Ġ{ ĠarrayOf ( created , Ġ* it ) Ġ} Ġ?: ĠarrayOf < Is Property Reference < *, Ġ*, Ġ* >>( created ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . set ( new Array . freeze ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġcreate Parent Matcher ( parent Ref : ĠAny Property Reference ?): Ġ( Is Property Reference < *, Ġ*, Ġ* >) Ġ-> ĠBoolean Ġ= Ġ{ ĊĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIs Property Reference With Parent < *, Ġ*, Ġ*, Ġ*> Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent Reference Ġ== Ġparent Ref ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparent Ref Ġ== Ġnull ĊĠĠĠ Ġ} Ċ } Ċ