/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 4 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ @ file : kotlin . jvm . Jvm Name (" Comp arisons Kt ") Ċ Ċ package Ġkotlin Ċ Ċ import Ġjava . util . Comparator Ċ Ċ @ Deprecated (" Use Ġcompare Values By ", ĠReplace With (" compare Values By ( a , Ġb , Ġ* selectors )"), Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) Ċ public Ġfun Ġ< T > Ġcompare Values By Nullable ( a : ĠT , Ġb : ĠT , Ġvar arg Ġselectors : Ġ( T ) Ġ-> ĠComparable < *> ?): ĠInt Ġ= Ġcompare Values By ( a , Ġb , Ġ* selectors ) Ċ Ċ /** Ċ Ġ* ĠComp ares Ġtwo Ġvalues Ġusing Ġthe Ġspecified Ġfunctions Ġ[ selectors ] Ġto Ġcalculate Ġthe Ġresult Ġof Ġthe Ġcomparison . Ċ Ġ* ĠThe Ġfunctions Ġare Ġcalled Ġse quent ially , Ġreceive Ġthe Ġgiven Ġvalues Ġ[ a ] Ġand Ġ[ b ] Ġand Ġreturn Ġ[ Comparable ] Ċ Ġ* Ġobjects . ĠAs Ġsoon Ġas Ġthe Ġ[ Comparable ] Ġinstances Ġreturned Ġby Ġa Ġfunction Ġfor Ġ[ a ] Ġand Ġ[ b ] Ġvalues Ġdo Ġnot Ċ Ġ* Ġcompare Ġas Ġequal , Ġthe Ġresult Ġof Ġthat Ġcomparison Ġis Ġreturned . Ċ Ġ*/ Ċ public Ġfun Ġ< T > Ġcompare Values By ( a : ĠT , Ġb : ĠT , Ġvar arg Ġselectors : Ġ( T ) Ġ-> ĠComparable < *> ?): ĠInt Ġ{ ĊĠĠĠ Ġrequire ( selectors . size () Ġ> Ġ 0 ) ĊĠĠĠ Ġfor Ġ( fn Ġin Ġselectors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġfn ( a ) ĊĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġfn ( b ) ĊĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġcompare Values ( v 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( diff Ġ!= Ġ 0 ) Ġreturn Ġdiff ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ 0 Ċ } Ċ Ċ /** Ċ Ġ* ĠComp ares Ġtwo Ġvalues Ġusing Ġthe Ġspecified Ġ[ selector ] Ġfunction Ġto Ġcalculate Ġthe Ġresult Ġof Ġthe Ġcomparison . Ċ Ġ* ĠThe Ġfunction Ġis Ġapplied Ġto Ġthe Ġgiven Ġvalues Ġ[ a ] Ġand Ġ[ b ] Ġand Ġreturn Ġ[ Comparable ] Ġobjects . Ċ Ġ* ĠThe Ġresult Ġof Ġcomparison Ġof Ġthese Ġ[ Comparable ] Ġinstances Ġis Ġreturned . Ċ Ġ*/ Ċ public Ġinline Ġfun Ġ< T > Ġcompare Values By ( a : ĠT , Ġb : ĠT , Ġselector : Ġ( T ) Ġ-> ĠComparable < *> ?): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġcompare Values ( selector ( a ), Ġselector ( b )) Ċ } Ċ Ċ /** Ċ Ġ* ĠComp ares Ġtwo Ġvalues Ġusing Ġthe Ġspecified Ġ[ selector ] Ġfunction Ġto Ġcalculate Ġthe Ġresult Ġof Ġthe Ġcomparison . Ċ Ġ* ĠThe Ġfunction Ġis Ġapplied Ġto Ġthe Ġgiven Ġvalues Ġ[ a ] Ġand Ġ[ b ] Ġand Ġreturn Ġobjects Ġof Ġtype ĠK Ġwhich Ġare Ġthen Ġbeing Ċ Ġ* Ġcompared Ġwith Ġthe Ġgiven Ġ[ comparator ]. Ċ Ġ*/ Ċ public Ġinline Ġfun Ġ< T , ĠK > Ġcompare Values By ( a : ĠT , Ġb : ĠT , Ġcomparator : ĠComparator < in ĠK >, Ġselector : Ġ( T ) Ġ-> ĠK ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġcomparator . compare ( selector ( a ), Ġselector ( b )) Ċ } Ċ Ċ //// ĠNot Ġso Ġuseful Ġwithout Ġtype Ġinference Ġfor Ġreceiver Ġof Ġexpression Ċ //// Ġcompare Values With ( v 1 , Ġv 2 , Ġcompare By Ġ{ Ġit . prop 1 Ġ} Ġthen By Descending Ġ{ Ġit . prop 2 Ġ}) Ċ // /** Ċ // Ġ* ĠComp ares Ġtwo Ġvalues Ġusing Ġthe Ġspecified Ġ[ comparator ]. Ċ // Ġ*/ Ċ //@ Suppress (" NOTH ING _ TO _ INLINE ") Ċ // public Ġinline Ġfun Ġ< T > Ġcompare Values With ( a : ĠT , Ġb : ĠT , Ġcomparator : ĠComparator < T >): ĠInt Ġ= Ġcomparator . compare ( a , Ġb ) Ċ // ĊĊ Ċ /** Ċ Ġ* ĠComp ares Ġtwo Ġnullable Ġ[ Comparable ] Ġvalues . ĠNull Ġis Ġconsidered Ġless Ġthan Ġany Ġvalue . Ċ Ġ*/ Ċ public Ġfun Ġ< T Ġ: ĠComparable <* >> Ġcompare Values ( a : ĠT ?, Ġb : ĠT ?): ĠInt Ġ{ ĊĠĠĠ Ġif Ġ( a Ġ=== Ġb ) Ġreturn Ġ 0 ĊĠĠĠ Ġif Ġ( a Ġ== Ġnull ) Ġreturn Ġ- 1 ĊĠĠĠ Ġif Ġ( b Ġ== Ġnull ) Ġreturn Ġ 1 ĊĊĠĠĠ Ġreturn Ġ( a Ġas ĠComparable < Any >). compareTo ( b ) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġcomparator Ġusing Ġthe Ġsequence Ġof Ġfunctions Ġto Ġcalculate Ġa Ġresult Ġof Ġcomparison . Ċ Ġ* ĠThe Ġfunctions Ġare Ġcalled Ġse quent ially , Ġreceive Ġthe Ġgiven Ġvalues Ġ` a ` Ġand Ġ` b ` Ġand Ġreturn Ġ[ Comparable ] Ċ Ġ* Ġobjects . ĠAs Ġsoon Ġas Ġthe Ġ[ Comparable ] Ġinstances Ġreturned Ġby Ġa Ġfunction Ġfor Ġ` a ` Ġand Ġ` b ` Ġvalues Ġdo Ġnot Ċ Ġ* Ġcompare Ġas Ġequal , Ġthe Ġresult Ġof Ġthat Ġcomparison Ġis Ġreturned Ġfrom Ġthe Ġ[ Comparator ]. Ċ Ġ*/ Ċ public Ġfun Ġ< T > Ġcompare By ( var arg Ġselectors : Ġ( T ) Ġ-> ĠComparable < *> ?): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ= Ġcompare Values By ( a , Ġb , Ġ* selectors ) ĊĠĠĠ Ġ} Ċ } ĊĊĊ Ċ /** Ċ Ġ* ĠCreates Ġa Ġcomparator Ġusing Ġthe Ġfunction Ġto Ġtransform Ġvalue Ġto Ġa Ġ[ Comparable ] Ġinstance Ġfor Ġcomparison . Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T > Ġcompare By ( cross inline Ġselector : Ġ( T ) Ġ-> ĠComparable < *> ?): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ= Ġcompare Values By ( a , Ġb , Ġselector ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġcomparator Ġusing Ġthe Ġ[ selector ] Ġfunction Ġto Ġtransform Ġvalues Ġbeing Ġcompared Ġand Ġthen Ġapplying Ċ Ġ* Ġthe Ġspecified Ġ[ comparator ] Ġto Ġcompare Ġtransformed Ġvalues . Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T , ĠK > Ġcompare By ( comparator : ĠComparator < in ĠK >, Ġcross inline Ġselector : Ġ( T ) Ġ-> ĠK ): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ= Ġcompare Values By ( a , Ġb , Ġcomparator , Ġselector ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġdescending Ġcomparator Ġusing Ġthe Ġfunction Ġto Ġtransform Ġvalue Ġto Ġa Ġ[ Comparable ] Ġinstance Ġfor Ġcomparison . Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T > Ġcompare By Descending ( cross inline Ġselector : Ġ( T ) Ġ-> ĠComparable < *> ?): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ= Ġcompare Values By ( b , Ġa , Ġselector ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġdescending Ġcomparator Ġusing Ġthe Ġ[ selector ] Ġfunction Ġto Ġtransform Ġvalues Ġbeing Ġcompared Ġand Ġthen Ġapplying Ċ Ġ* Ġthe Ġspecified Ġ[ comparator ] Ġto Ġcompare Ġtransformed Ġvalues . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġan Ġorder Ġof Ġ[ comparator ] Ġis Ġreversed Ġby Ġthis Ġwrapper . Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T , ĠK > Ġcompare By Descending ( comparator : ĠComparator < in ĠK >, Ġcross inline Ġselector : Ġ( T ) Ġ-> ĠK ): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ= Ġcompare Values By ( b , Ġa , Ġcomparator , Ġselector ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġcomparator Ġcomparing Ġvalues Ġafter Ġthe Ġprimary Ġcomparator Ġdefined Ġthem Ġequal . ĠIt Ġuses Ċ Ġ* Ġthe Ġfunction Ġto Ġtransform Ġvalue Ġto Ġa Ġ[ Comparable ] Ġinstance Ġfor Ġcomparison . Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T > ĠComparator < T >. then By ( cross inline Ġselector : Ġ( T ) Ġ-> ĠComparable < *> ?): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Compare Ġ= Ġthis @ then By . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( previous Compare Ġ!= Ġ 0 ) Ġprevious Compare Ġelse Ġcompare Values By ( a , Ġb , Ġselector ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġcomparator Ġcomparing Ġvalues Ġafter Ġthe Ġprimary Ġcomparator Ġdefined Ġthem Ġequal . ĠIt Ġuses Ċ Ġ* Ġthe Ġ[ selector ] Ġfunction Ġto Ġtransform Ġvalues Ġand Ġthen Ġcomp ares Ġthem Ġwith Ġthe Ġgiven Ġ[ comparator ]. Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T , ĠK > ĠComparator < T >. then By ( comparator : ĠComparator < in ĠK >, Ġcross inline Ġselector : Ġ( T ) Ġ-> ĠK ): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Compare Ġ= Ġthis @ then By . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( previous Compare Ġ!= Ġ 0 ) Ġprevious Compare Ġelse Ġcompare Values By ( a , Ġb , Ġcomparator , Ġselector ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġdescending Ġcomparator Ġusing Ġthe Ġprimary Ġcomparator Ġand Ċ Ġ* Ġthe Ġfunction Ġto Ġtransform Ġvalue Ġto Ġa Ġ[ Comparable ] Ġinstance Ġfor Ġcomparison . Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T > ĠComparator < T >. then By Descending ( cross inline Ġselector : Ġ( T ) Ġ-> ĠComparable < *> ?): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Compare Ġ= Ġthis @ then By Descending . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( previous Compare Ġ!= Ġ 0 ) Ġprevious Compare Ġelse Ġcompare Values By ( b , Ġa , Ġselector ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġdescending Ġcomparator Ġcomparing Ġvalues Ġafter Ġthe Ġprimary Ġcomparator Ġdefined Ġthem Ġequal . ĠIt Ġuses Ċ Ġ* Ġthe Ġ[ selector ] Ġfunction Ġto Ġtransform Ġvalues Ġand Ġthen Ġcomp ares Ġthem Ġwith Ġthe Ġgiven Ġ[ comparator ]. Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T , ĠK > ĠComparator < T >. then By Descending ( comparator : ĠComparator < in ĠK >, Ġcross inline Ġselector : Ġ( T ) Ġ-> ĠK ): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Compare Ġ= Ġthis @ then By Descending . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( previous Compare Ġ!= Ġ 0 ) Ġprevious Compare Ġelse Ġcompare Values By ( b , Ġa , Ġcomparator , Ġselector ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠCreates Ġa Ġcomparator Ġusing Ġthe Ġfunction Ġto Ġcalculate Ġa Ġresult Ġof Ġcomparison . Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T > Ġcomparator ( cross inline Ġcomparison : Ġ( T , ĠT ) Ġ-> ĠInt ): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ= Ġcomparison ( a , Ġb ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġcomparator Ġusing Ġthe Ġprimary Ġcomparator Ġand Ġfunction Ġto Ġcalculate Ġa Ġresult Ġof Ġcomparison . Ċ Ġ*/ Ċ inline Ġpublic Ġfun Ġ< T > ĠComparator < T >. then Comparator ( cross inline Ġcomparison : Ġ( T , ĠT ) Ġ-> ĠInt ): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Compare Ġ= Ġthis @ then Comparator . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( previous Compare Ġ!= Ġ 0 ) Ġprevious Compare Ġelse Ġcomparison ( a , Ġb ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCombin es Ġthis Ġcomparator Ġand Ġthe Ġgiven Ġ[ comparator ] Ġsuch Ġthat Ġthe Ġlatter Ġis Ġapplied Ġonly Ċ Ġ* Ġwhen Ġthe Ġformer Ġconsidered Ġvalues Ġequal . Ċ Ġ*/ Ċ public Ġfun Ġ< T > ĠComparator < T >. then ( comparator : ĠComparator < in ĠT >): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Compare Ġ= Ġthis @ then . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( previous Compare Ġ!= Ġ 0 ) Ġprevious Compare Ġelse Ġcomparator . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCombin es Ġthis Ġcomparator Ġand Ġthe Ġgiven Ġ[ comparator ] Ġsuch Ġthat Ġthe Ġlatter Ġis Ġapplied Ġonly Ċ Ġ* Ġwhen Ġthe Ġformer Ġconsidered Ġvalues Ġequal . Ċ Ġ*/ Ċ public Ġfun Ġ< T > ĠComparator < T >. then Descending ( comparator : ĠComparator < in ĠT >): ĠComparator < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠComparator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Compare Ġ= Ġthis @ then Descending . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( previous Compare Ġ!= Ġ 0 ) Ġprevious Compare Ġelse Ġcomparator . compare ( b , Ġa ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠNot Ġso Ġuseful Ġwithout Ġtype Ġinference Ġfor Ġreceiver Ġof Ġexpression Ċ /** Ċ Ġ* ĠExt ends Ġthe Ġgiven Ġ[ comparator ] Ġof Ġnon - nullable Ġvalues Ġto Ġa Ġcomparator Ġof Ġnullable Ġvalues Ċ Ġ* Ġconsidering Ġ` null ` Ġvalue Ġless Ġthan Ġany Ġother Ġvalue . Ċ Ġ*/ Ċ public Ġfun Ġ< T : ĠAny > Ġnull s First ( comparator : ĠComparator < in ĠT >): ĠComparator < T ?> Ġ{ ĊĠĠĠ Ġreturn Ġobject : ĠComparator < T ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( a : ĠT ?, Ġb : ĠT ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġ=== Ġb ) Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġ== Ġnull ) Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b Ġ== Ġnull ) Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomparator . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠProvides Ġa Ġcomparator Ġof Ġnullable Ġ[ Comparable ] Ġvalues Ċ Ġ* Ġconsidering Ġ` null ` Ġvalue Ġless Ġthan Ġany Ġother Ġvalue . Ċ Ġ*/ Ċ public Ġfun Ġ< T : ĠComparable < T >> Ġnull s First (): ĠComparator < T ?> Ġ= Ġnull s First ( natural Order ()) Ċ Ċ /** Ċ Ġ* ĠExt ends Ġthe Ġgiven Ġ[ comparator ] Ġof Ġnon - nullable Ġvalues Ġto Ġa Ġcomparator Ġof Ġnullable Ġvalues Ċ Ġ* Ġconsidering Ġ` null ` Ġvalue Ġgreater Ġthan Ġany Ġother Ġvalue . Ċ Ġ*/ Ċ public Ġfun Ġ< T : ĠAny > Ġnull s Last ( comparator : ĠComparator < in ĠT >): ĠComparator < T ?> Ġ{ ĊĠĠĠ Ġreturn Ġobject : ĠComparator < T ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( a : ĠT ?, Ġb : ĠT ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġ=== Ġb ) Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġ== Ġnull ) Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b Ġ== Ġnull ) Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomparator . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠProvides Ġa Ġcomparator Ġof Ġnullable Ġ[ Comparable ] Ġvalues Ċ Ġ* Ġconsidering Ġ` null ` Ġvalue Ġgreater Ġthan Ġany Ġother Ġvalue . Ċ Ġ*/ Ċ public Ġfun Ġ< T : ĠComparable < T >> Ġnull s Last (): ĠComparator < T ?> Ġ= Ġnull s Last ( natural Order ()) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġcomparator Ġthat Ġcomp ares Ġ[ Comparable ] Ġobjects Ġin Ġnatural Ġorder . Ċ Ġ*/ Ċ public Ġfun Ġ< T : ĠComparable < T >> Ġnatural Order (): ĠComparator < T > Ġ= ĠNatural Order Comparator Ġas ĠComparator < T > Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġcomparator Ġthat Ġcomp ares Ġ[ Comparable ] Ġobjects Ġin Ġreversed Ġnatural Ġorder . Ċ Ġ*/ Ċ public Ġfun Ġ< T : ĠComparable < T >> Ġreverse Order (): ĠComparator < T > Ġ= ĠReverse Order Comparator Ġas ĠComparator < T > Ċ Ċ /** ĠReturns Ġa Ġcomparator Ġthat Ġimp o ses Ġthe Ġreverse Ġordering Ġof Ġthis Ġcomparator . Ġ*/ Ċ public Ġfun Ġ< T > ĠComparator < T >. reversed (): ĠComparator < T > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠRe versed Comparator Ġ-> Ġthis . comparator ĊĠĠĠ ĠNatural Order Comparator Ġ-> ĠReverse Order Comparator Ġas ĠComparator < T > ĊĠĠĠ ĠReverse Order Comparator Ġ-> ĠNatural Order Comparator Ġas ĠComparator < T > ĊĠĠĠ Ġelse Ġ-> ĠRe versed Comparator ( this ) Ċ } ĊĊ Ċ private Ġclass ĠRe versed Comparator < T >( public Ġval Ġcomparator : ĠComparator < T >): ĠComparator < T > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcompare ( a : ĠT , Ġb : ĠT ): ĠInt Ġ= Ġcomparator . compare ( b , Ġa ) ĊĠĠĠ Ġ@ Suppress (" VIRTUAL _ MEMBER _ HIDDEN ") ĊĠĠĠ Ġfun Ġreversed (): ĠComparator < T > Ġ= Ġcomparator Ċ } Ċ Ċ private Ġobject ĠNatural Order Comparator Ġ: ĠComparator < Comparable < Any >> Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcompare ( c 1 : ĠComparable < Any >, Ġc 2 : ĠComparable < Any >): ĠInt Ġ= Ġc 1 . compareTo ( c 2 ) ĊĠĠĠ Ġ@ Suppress (" VIRTUAL _ MEMBER _ HIDDEN ") ĊĠĠĠ Ġfun Ġreversed (): ĠComparator < Comparable < Any >> Ġ= ĠReverse Order Comparator Ċ } Ċ Ċ private Ġobject ĠReverse Order Comparator : ĠComparator < Comparable < Any >> Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcompare ( c 1 : ĠComparable < Any >, Ġc 2 : ĠComparable < Any >): ĠInt Ġ= Ġc 2 . compareTo ( c 1 ) ĊĠĠĠ Ġ@ Suppress (" VIRTUAL _ MEMBER _ HIDDEN ") ĊĠĠĠ Ġfun Ġreversed (): ĠComparator < Comparable < Any >> Ġ= ĠNatural Order Comparator Ċ } Ċ