package Ġorg . gr anch i . hol ly wood Ċ Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠA ĠModel Ġthat Ġonly Ġcontains Ġseveral Ġsub models . Ċ Ġ* Ċ Ġ* ĠThe ir Ġorder Ġcan Ġbe Ġimportant , Ġbecause Ġactions Ġwill Ġbe Ġapplied Ġto Ġevery Ġsub Model Ġfollowing Ġthe Ċ Ġ* Ġsame Ġorder . Ċ Ġ* Ċ Ġ* ĠIt Ġserves Ġas Ġa Ġway Ġto Ġde compose Ġbusiness Ġlogic Ġin Ġseveral Ġcomponents . Ċ Ġ*/ Ċ data Ġclass ĠComposite Model ( var Ġmodels : ĠList < Model >) Ġ: ĠModel () Ġ{ ĊĠĠĠ Ġconstructor ( var arg Ġmodel : ĠModel ) Ġ: Ġthis ( listOf (* Ġmodel )) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( models . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodels Ġ= Ġmodels . distinct () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġact Up on ( action : ĠAction ): ĠModel ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Models Ġ= Ġmodels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . act Up on ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ? ĠComposite Model )?. models Ġ?: ĠlistOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result Models . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComposite Model ( result Models ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠModel > Ġget Sub models OfType ( type : ĠK Class < out ĠT >): ĠCollection < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( type . is Instance ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( this Ġas ĠT ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . getSub models OfType ( type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ