package Ġme . joy pri Ċ Ċ import Ġorg . reflection s . Reflection s Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . K Type Ċ import Ġkotlin . reflect . full .* Ċ import Ġkotlin . reflect . jvm . is Accessible Ċ Ċ //////////////////////////////////////////////////////////////////////////// // Ċ // ĠRole Ċ Ċ /** Ċ Ġ* ĠSub ord inate Ġimp Ġ( underlying Ġdata Ġor Ġbehavior ) Ġof Ġa Ġ[ Mix ] Ġor Ġ[ Rem ix ]. Ċ Ġ* ĠSpecific Ġroles Ġare Ġdeclared Ġas Ġ` object ` Ġsubclasses Ġof Ġ` Role `. Ċ Ġ* ĠFor Ġexample : Ċ Ġ* Ġ ~~~ Ċ Ġ* Ġobject ĠFirst Name Ġ: ĠString Role () Ċ Ġ* Ġ ~~~ Ċ Ġ* Ċ Ġ* ĠRole Ġare Ġused Ġwhen Ġdeclaring Ġ` Mix ` Ġsub types : Ċ Ġ* Ġ ~~~ Ċ Ġ* Ġopen Ġclass ĠPerson ( var arg Ġparts : ĠPart ) Ġ: ĠMix (* parts ) Ġ{ Ċ Ġ* ĠĠ Ġval ĠfirstName Ġby ĠFirst Name Ċ Ġ* ĠĠ Ġval Ġmiddle Name Ġby Ġ+ Middle Name Ċ Ġ* ĠĠ Ġval Ġage Ġby ĠAge Ċ Ġ* Ġ} Ċ Ġ* Ġ ~~~ Ċ Ġ* ĠThey Ġare Ġalso Ġused Ġto Ġprovide Ġand Ġaccess Ġdata Ġin Ġ` Mix ` Ġh ierarch ies : Ċ Ġ* Ġ ~~~ Ċ Ġ* Ġval Ġf red Ġ= ĠMix ( FirstName Ġof Ġ" F red ", ĠAge Ġof Ġ 1 2 ) Ċ Ġ* ĠassertEquals (" F red ", Ġf red [ FirstName ]) Ċ Ġ* Ġ ~~~ Ċ Ġ* Ġ` Role ` Ġvalues Ġare Ġnever Ġnullable , Ġbut Ġin Ġsome Ġcases Ġa Ġ` Mix ` Ġor Ġ` Rem ix ` Ġmay Ċ Ġ* Ġoptionally Ġhave Ġa Ġrole . Ċ Ġ*/ Ċ abstract Ġclass ĠRole < V Ġ: ĠAny > Ġ: ĠNamed () Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġ[ value ] Ġis Ġvalid Ġfor Ġthis Ġrole . Ġ` null ` Ġis Ġnever Ġa Ġvalid Ġvalue ; ĊĠĠĠĠ Ġ* Ġroles Ġcan Ġhave Ġan Ġoptional Ġassociation Ġwith Ġtheir Ġparent Ġclass , Ġbut Ġtheir Ġvalues ĊĠĠĠĠ Ġ* Ġcannot Ġbe Ġ` null `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġcan Hold ( value : ĠAny ?): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThrows Ġ[ IllegalStateException ] Ġif Ġ[ value ] Ġis Ġnot Ġvalid Ġfor Ġthis Ġrole . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġrequire Can Hold ( value : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Hold ( value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ("$ this Ġcan 't Ġhold Ġ$ value ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġas Nullable Value ( value : ĠAny ?): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Can Hold ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġas ĠV ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġas Value ( value : ĠAny ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Can Hold ( value ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġas ĠV ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġprovide Delegate ( this Ref : ĠMix , Ġprop : ĠK Property < *> ): ĠRole Mix Delegate < V > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġthis Ref . value By QualifiedName [ qualified Name ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ref . construct ed For Reflection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRole Mix Delegate ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" missing Ġvalue Ġfor Ġrole Ġ$ qualified Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRole Mix Delegate ( this , Ġas Value ( value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ Ġ[ Role ] Ġwhose Ġvalue Ġis Ġnot Ġa Ġ[ Mix ]. Ċ Ġ*/ Ċ abstract Ġclass ĠLeaf Role < V Ġ: ĠAny > Ġ: ĠRole < V >() Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġprovide Delegate ( this Ref : ĠRem ix , Ġprop : ĠK Property < *> ): ĠRole Rem ix Delegate < V > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRole Rem ix Delegate ( this ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Leaf Role ] Ġwhose Ġvalue Ġtype Ġ[ V ] Ġis Ġrepresented Ġby Ġ` K Class < V >`. Ċ Ġ* ĠSpecific Ġroles Ġare Ġdeclared Ġas Ġ` object ` Ġsubclasses . Ċ Ġ* ĠFor Ġexample : Ċ Ġ* Ġ ~~~ Ċ Ġ* Ġobject ĠFirst Name Ġ: ĠClass Role < String >( String :: class ) Ċ Ġ* Ġ ~~~ Ċ Ġ* ĠThe Ġabove Ġsyntax Ġis Ġund eni ably Ġawk ward . ĠThe Ġruntime Ġtype , Ġ` String :: class `, Ġis Ċ Ġ* Ġneeded Ġfor Ġflexible Ġreflection . ĠPerhaps ĠKotlin Ġwill Ġeventually Ġmake Ġthis Ġeasier , Ċ Ġ* Ġas Ġis Ġsuggested Ġin Ġ[ KT - 1 3 1 2 7 ]( https :// yout rack . jetbrains . com / issue / KT - 1 3 1 2 7 ). Ċ Ġ* ĠAs Ġa Ġwork - around , Ġwe Ġdefine Ġconvenience Ġsubclasses Ġthat Ġare Ġpreferred Ġfor Ċ Ġ* Ġroutine Ġuse : Ċ Ġ* Ġ ~~~ Ċ Ġ* Ġobject ĠFirst Name Ġ: ĠString Role Ċ Ġ* Ġ ~~~ Ċ Ġ*/ Ċ @ Suppress (" Member Visibility Can Be Private ") Ċ abstract Ġclass ĠClass Role < V Ġ: ĠAny >( val Ġvalue Class : ĠK Class < V >) Ġ: ĠLeaf Role < V >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcan Hold ( value : ĠAny ?): ĠBoolean Ġ= Ġvalue Class . is Instance ( value ) Ċ } Ċ Ċ open Ġclass ĠBoolean Role Ġ: ĠClass Role < Boolean >( Boolean :: class ) Ċ Ċ open Ġclass ĠByte Role Ġ: ĠClass Role < Byte >( Byte :: class ) Ċ open Ġclass ĠChar Role Ġ: ĠClass Role < Char >( Char :: class ) Ċ open Ġclass ĠInt Role Ġ: ĠClass Role < Int >( Int :: class ) Ċ open Ġclass ĠLong Role Ġ: ĠClass Role < Long >( Long :: class ) Ċ open Ġclass ĠFloat Role Ġ: ĠClass Role < Float >( Float :: class ) Ċ open Ġclass ĠDouble Role Ġ: ĠClass Role < Double >( Double :: class ) Ċ Ċ open Ġclass ĠString Role Ġ: ĠClass Role < String >( String :: class ) ĊĊ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġrole Ġwhose Ġvalue Ġis Ġa Ġ[ List ] Ġof Ġ[ E ]. Ċ Ġ*/ Ċ abstract Ġclass ĠList Role < E Ġ: ĠAny >( ĊĠĠĠ Ġval Ġelement Class : ĠK Class < E >, ĊĠĠĠ Ġval Ġball park Size : ĠInt Ġ= Ġ 1 0 , ĊĠĠĠ Ġval ĠmaxSize : ĠInt ? Ġ= Ġnull Ċ ) Ġ: ĠLeaf Role < List < E >>() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcan Hold ( value : ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠ Ġvalue Ġis ĠList < *> Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . all Ġ{ Ġelement Class . is Instance ( it ) Ġ} Ċ } Ċ Ċ //////////////////////////////////////////////////////////////////////////// // Ċ // ĠMix Ġab stractions Ċ Ċ interface ĠMix Parts Ġ{ ĊĠĠĠ Ġval Ġvalue By QualifiedName : ĠMap < String , ĠAny > ĊĠĠĠ Ġval Ġparts : ĠList < Part > Ġget () Ġ= Ġvalue By QualifiedName . map Ġ{ ĠPart ( it . key , Ġit . value ) Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġ< V Ġ: ĠAny > Ġget ( role : ĠRole < V >): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġthis . value By QualifiedName [ role . qualified Name ] ĊĠĠĠĠĠĠĠ Ġreturn Ġrole . as Nullable Value ( value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConstructs Ġa Ġnew Ġinstance Ġof Ġthis Ġsame Ġclass , Ġwith Ġroles Ġoverridden Ġby Ġthe Ġprovided Ġ` overrides `. Ċ Ġ* ĠOther Ġthan Ġreplacing Ġoverridden Ġroles , Ġthis Ġmethod Ġis Ġa Ġshallow Ġcopy Ċ Ġ* Ġthat Ġre uses Ġrole Ġvalues . Ċ Ġ*/ Ċ fun Ġ< M Ġ: ĠMix Parts > ĠM . with ( var arg Ġoverrides : ĠPart ): ĠM Ġ= ĊĠĠĠ Ġthis :: class . construct From Parts ( parts Ġ+ Ġoverrides ) Ċ Ċ fun Ġ< M Ġ: ĠMix Parts , ĠV Ġ: ĠAny > ĠM . map At ( role : ĠLeaf Role < V >, Ġf : Ġ( V ) Ġ-> ĠV ): ĠM Ġ{ ĊĠĠĠ Ġval ĠoldValue Ġ= Ġget ( role ) ĊĠĠĠ Ġrequire ( oldValue Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" We Ġonly Ġsupport Ġmapping Ġan Ġexisting Ġrole Ġvalue , Ġbut Ġ$ this [$ role ] Ġis Ġnull ." ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwith ( role Ġof Ġf ( oldValue )) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġinstance Ġof Ġthis Ġclass Ġwith Ġthe Ġvalue Ġat Ġ` path ` Ġmapped Ġthrough Ġ` f `. Ċ Ġ* ĠThere Ġmust Ġbe Ġan Ġexisting Ġvalue Ġat Ġ` path ` Ġ( and Ġhence Ġevery Ġstep Ġalong Ġ` path `), Ċ Ġ* Ġelse Ġthis Ġmethod Ġthrows Ġ` IllegalArgumentException `. Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġconstructs Ġnew Ġ` List ` Ġand Ġ` Mix Parts ` Ġinstances Ġall Ġthe Ġway Ġdown Ġ` path `, Ċ Ġ* Ġpre serving Ġ` Mix Parts ` Ġruntime Ġclasses . ĠIn Ġall Ġother Ġrespect s , Ġit Ġis Ġa Ġshallow Ġcopy Ċ Ġ* Ġthat Ġre uses Ġrole Ġvalues . ĠB ey ond Ġthe Ġusual Ġca ution s Ġabout Ġreuse Ġof Ġmutable Ċ Ġ* Ġvalues Ġin Ġshallow Ġcopies , Ġthe Ġcomplex Ġmix Ġof Ġshared Ġand Ġnew Ġ` Mix Parts ` Ċ Ġ* Ġinstances Ġmay Ġbe Ġproblematic Ġfor Ġ` Rem ix ` s . Ċ Ġ*/ Ċ fun Ġ< M Ġ: ĠMix Parts , ĠV Ġ: ĠAny > ĠM . map At ( path : ĠRole Path < V >, Ġf : Ġ( V ) Ġ-> ĠV ): ĠM Ġ= ĊĠĠĠ Ġpath . map Here ( this , Ġf ) Ċ Ċ fun Ġ< M Ġ: ĠMix Parts , ĠV Ġ: ĠAny > ĠM . with ( path : ĠRole Path < V >, Ġv : ĠV ): ĠM Ġ= ĊĠĠĠ Ġmap At ( path ) Ġ{ Ġv Ġ} Ċ Ċ operator Ġfun Ġ< M Ġ: ĠMix Parts , ĠV Ġ: ĠAny > ĠM . get ( path : ĠRole Path < V >): ĠV ? Ġ= ĊĠĠĠ Ġpath . get Here ( this ) Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠK Class < T >. construct From Parts ( parts : ĠList < Part >): ĠT Ġ{ ĊĠĠĠ Ġval Ġctor Ġ= Ġprimary Constructor ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ("$ this Ġhas Ġno Ġprimary Ġconstructor ") ĊĠĠĠ Ġreturn Ġctor . call ( parts . to Typed Array ()) Ċ } Ċ Ċ //////////////////////////////////////////////////////////////////////////// // Ċ // ĠMix Ċ Ċ /** Ċ Ġ* ĠIf Ġpresent Ġin Ġa Ġ` Mix `, Ġflags Ġit Ġas Ġhaving Ġbeen Ġconstructed Ġjust Ġfor Ġreflection . Ċ Ġ* ĠThis Ġdisables Ġerror - checking Ġfor Ġmissing Ġ` Role ` s . Ċ Ġ*/ Ċ object ĠConstruct ed For Reflection Ġ: ĠClass Role < Unit >( Unit :: class ) Ċ Ċ /** Ċ Ġ* ĠAn Ġimmutable Ġhe ter ogeneous Ġmap Ġfrom Ġ` Role < V >` Ġto Ġ` V `. ĠIf Ġany Ġof Ġthe Ġprovided Ġ[ parts ] Ġhave Ġthe Ġsame Ċ Ġ* Ġkeys , Ġthe Ġlast Ġoccurrence Ġof Ġa Ġkey Ġis Ġthe Ġone Ġthat Ġis Ġused . Ċ Ġ* Ċ Ġ* ĠSub classes Ġcan Ġhave Ġ` val ` Ġproperties Ġthat Ġare Ġdeleg ated Ġto Ġ` Role < V >`, Ġin Ġwhich Ġcase Ġthose Ġproperties Ċ Ġ* Ġwill Ġtake Ġon Ġthe Ġvalues Ġassociated Ġwith Ġthe Ġcorresponding Ġroles Ġin Ġ[ parts ]. Ċ Ġ*/ Ċ open Ġclass ĠMix ( var arg Ġparts : ĠPart ) Ġ: ĠMix Parts Ġ{ ĊĊĠĠĠ Ġfinal Ġoverride Ġval Ġvalue By QualifiedName : ĠMap < String , ĠAny > Ġ= ĊĠĠĠĠĠĠĠ Ġparts . associate Ġ{ Ġit . key Name Ġto Ġit . value Ġ} ĊĊĠĠĠ Ġ// ĠPre - compute Ġ` parts ` Ġnow . ĊĠĠĠ Ġfinal Ġoverride Ġval Ġparts Ġ= Ġsuper . parts ĊĊĠĠĠ Ġval Ġconstructed For Reflection Ġ= ĊĠĠĠĠĠĠĠ Ġvalue By QualifiedName . containsKey ( Construct ed For Reflection . qualified Name ) ĊĊĠĠĠ Ġoperator Ġfun Ġ< V Ġ: ĠAny > ĠRole < V >. unary Plus () Ġ= ĠOptional Role Mix Delegate Provider ( this ) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġother Ġis ĠMix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . java Class Ġ== Ġjava Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . value By QualifiedName Ġ== Ġvalue By QualifiedName ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠ 3 1 Ġ* Ġvalue By QualifiedName . hashCode () Ġ+ Ġjava Class . hashCode () Ċ } Ċ Ċ class ĠOptional Role Mix Delegate Provider < V Ġ: ĠAny >( private Ġval Ġrole : ĠRole < V >) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġprovide Delegate ( this Ref : ĠMix , Ġprop : ĠK Property < *> ): ĠOptional Role Mix Delegate < V > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġthis Ref . value By QualifiedName [ role . qualified Name ] ĊĠĠĠĠĠĠĠ Ġreturn ĠOptional Role Mix Delegate ( role , Ġrole . as Nullable Value ( value )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ //////////////////////////////////////////////////////////////////////////// // Ċ // ĠRem ix Ċ Ċ @ Dsl Marker Ċ annotation Ġclass ĠRem ix Marker Ċ Ċ /** Ċ Ġ* ĠA Ġmutable Ġhe ter ogeneous Ġmap Ġfrom Ġ` Role < V >` Ġto Ġ` V `, Ġexcept Ġthat Ġ` Mix Role < M , ĠR >` Ġis Ġmapped Ġto Ġ` R `. Ċ Ġ* ĠThis Ġis Ġdesigned Ġas Ġa Ġbuilder Ġfor Ġa Ġ` Mix ` Ġwith ĠDSL Ġsupport . ĠNot Ġthread - safe . Ċ Ġ* Ċ Ġ* ĠA Ġ` var ` Ġproperty Ġin Ġa Ġsubclass Ġof Ġ` Rem ix ` Ġcan Ġbe Ġdeleg ated Ġto Ġ` Role < V >`, Ġproviding Ġread - write Ġaccess Ċ Ġ* Ġto Ġthe Ġvalue Ġassociated Ġwith Ġthat Ġ` Role `. ĠSuch Ġa Ġproperty Ġhas Ġtype Ġ` V ? `, Ġsince Ġthe Ġvalue Ġmay Ġor Ġmay Ġnot Ċ Ġ* Ġbe Ġpresent . Ċ Ġ*/ Ċ @ Rem ix Marker Ċ open Ġclass ĠRem ix ( var arg Ġparts : ĠPart ) Ġ: ĠMix Parts Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġvalue By QualifiedName : ĠMutable Map < String , ĠAny > Ġ= ĊĠĠĠĠĠĠĠ Ġparts . associate To ( mutable Map Of ()) Ġ{ Ġit . key Name Ġto Ġit . value Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġ< V Ġ: ĠAny > Ġset ( role : ĠLeaf Role < V >, Ġvalue : ĠV ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue By QualifiedName . remove ( role . qualified Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue By QualifiedName [ role . qualified Name ] Ġ= Ġvalue Ġas ĠAny ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġ< M Ġ: ĠMix , ĠR Ġ: ĠRem ix > Ġset ( role : ĠMix Role < M , ĠR >, Ġvalue : ĠR ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue By QualifiedName . remove ( role . qualified Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue By QualifiedName [ role . qualified Name ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġimplement Ġset ( Mix Role , ĠMix ), Ġwhich Ġshould Ġconvert Ġthe ĠMix Ġto Ġa ĠRem ix . ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthis Ġ` Rem ix `' s Ġ` Part ` s Ġwith Ġall Ġsub ord inate Ġ` Rem ix ` s Ġconverted ĊĠĠĠĠ Ġ* Ġvia Ġ` Rem ix . to Mix ()`. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġmix Parts (): ĠArray < Part > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparts . map Ġ{ Ġpart Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( part . value Ġis ĠRem ix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPart ( part . key Name , Ġpart . value . to Mix ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġthis Ġ` Rem ix ` Ġand Ġall Ġof Ġits Ġsub ord inate Ġ` Rem ix ` s Ġto Ġ` Mix ` s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġto Mix (): ĠMix Ġ= ĠMix (* mix Parts ()) ĊĊĠĠĠ Ġoperator Ġfun Ġ< V Ġ: ĠAny > ĠLeaf Role < V >. unary Plus (): ĠRole Rem ix Delegate Provider < V > Ġ= ĊĠĠĠĠĠĠĠ ĠRole Rem ix Delegate Provider ( this ) ĊĊĠĠĠ Ġoperator Ġfun Ġ< M Ġ: ĠMix , ĠR Ġ: ĠRem ix > ĠMix Role < M , ĠR >. not (): ĠMix Role Rem ix Delegate Provider < M , ĠR > Ġ= ĊĠĠĠĠĠĠĠ ĠMix Role Rem ix Delegate Provider ( this ) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġother Ġis ĠRem ix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . java Class Ġ== Ġjava Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . value By QualifiedName Ġ== Ġvalue By QualifiedName ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠ 3 1 Ġ* Ġvalue By QualifiedName . hashCode () Ġ+ Ġjava Class . hashCode () Ċ } Ċ Ċ class ĠRole Rem ix Delegate Provider < V Ġ: ĠAny >( private Ġval Ġrole : ĠLeaf Role < V >) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġprovide Delegate ( this Ref : ĠRem ix , Ġprop : ĠK Property < *> ): ĠRole Rem ix Delegate < V > Ġ= ĊĠĠĠĠĠĠĠ ĠRole Rem ix Delegate ( role ) Ċ } Ċ Ċ class ĠMix Role Rem ix Delegate Provider < M Ġ: ĠMix , ĠR Ġ: ĠRem ix >( val Ġrole : ĠMix Role < M , ĠR >) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġprovide Delegate ( ĊĠĠĠĠĠĠĠ Ġthis Ref : ĠRem ix , ĊĠĠĠĠĠĠĠ Ġprop : ĠK Property < *> ĊĠĠĠ Ġ): ĠMix Role Rem ix Delegate < M , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMix Role Rem ix Delegate ( role ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠNamed Ġ{ ĊĠĠĠ Ġopen Ġval Ġqualified Name : ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ( this :: class . qualified Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Named Ġsubclass Ġmust Ġhave Ġa Ġqualified Name ; Ġit Ġis Ġnull ' ")) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġqualified Name ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠRole Path Segment Ċ Ċ data Ġclass ĠAt Role ( val Ġrole : ĠLeaf Role <* >) Ġ: ĠRole Path Segment () Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġrole . toString () Ċ } Ċ Ċ data Ġclass ĠAt Index ( val Ġindex : ĠInt ) Ġ: ĠRole Path Segment () Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" [$ index ]" Ċ } Ċ Ċ data Ġclass ĠRole Path < V Ġ: ĠAny > Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġsegments : ĠList < Role Path Segment > Ċ ) Ġ{ ĊĠĠĠ Ġconstructor Ġ( role : ĠLeaf Role < V >) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( listOf ( At Role ( role ))) ĊĊĠĠĠ Ġconstructor Ġ( other : ĠRole Path < List < V >>, Ġindex : ĠInt ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( other . segments Ġ+ ĠAt Index ( index )) ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< M Ġ: ĠMix Parts > Ġmap Here ( mix : ĠM , Ġf : Ġ( V ) Ġ-> ĠV ): ĠM Ġ= ĊĠĠĠĠĠĠĠ Ġmap At ( mix , Ġsegments , Ġf , ĠlistOf ()) Ġas ĠM ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< M Ġ: ĠMix Parts > Ġget Here ( mix : ĠM ): ĠV ? Ġ= ĊĠĠĠĠĠĠĠ Ġget At ( mix , Ġsegments , ĠlistOf ()) Ġas ĠV ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPublic Ġonly Ġfor Ġuse Ġby Ġinternal Ġinline Ġfunctions ; Ġuse Ġ` plus ( other )` Ġextern ally . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< R Ġ: ĠAny > Ġinternal Concat ( this Class : ĠK Class < V >, Ġother : ĠRole Path < R >): ĠRole Path < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( this Class . is Subclass Of ( Mix Parts :: class ) Ġ|| Ġthis Class . is Subclass Of ( List :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" left - hand - side Ġvalue Ġtype Ġmust Ġbe ĠMix Parts Ġor ĠList Ġbut Ġis Ġ$ this Class " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( other . segments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġother . segments . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Class . is Subclass Of ( Mix Parts :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( first Ġis ĠAt Role ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" for Ġconcaten ating Ġonto ĠRole Path < Mix Parts >, Ġother Ġmust Ġstart Ġwith Ġa ĠRole Ġbut Ġis Ġ$ other " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( first Ġis ĠAt Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" for Ġconcaten ating Ġonto ĠRole Path < List <* >>, Ġother Ġmust Ġstart Ġwith Ġan Ġindex Ġbut Ġis Ġ$ other " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠRole Path ( this . segments Ġ+ Ġother . segments ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsegments ToString ( segments ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< M Ġ: ĠMix Parts , ĠV Ġ: ĠAny > Ġmake ( mix Path : ĠRole Path < M >, Ġrole : ĠLeaf Role < V >): ĠRole Path < V > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRole Path ( mix Path . segments Ġ+ ĠAt Role ( role )) ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< V Ġ: ĠAny > Ġempty (): ĠRole Path < V > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRole Path ( listOf ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġsegments ToString ( segments : ĠList < Role Path Segment >): ĠString Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠ Ġvar Ġis First Ġ= Ġtrue ĊĠĠĠ Ġfor Ġ( e Ġin Ġsegments ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAt Role Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is First ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ+ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( e . role . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAt Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("[ ${ e . index }] ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis First Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbuilder . toString () Ċ } Ċ Ċ fun Ġ< V Ġ: ĠAny > ĠLeaf Role < V >. to Path (): ĠRole Path < V > Ġ= ĠRole Path ( this ) Ċ Ċ inline Ġoperator Ġfun Ġ< re ified ĠL Ġ: ĠAny , ĠR Ġ: ĠAny > ĠLeaf Role < L >. plus ( other : ĠRole Path < R >): ĠRole Path < R > Ġ= ĊĠĠĠ Ġto Path (). internal Concat ( L :: class , Ġother ) Ċ Ċ inline Ġoperator Ġfun Ġ< re ified ĠL Ġ: ĠAny , ĠR Ġ: ĠAny > ĠRole Path < L >. plus ( other : ĠRole Path < R >): ĠRole Path < R > Ġ= ĊĠĠĠ Ġthis . internal Concat ( L :: class , Ġother ) Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ private Ġfun Ġ< V Ġ: ĠAny > Ġmap At ( ĊĠĠĠ Ġfrom : ĠAny , ĊĠĠĠ Ġsegments : ĠList < Role Path Segment >, ĊĠĠĠ Ġf : Ġ( V ) Ġ-> ĠV , ĊĠĠĠ Ġcontext : ĠList < Role Path Segment > Ċ ): ĠAny Ġ{ ĊĠĠĠ Ġif Ġ( segments . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġf ( from Ġas ĠV ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġsegments . first () ĊĠĠĠĠĠĠĠ Ġval Ġcontext Str Ġby Ġlazy Ġ{ Ġsegments ToString ( context Ġ+ Ġs ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrecur ( oldValue : ĠAny ?): ĠAny Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( oldValue Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" required Ġnon - null Ġvalue Ġat Ġ$ context Str " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmap At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegments . drop ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ+ Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAt Role Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( from Ġis ĠMix Parts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" required ĠMix Parts Ġat Ġ$ context Str Ġbut Ġfound Ġ$ from " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġfrom . value By QualifiedName [ s . role . qualified Name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfrom . with ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPart ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . role . qualified Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecur ( oldValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAt Index Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( from Ġis ĠList <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" required ĠList Ġat Ġ$ context Str Ġbut Ġfound Ġ$ from " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( s . index Ġin Ġ 0 Ġuntil Ġfrom . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" outside Ġlist Ġrange Ġ( 0 Ġuntil Ġ${ from . size }) Ġat Ġ$ context Str " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġfrom [ s . index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( from Ġas ĠList < Any >). map Indexed Ġ{ Ġi : ĠInt , Ġv : ĠAny Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġs . index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecur ( oldValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ private Ġfun Ġget At ( ĊĠĠĠ Ġfrom : ĠAny , ĊĠĠĠ Ġsegments : ĠList < Role Path Segment >, ĊĠĠĠ Ġcontext : ĠList < Role Path Segment > Ċ ): ĠAny ? Ġ{ ĊĠĠĠ Ġif Ġ( segments . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfrom ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġsegments . first () ĊĠĠĠĠĠĠĠ Ġval Ġcontext Str Ġby Ġlazy Ġ{ Ġsegments ToString ( context Ġ+ Ġs ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrecur ( new From : ĠAny ?): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( new From Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" required Ġnon - null Ġvalue Ġat Ġ$ context Str " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew From , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegments . drop ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ+ Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAt Role Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( from Ġis ĠMix Parts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" required ĠMix Parts Ġat Ġ$ context Str Ġbut Ġfound Ġ$ from " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġfrom . value By QualifiedName [ s . role . qualified Name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( segments . size Ġ== Ġ 1 ) Ġv Ġelse Ġrecur ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAt Index Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( from Ġis ĠList <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" required ĠList Ġat Ġ$ context Str Ġbut Ġfound Ġ$ from " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( s . index Ġin Ġ 0 Ġuntil Ġfrom . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" outside Ġlist Ġrange Ġ( 0 Ġuntil Ġ${ from . size }) Ġat Ġ$ context Str " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrecur ( from [ s . index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ operator Ġfun Ġ< M Ġ: ĠMix Parts , ĠV Ġ: ĠAny > ĠRole Path < M >. plus ( role : ĠLeaf Role < V >): ĠRole Path < V > Ġ= ĊĠĠĠ ĠRole Path . make ( this , Ġrole ) Ċ Ċ operator Ġfun Ġ< M Ġ: ĠMix Parts , ĠV Ġ: ĠAny > ĠLeaf Role < M >. plus ( role : ĠLeaf Role < V >): ĠRole Path < V > Ġ= ĊĠĠĠ Ġthis . to Path () Ġ+ Ġrole Ċ Ċ operator Ġfun Ġ< V Ġ: ĠAny > ĠLeaf Role < List < V >> . get ( index : ĠInt ): ĠRole Path < V > Ġ= ĊĠĠĠ ĠRole Path ( this . to Path (), Ġindex ) Ċ Ċ operator Ġfun Ġ< V Ġ: ĠAny > ĠRole Path < List < V >> . get ( index : ĠInt ): ĠRole Path < V > Ġ= ĊĠĠĠ ĠRole Path ( this , Ġindex ) Ċ Ċ data Ġclass ĠPart Ġconstructor ( val Ġkey Name : ĠString , Ġval Ġvalue : ĠAny ) Ċ Ċ @ Deprecated ( ĊĠĠĠ Ġ" Instead Ġuse Ġ` This Role Ġof Ġvalue ` Ġto Ġbe Ġexplicitly Ġdifferent Ġfrom ĠKotlin 's Ġstandard Ġ` to `. ", ĊĠĠĠ ĠReplace With (" of ") Ċ ) Ċ infix Ġfun Ġ< V Ġ: ĠAny > ĠLeaf Role < V >. to ( value : ĠV ): ĠPart Ġ= Ġof ( value ) Ċ Ċ /** Ċ Ġ* ĠTODO : ĠProvide Ġa Ġcounter part Ġfor Ġ` Mix Role `. Ċ Ġ*/ Ċ infix Ġfun Ġ< V Ġ: ĠAny > ĠLeaf Role < V >. of ( value : ĠV ): ĠPart Ġ{ ĊĠĠĠ Ġreturn ĠPart ( qualified Name , Ġvalue ) Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġ[ Leaf Role ] Ġwhose Ġvalue Ġis Ġa Ġ[ Mix ] Ġsubclass Ġ` M `, Ġwith Ġcorresponding Ġ[ Rem ix ] Ġsubclass Ġ` R `. Ċ Ġ*/ Ċ abstract Ġclass ĠMix Role < M Ġ: ĠAny , ĠR Ġ: ĠRem ix >( m Class : ĠK Class < M >, Ġval Ġrem ix Class : ĠK Class < R >) Ġ: ĊĠĠĠ ĠClass Role < M >( m Class ) Ċ Ċ //////////////////////////////////////////////////////////////// //////////////////////////////// Ċ // ĠSupport Ġfor Ġdeleg ating Ġproperties Ġto Ġ` Role ` s . Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġdeclared Ġassociation Ġof Ġa Ġ[ Role ] Ġwith Ġa Ġparent Ġ[ Mix ] Ġor Ġ[ Rem ix ]. Ċ Ġ* ĠThis Ġclass Ġis Ġintended Ġas Ġa Ġruntime Ġrepresentation , Ġso Ġit Ġis Ġnot Ġtype - parameter ized Ċ Ġ* Ġand Ġrefers Ġto Ġa Ġ` Role < *> `. Ċ Ġ* Ċ Ġ* Ġ@ param Ġis Optional Ġindicates Ġthat Ġthe Ġrole Ġhas Ġan Ġoptional Ġassociation Ġwith Ġits Ġparent . Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(` Role ` Ġvalues Ġare Ġnever Ġnullable .) Ċ Ġ*/ Ċ data Ġclass ĠRole Declaration ( val Ġrole : ĠRole <* >, Ġval Ġis Optional : ĠBoolean ) Ċ Ċ interface ĠRole Declaration Provider Ġ{ ĊĠĠĠ Ġval Ġrole Declaration : ĠRole Declaration Ċ } Ċ Ċ class ĠRole Mix Delegate < V Ġ: ĠAny >( private Ġval Ġrole : ĠRole < V >, Ġprivate Ġval Ġvalue : ĠV ?) Ġ: ĊĠĠĠ ĠReadOnly Property < Mix , ĠV >, ĠRole Declaration Provider Ġ{ ĊĠĠĠ Ġoverride Ġval Ġrole Declaration Ġ= ĠRole Declaration ( role , Ġfalse ) ĊĠĠĠ Ġoverride Ġoperator Ġfun ĠgetValue ( this Ref : ĠMix , Ġproperty : ĠK Property < *> ): ĠV Ġ= ĊĠĠĠĠĠĠĠ Ġvalue Ġ?: Ġthrow ĠIllegalStateException (" missing Ġrequired Ġvalue Ġfor Ġ$ role ") Ċ } Ċ Ċ class ĠOptional Role Mix Delegate < V Ġ: ĠAny >( role : ĠRole < V >, Ġprivate Ġval Ġvalue : ĠV ?) Ġ: ĊĠĠĠ ĠReadOnly Property < Mix , ĠV ? >, ĠRole Declaration Provider Ġ{ ĊĠĠĠ Ġoverride Ġval Ġrole Declaration Ġ= ĠRole Declaration ( role , Ġtrue ) ĊĠĠĠ Ġoverride Ġoperator Ġfun ĠgetValue ( this Ref : ĠMix , Ġproperty : ĠK Property < *> ): ĠV ? Ġ= Ġvalue Ċ } Ċ Ċ class ĠRole Rem ix Delegate < V Ġ: ĠAny >( private Ġval Ġrole : ĠLeaf Role < V >) Ġ: ĊĠĠĠ ĠRead Write Property < Rem ix , ĠV ? >, ĠRole Declaration Provider Ġ{ ĊĠĠĠ Ġoverride Ġval Ġrole Declaration Ġ= ĠRole Declaration ( role , Ġtrue ) ĊĠĠĠ Ġoverride Ġoperator Ġfun ĠgetValue ( this Ref : ĠRem ix , Ġproperty : ĠK Property < *> ): ĠV ? Ġ= ĊĠĠĠĠĠĠĠ Ġthis Ref [ role ] ĊĊĠĠĠ Ġoverride Ġoperator Ġfun ĠsetValue ( this Ref : ĠRem ix , Ġproperty : ĠK Property <* >, Ġvalue : ĠV ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ref [ role ] Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMix Role Rem ix Delegate < M Ġ: ĠMix , ĠR Ġ: ĠRem ix >( private Ġval Ġrole : ĠMix Role < M , ĠR >) Ġ: ĊĠĠĠ ĠRead Write Property < Rem ix , ĠR >, ĠRole Declaration Provider Ġ{ ĊĠĠĠ Ġoverride Ġval Ġrole Declaration Ġ= ĠRole Declaration ( role , Ġtrue ) ĊĠĠĠ Ġoverride Ġoperator Ġfun ĠgetValue ( this Ref : ĠRem ix , Ġproperty : ĠK Property < *> ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ref . value By QualifiedName . compute If Absent ( role . qualified Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrole . rem ix Class . construct From Parts ( listOf ()) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠR ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġoperator Ġfun ĠsetValue ( this Ref : ĠRem ix , Ġproperty : ĠK Property <* >, Ġvalue : ĠR ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ref [ role ] Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ //////////////////////////////////////////////////////////////// //////////////////////////////// Ċ // ĠReflection Ċ Ċ /** Ċ Ġ* ĠService ĠProvider ĠInterface Ġused Ġas Ġa Ġmarker Ġthat Ġa Ġclass 's Ġpackage Ġprovides Ġparts . Ċ Ġ*/ Ċ interface ĠPart s Provider Ċ Ċ val Ġrole Declarations Cache Ġ= ĠConcurrent HashMap < K Class <* >, ĠList < Role Declaration >>() Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġlist Ġof Ġ[ Role Declaration ] Ġrepresenting Ġroles Ġdeclared Ġin Ġ[ k class ]. ĠFor Ġa Ġgiven Ġclass , Ċ Ġ* Ġthis Ġfunction Ġalways Ġreturns Ġthe Ġsame Ġroles Ġin Ġthe Ġsame Ġorder . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠMix > Ġrole Declarations ( k class : ĠK Class < T >): ĠList < Role Declaration > Ġ= ĊĠĠĠ Ġrole Declarations Cache . compute If Absent ( k class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġk class . construct From Parts ( listOf ( Construct ed For Reflection Ġof ĠUnit )) ĊĠĠĠĠĠĠĠ Ġfun Ġmaybe Role Decl ( prop : ĠK Property 1 < T , Ġ* >): ĠRole Declaration ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelegate Ġ= Ġprop . get Delegate ( instance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( delegate Ġis ĠRole Declaration Provider ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . role Declaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġk class . member Properties . map NotNull (:: maybe Role Decl ). toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . role . qualified Name Ġ} ĊĠĠĠ Ġ} Ċ Ċ private Ġval Ġmix Imp s For Face : ĠMap < K Type , ĠList < K Class <* >>> Ġ= ĊĠĠĠ Ġmutable Map Of < K Type , ĠMutable List < K Class <* >>> (). also Ġ{ Ġm Ġ-> ĊĠĠĠĠĠĠĠ Ġfor Ġ( service Ġin ĠService Loader . load ( Parts Provider :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġservice . java Class . packageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreflection s Ġ= ĠReflection s ( packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreflection s . getSub Types Of ( Mix :: class . java ). flatMap Ġ{ Ġmix Class Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmix K Class Ġ= Ġmix Class . kotlin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmix K Class . all Sup ert ypes . map Ġ{ Ġface Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . get Or Put ( face , Ġ{ Ġmutable ListOf () Ġ}). add ( mix K Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm . forEach Ġ{ Ġ(_, Ġimp s ) Ġ-> Ġimp s . sortBy Ġ{ Ġit . qualified Name Ġ} Ġ} ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġlist Ġof Ġknown Ġ[ Mix ] Ġsubclasses Ġthat Ġare Ġsub types Ġof Ġ[ face ]. ĠFor Ġa Ġpackage Ġto Ġbe Ċ Ġ* Ġincluded Ġin ĠJo y Ġdata Ġreflection , Ġit Ġmust Ġ[ provide ]( https :// docs . oracle . com / javase / tutorial / ext / basics / spi . html ) Ċ Ġ* Ġa Ġ[ Parts Provider ] Ġservice . ĠFor Ġa Ġgiven Ġ[ face ], Ġthis Ġfunction Ġalways Ġreturns Ġthe Ġsame Ġimp s Ċ Ġ* Ġin Ġthe Ġsame Ġorder . Ċ Ġ*/ Ċ fun Ġmix Imp s ( face : ĠK Type ): ĠList < K Class <* >> Ġ= Ġmix Imp s For Face [ face ] Ġ?: ĠlistOf () ĊĊ