package Ġorg . random cat . util Ċ Ċ import Ġkotlinx . collections . immutable . Immutable Map Ċ import Ġkotlinx . collections . immutable . to Immutable Map Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġ[ Array ] Ġcontaining Ġthe Ġenum Ġconstants Ġof Ġ[ E ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠE Ġthe Ġenum Ġfor Ġwhich Ġto Ġretrieve Ġthe Ġconstants Ċ Ġ* Ġ@ param Ġenum Class Ġthe Ġre ified Ġ[ Class ] Ġof Ġ[ E ] Ċ Ġ*/ Ċ fun Ġ< E Ġ: ĠEnum < E >> Ġenum Values Of ( enum Class : ĠK Class < E >): ĠArray < E > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġenum Class . java . enum Constants Ġ?: Ġnull ĊĊĠĠĠ Ġcheck ( result Ġ!= Ġnull ) ĊĠĠĠ Ġcheck ( result . none Ġ{ Ġit Ġ== Ġnull Ġ}) ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġ` true ` Ġif Ġthis Ġcollection Ġcontains Ġall Ġenum Ġconstants Ġof Ġ[ E ], Ġand Ġfalse Ġotherwise . Ċ Ġ* Ċ Ġ* Ġ@ param ĠE Ġthe Ġenum Ġtype Ċ Ġ* Ġ@ param Ġenum Class Ġthe Ġre ified Ġ[ Class ] Ġof Ġ[ E ] Ċ Ġ*/ Ċ fun Ġ< E Ġ: ĠEnum < E >> ĠCollection < E >. is Ex haustive ( enum Class : ĠK Class < E >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġenum Constants Ġ= Ġenum Values Of ( enum Class ). asList () ĊĊĠĠĠ Ġval Ġcollection Ġ= Ġthis ĊĠĠĠ Ġreturn Ġcollection . contains All ( enum Constants ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġ` true ` Ġif Ġthis Ġcollection Ġcontains Ġall Ġenum Ġconstants Ġof Ġ[ E ], Ġand Ġfalse Ġotherwise . Ċ Ġ* Ċ Ġ* Ġ@ param ĠE Ġthe Ġenum Ġtype Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠE Ġ: ĠEnum < E >> ĠCollection < E >. is Ex haustive (): ĠBoolean Ġ= Ġis Ex haustive ( E :: class ) Ċ Ċ /** Ċ Ġ* ĠThrows Ġ[ IllegalArgumentException ] Ġif Ġthis Ġ[ Collection ] Ġdoes Ġnot Ġcontain Ġall Ġenum Ġconstants Ġof Ġ[ E ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠE Ġthe Ġenum Ġtype Ċ Ġ* Ġ@ param Ġenum Class Ġthe Ġre ified Ġ[ Class ] Ġof Ġ[ E ] Ċ Ġ*/ Ċ fun Ġ< E Ġ: ĠEnum < E >> ĠCollection < E >. require Ex haustive ( enum Class : ĠK Class < E >) Ġ{ ĊĠĠĠ Ġval Ġenum Constants Ġ= Ġenum Values Of ( enum Class ) ĊĊĠĠĠ Ġfor Ġ( value Ġin Ġenum Constants ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( this . contains ( value )) Ġ{ Ġ" Collection Ġwas Ġrequired Ġto Ġbe Ġex haustive , Ġbut Ġdid Ġnot Ġcontain Ġ$ value " Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThrows Ġ[ IllegalArgumentException ] Ġif Ġthis Ġ[ Collection ] Ġdoes Ġnot Ġcontain Ġall Ġenum Ġconstants Ġof Ġ[ E ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠE Ġthe Ġenum Ġtype Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠE Ġ: ĠEnum < E >> ĠCollection < E >. require Ex haustive () Ġ= Ġrequire Ex haustive ( E :: class ) Ċ Ċ /** Ċ Ġ* ĠA Ġmap Ġthat , Ġas Ġan Ġinvariant , Ġhas Ġone Ġentry Ġfor Ġeach Ġenumerator Ġof Ġ[ K ]. Ċ Ġ*/ Ċ interface ĠEx haustive Enum Map < K Ġ: ĠEnum < K >, ĠV > Ġ: ĠMap < K , ĠV > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġvalue Ġcorresponding Ġto Ġthe Ġgiven Ġ[ key ]. ĠDoes Ġnot Ġreturn Ġ` null ` Ġas Ġa Ġdefault Ġvalue , Ġbecause Ġthis Ġmap ĊĠĠĠĠ Ġ* Ġhas Ġa Ġvalue Ġfor Ġeach Ġkey Ġas Ġan Ġinvariant . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget ( key : ĠK ): ĠV Ċ } Ċ Ċ private Ġclass ĠEx haustive Enum Map Impl < K Ġ: ĠEnum < K >, ĠV > Ċ private Ġconstructor ( private Ġval Ġimpl : ĠImmutableMap < K , ĠV >) Ġ: ĠEx haustive Enum Map < K , ĠV >, ĠMap < K , ĠV > Ġby Ġimpl Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< K Ġ: ĠEnum < K >, ĠV > Ġfrom ( enum Class : ĠK Class < K >, Ġmap : ĠMap < K , ĠV >): ĠEx haustive Enum Map Impl < K , ĠV > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . keys . require Ex haustive ( enum Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEx haustive Enum Map Impl ( map . to Immutable Map ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠK Ġ: ĠEnum < K >, ĠV > Ġfrom ( map : ĠMap < K , ĠV >) Ġ= Ġfrom ( K :: class , Ġmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( key : ĠK ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( impl . containsKey ( key )) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġimpl [ key ] Ġas ĠV ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimpl . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠBecause Ġof Ġthe ĠMap Ġcontract , Ġwe Ġonly Ġcare Ġif Ġthe Ġother Ġis Ġa Ġmap , Ġnot Ġan ĠEx haustive Enum Map . ĠThis Ġmeans Ġthat Ġwe ĊĠĠĠĠĠĠĠ Ġ// Ġcan Ġjust Ġtrust Ġthe Ġimplementation . ĠIf Ġthe Ġuse Ġpasses Ġus Ġa Ġbad Ġmap , Ġthey Ġde serve Ġwhat Ġthey Ġget . ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Replace Call With Binary Operator ") Ġ// Ġusing Ġan Ġexplicit Ġequals Ġis Ġmore Ġclear Ġabout Ġforwarding ĊĠĠĠĠĠĠĠ Ġreturn Ġimpl . equals ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimpl . hashCode () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġ[ Ex haustive Enum Map ] Ġthat Ġcontains Ġthe Ġsame Ġkeys Ġand Ġvalues Ġas Ġthis Ġmap . ĠThrows Ġ[ IllegalArgumentException ] Ċ Ġ* Ġif Ġthis Ġmap 's Ġkeys Ġdo Ġnot Ġinclude Ġall Ġof Ġthe Ġenum erators Ġof Ġ[ K ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠK Ġthe Ġkey Ġtype Ġof Ġthe Ġmap , Ġwhich Ġmust Ġbe Ġan Ġenum Ġtype Ċ Ġ* Ġ@ param ĠV Ġthe Ġvalue Ġtype Ġof Ġthe Ġmap Ċ Ġ* Ġ@ param Ġenum Class Ġthe Ġre ified Ġtype Ġof Ġ[ K ] Ċ Ġ*/ Ċ fun Ġ< K Ġ: ĠEnum < K >, ĠV > ĠMap < K , ĠV >. to Ex haustive Enum Map ( enum Class : ĠK Class < K >): ĠEx haustive Enum Map < K , ĠV > Ġ{ ĊĠĠĠ Ġreturn ĠEx haustive Enum Map Impl . from ( enum Class , Ġthis ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġ[ Ex haustive Enum Map ] Ġthat Ġcontains Ġthe Ġsame Ġkeys Ġand Ġvalues Ġas Ġthis Ġmap . ĠThrows Ġ[ IllegalArgumentException ] Ċ Ġ* Ġif Ġthis Ġmap 's Ġkeys Ġdo Ġnot Ġinclude Ġall Ġof Ġthe Ġenum erators Ġof Ġ[ K ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠK Ġthe Ġkey Ġtype Ġof Ġthe Ġmap , Ġwhich Ġmust Ġbe Ġan Ġenum Ġtype Ċ Ġ* Ġ@ param ĠV Ġthe Ġvalue Ġtype Ġof Ġthe Ġmap Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠK Ġ: ĠEnum < K >, ĠV > ĠMap < K , ĠV >. to Ex haustive Enum Map () Ġ= Ġto Ex haustive Enum Map ( K :: class ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġ[ Ex haustive Enum Map ] Ġthat Ġcontains Ġthe Ġkey - value Ġpairs Ġfrom Ġthis Ġiterable . ĠThrows Ċ Ġ* Ġ[ IllegalArgumentException ] Ġif Ġthe Ġkeys Ġdo Ġnot Ġinclude Ġall Ġof Ġthe Ġenum erators Ġof Ġ[ K ] Ġexactly Ġonce . Ċ Ġ* Ċ Ġ* Ġ@ param ĠK Ġthe Ġkey Ġtype Ġof Ġthe Ġmap , Ġwhich Ġmust Ġbe Ġan Ġenum Ġtype Ċ Ġ* Ġ@ param ĠV Ġthe Ġvalue Ġtype Ġof Ġthe Ġmap Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠK Ġ: ĠEnum < K >, ĠV > ĠIterable < Pair < K , ĠV >> . to Ex haustive Enum Map (): ĠEx haustive Enum Map < K , ĠV > Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġthis . toList () ĊĠĠĠ Ġlist . require Distinct By Ġ{ Ġit . first Ġ} ĊĠĠĠ Ġreturn Ġlist . toMap (). to Ex haustive Enum Map () Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġ[ Ex haustive Enum Map ] Ġthat Ġcontains Ġthe Ġkey - value Ġpairs Ġfrom Ġthe Ġarray Ġ[ pairs ]. ĠThrows Ċ Ġ* Ġ[ IllegalArgumentException ] Ġif Ġthe Ġkeys Ġdo Ġnot Ġinclude Ġall Ġof Ġthe Ġenum erators Ġof Ġ[ K ] Ġexactly Ġonce . Ċ Ġ* Ċ Ġ* Ġ@ param ĠK Ġthe Ġkey Ġtype Ġof Ġthe Ġmap , Ġwhich Ġmust Ġbe Ġan Ġenum Ġtype Ċ Ġ* Ġ@ param ĠV Ġthe Ġvalue Ġtype Ġof Ġthe Ġmap Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠK Ġ: ĠEnum < K >, ĠV > Ġex haustive Enum Map Of ( var arg Ġpairs : ĠPair < K , ĠV >) Ġ= Ġpairs . asList (). to Ex haustive Enum Map () Ċ