/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠJ uan ĠMed ina Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġ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 Ġcom . j uan med ina . ke cs . entity Ċ Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠA ĠView Ġrepresent Ġa Ġset Ġof Ġentities Ġin Ġ[ World ][ com . j uan med ina . ke cs . world . World ]. Ċ Ġ* Ċ Ġ* Ġ@ constructor ĠCreates Ġa Ġempty Ġ[ View ][ com . j uan med ina . ke cs . entity . View ]. Ċ Ġ*/ Ċ open Ġclass ĠView () Ġ: ĠMutable Collection < Entity > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa ĠView Ġbased Ġin Ġan Ġ[ Iterable ] Ġof Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconstructor ( entities : ĠIterable < Entity >) Ġ: Ġthis () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd All ( entities ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġstorage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġentities Ġ= Ġarray ListOf < Entity >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġsub - view Ġgiving Ġa Ġset Ġof Ġcomponent Ġclasses . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtypes ĠSet Ġof ĠComponents Ġclass Ġsuch ĠPosition :: class . ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġcreate Ġview Ġwith Ġthe Ġcomponents Ġof Ġthe Ġprovided Ġclasses . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġview ( var arg Ġtypes : ĠK Class < out ĠAny >) Ġ= ĠView ( filter Ġ{ Ġit . has Components (* types ) Ġ}) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġto Ġa Ġreceiver Ġa Ġset Ġof Ġ[ Entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġfor Ġthe Ġgiven Ġtypes ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtypes Ġset Ġof Ġ[ K Class ] Ġthat Ġwe Ġneed Ġon Ġthe Ġentities . ĊĠĠĠĠ Ġ* Ġ@ param Ġreceiver Ġfunction Ġthat Ġwill Ġreceive Ġthe Ġentities . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġview ( var arg Ġtypes : ĠK Class < out ĠAny >, Ġreceiver : Ġ( Entity ) Ġ-> ĠUnit ) Ġ= Ġview (* types ). forEach ( receiver ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġset Ġof Ġ[ Pair ] Ġfrom Ġthe Ġcomponents Ġof Ġthe Ġgiven Ġtype . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġcould Ġbe Ġuse Ġfor Ġdestruct ing Ġdeclarations . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny , Ġre ified ĠK Ġ: ĠAny > Ġpairs () Ġ= Ġview ( T :: class , ĠK :: class ). map Ġ{ Ġit . pair < T , ĠK >() Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġa Ġset Ġof Ġ[ Pair ] Ġfrom Ġthe Ġcomponents Ġof Ġthe Ġgiven Ġtype Ġto Ġa Ġreceiver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġcould Ġbe Ġuse Ġfor Ġdestruct ing Ġdeclarations . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġreceiver Ġfunction Ġthat Ġwill Ġreceive Ġthe Ġpairs . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny , Ġre ified ĠK Ġ: ĠAny > Ġpairs ( receiver : Ġ( Pair < T , ĠK >) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠ Ġpairs < T , ĠK >(). forEach ( receiver ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġset Ġof Ġ[ Triple ] Ġfrom Ġthe Ġcomponents Ġof Ġthe Ġgiven Ġtype . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġcould Ġbe Ġuse Ġfor Ġdestruct ing Ġdeclarations . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny , Ġre ified ĠK Ġ: ĠAny , Ġre ified ĠV Ġ: ĠAny > Ġtrip les () Ġ= Ġview ( T :: class , ĠK :: class , ĠV :: class ). map Ġ{ ĊĠĠĠĠĠĠĠ Ġit . triple < T , ĠK , ĠV >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġa Ġset Ġof Ġ[ Triple ] Ġfrom Ġthe Ġcomponents Ġof Ġthe Ġgiven Ġtype Ġto Ġa Ġreceiver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġcould Ġbe Ġuse Ġfor Ġdestruct ing Ġdeclarations . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġreceiver Ġfunction Ġthat Ġwill Ġreceive Ġthe Ġtrip les . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny , Ġre ified ĠK Ġ: ĠAny , Ġre ified ĠV Ġ: ĠAny > Ġtrip les ( receiver : Ġ( Triple < T , ĠK , ĠV >) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠ Ġtrip les < T , ĠK , ĠV >(). forEach ( receiver ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġcomponents Ġin Ġour Ġview Ġfor Ġa Ġgiving Ġclass . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġcomponents () Ġ= Ġfilter Ġ{ Ġit . has Component < T >() Ġ}. map Ġ{ Ġit . get < T >() Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġsingle Ġcomponent Ġfrom Ġa Ġsingle Ġ[ Entity ][ com . j uan med ina . ke cs . entity . Entity ] Ġthat Ġhas Ġa Ġcomponent Ġof ĊĠĠĠĠ Ġ* Ġ Ġthe Ġgiving Ġtype , Ġor Ġthrows Ġexception Ġif Ġthere Ġis Ġmore Ġthan Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġcomponent () Ġ= Ġfilter Ġ{ Ġit . has Component < T >() Ġ}. map Ġ{ Ġit . get < T >() Ġ}. single () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġwe Ġhave Ġa Ġany Ġ[ Entity ][ com . j uan med ina . ke cs . entity . Entity ] Ġwith Ġa Ġgiven Ġcomponent Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġhas Component () Ġ= Ġany Ġ{ Ġit . has Component < T >() Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġsingle Ġ[ Entity ][ com . j uan med ina . ke cs . entity . Entity ] Ġthat Ġhas Ġa Ġcomponent Ġof Ġthe Ġgiving Ġtypes , Ġor ĊĠĠĠĠ Ġ* Ġ Ġthrows Ġexception Ġif Ġthere Ġis Ġmore Ġthan Ġone . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtypes ĠComponent Ġclasses Ġsuch ĠPosition :: class ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġentity ( var arg Ġtypes : ĠK Class < out ĠAny >) Ġ= Ġsingle Ġ{ Ġit . has Components (* types ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġsingle Ġ[ Entity ][ com . j uan med ina . ke cs . entity . Entity ] Ġthat Ġhas Ġa Ġcomponent Ġof Ġthe Ġgiving Ġtype , Ġor ĊĠĠĠĠ Ġ* Ġ Ġthrows Ġexception Ġif Ġthere Ġis Ġmore Ġthan Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġentity () Ġ= Ġsingle Ġ{ Ġit . has Components ( T :: class ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġa Ġset Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġthat Ġhas Ġa Ġcomponent Ġof Ġthe Ġgiving Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġentities () Ġ= Ġfilter Ġ{ Ġit . has Components ( T :: class ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġto Ġa Ġreceiver Ġa Ġset Ġof Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġthat Ġhas Ġa Ġcomponent Ġof Ġthe ĊĠĠĠĠ Ġ* Ġ Ġgiving Ġtype . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ@ param Ġreceiver Ġfunction Ġthat Ġwill Ġreceive Ġthe Ġentities . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġentities ( receiver : Ġ( Entity ) Ġ-> ĠUnit ) Ġ= Ġfilter Ġ{ Ġit . has Components ( T :: class ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach ( receiver ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNumber Ġof Ġentities Ġin Ġour ĠView . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġentities . size ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġ[ Entity ][ com . j uan med ina . ke cs . entity . Entity ] Ġto Ġour Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġelement ĠThe ĠEntity ][ com . j uan med ina . ke cs . entity . Entity ] Ġto Ġadd Ġto Ġour Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġadd ( element : ĠEntity ) Ġ= Ġentities . add ( element ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġa Ġ[ Entity ][ com . j uan med ina . ke cs . entity . Entity ] Ġexists Ġin Ġour Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġelement ĠThe Ġ[ Entity ][ com . j uan med ina . ke cs . entity . Entity ] Ġto Ġcheck Ġin Ġour Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcontains ( element : ĠEntity ) Ġ= Ġentities . contains ( element ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġa Ġset Ġof Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġexists Ġin Ġour Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġelements ĠThe Ġset Ġof Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġto Ġcheck Ġin Ġour Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcontains All ( elements : ĠCollection < Entity >) Ġ= Ġentities . contains All ( entities ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġthe Ġview Ġhas Ġnot Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠisEmpty () Ġ= Ġentities . isEmpty () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠObtain Ġan Ġ[ Iterator ] Ġof Ġthe Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġin Ġour Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠMutable Iterator < Entity > Ġ= Ġentities . iterator () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa Ġset Ġof Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġto Ġour Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġelements Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġto Ġadd Ġto Ġour Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġadd All ( elements : ĠCollection < Entity >) Ġ= Ġentities . addAll ( elements ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear Ġall Ġthe Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġin Ġour Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ= Ġentities . clear () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġa Ġspecific Ġ[ Entity ][ com . j uan med ina . ke cs . entity . Entity ] Ġin Ġour Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġelement Ġ[ Entity ][ com . j uan med ina . ke cs . entity . Entity ] Ġto Ġbe Ġremoved Ġfrom Ġthe Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġremove ( element : ĠEntity ) Ġ= Ġentities . remove ( element ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġa Ġset Ġof Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġin Ġour Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġelements Ġa Ġset Ġof Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġto Ġbe Ġremoved Ġfrom Ġthe Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġremove All ( elements : ĠCollection < Entity >) Ġ= Ġentities . removeAll ( elements ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġall Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġin Ġa Ġview Ġno Ġmatching Ġthe Ġones Ġprovided . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġelements Ġ[ entities ][ com . j uan med ina . ke cs . entity . Entity ] Ġto Ġretain Ġin Ġour Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġretain All ( elements : ĠCollection < Entity >) Ġ= Ġentities . retain All ( elements ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġan ĠString Ġthat Ġrepresent Ġthe Ġ[ world ][ com . j uan med ina . ke cs . entity . View ]. ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ String ] Ġwith Ġthe Ġview Ġdetails . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" View ( entities =$ entities )" ĊĠĠĠ Ġ} Ċ } Ċ