// Ġ ĠCopyright Ġ 2 0 2 0 ĠChristian ĠSch mit z Ċ // Ġ ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ċ package Ġxyz . ty nn . semver Ċ Ċ import Ġkotlin . math . sign Ċ Ċ private Ġfun ĠString . throw Invalid Sem Ver (): ĠNothing Ġ= ĊĠĠĠ Ġthrow ĠIllegalArgumentException (" invalid Ġsemantic Ġversion Ġ'$ this '") Ċ Ċ /** Ċ Ġ* ĠParses Ġa Ġstring Ġas Ġa Ġsemantic Ġversion Ġor Ġthrows Ġan Ġ[ IllegalArgumentException ] Ċ Ġ*/ Ċ fun ĠString . to Sem Ver () Ġ= Ġsem Ver Pattern . match Ent ire ( this )?. run Ġ{ ĊĠĠĠ Ġval Ġ(_, Ġmajor , Ġminor , Ġpatch ) Ġ= Ġgroup Values ĊĠĠĠ ĠSem Ver ( ĊĠĠĠĠĠĠĠ Ġmajor . to Long (), ĊĠĠĠĠĠĠĠ Ġminor . to Long (), ĊĠĠĠĠĠĠĠ Ġpatch . to Long (), ĊĠĠĠĠĠĠĠ Ġgroup Values . get OrNull ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take Unless ( String :: isEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . split (".") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġempty List (), ĊĠĠĠĠĠĠĠ Ġgroup Values . get OrNull ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take Unless ( String :: isEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . split (".") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġempty List (), ĊĠĠĠ Ġ) Ċ } Ġ?: Ġthrow Invalid Sem Ver () Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġrepresents Ġa Ġ[ semantic Ġversion ]( https :// semver . org ) Ċ Ġ* Ġin Ġthe Ġform Ġ[ major ].[ minor ].[ patch ]- [ pre Release ]+ [ build ]` Ċ Ġ* Ċ Ġ* Ġ** Note **: Ġthis Ġclass Ġhas Ġa Ġnatural Ġordering Ġthat Ġis Ġinconsistent Ġwith Ġequals . Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġ 1 . 2 . 3 + a Ġ<= Ġ 1 . 2 . 3 + b Ġ== Ġtrue Ċ Ġ* Ġ 1 . 2 . 3 + a Ġ>= Ġ 1 . 2 . 3 + b Ġ== Ġtrue Ċ Ġ* Ġ 1 . 2 . 3 + a Ġ== Ġ 1 . 2 . 3 + b Ġ== Ġfalse Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ@ constructor Ġvalidates Ġthe Ġversion Ġor Ġthrows Ġan Ġ[ IllegalArgumentException ] Ċ Ġ*/ Ċ class ĠSem Ver ( ĊĠĠĠ Ġval Ġmajor : ĠLong , ĊĠĠĠ Ġval Ġminor : ĠLong , ĊĠĠĠ Ġval Ġpatch : ĠLong , ĊĠĠĠ Ġval Ġpre Release : ĠList < String > Ġ= Ġempty List (), ĊĠĠĠ Ġval Ġbuild : ĠList < String > Ġ= Ġempty List (), Ċ ) Ġ: ĠComparable < Sem Ver > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġversion String Ġ= Ġ"$ major .$ minor .$ patch ${ ĊĠĠĠĠĠĠĠ Ġ"- ". join ( pre Release ) ĊĠĠĠ Ġ} ${ ĊĠĠĠĠĠĠĠ Ġ"+ ". join ( build ) ĊĠĠĠ Ġ}" ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsem Ver Pattern Ġmatches Ġversion String Ġ|| Ġversion String . throw Invalid Sem Ver () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpre Release Segment Ġ= Ġpre Release . map Ġ{ ĊĠĠĠĠĠĠĠ Ġnumeric P atter Ġmatches Ġit Ġto Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġ[ major ] Ġversion Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġcomponent 1 () Ġ= Ġmajor ĊĠĠĠ Ġ/** ĠThe Ġ[ minor ] Ġversion Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġcomponent 2 () Ġ= Ġminor ĊĠĠĠ Ġ/** ĠThe Ġ[ patch ] Ġversion Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġcomponent 3 () Ġ= Ġpatch ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġversion String ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠSem Ver ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġdiff Ġ= Ġmajor Ġ- Ġother . major ĊĠĠĠĠĠĠĠ Ġif Ġ( diff Ġ!= Ġ 0 L ) Ġreturn Ġdiff . sign ĊĠĠĠĠĠĠĠ Ġdiff Ġ= Ġminor Ġ- Ġother . minor ĊĠĠĠĠĠĠĠ Ġif Ġ( diff Ġ!= Ġ 0 L ) Ġreturn Ġdiff . sign ĊĠĠĠĠĠĠĠ Ġdiff Ġ= Ġpatch Ġ- Ġother . patch ĊĠĠĠĠĠĠĠ Ġif Ġ( diff Ġ!= Ġ 0 L ) Ġreturn Ġdiff . sign ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Release . isEmpty () Ġ&& Ġother . pre Release . isEmpty () Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Release . isEmpty () Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . pre Release . isEmpty () Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcompare Pre Release Segments ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Release Segment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . pre Release Segment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠSem Ver ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( major Ġ!= Ġother . major ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( minor Ġ!= Ġother . minor ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( patch Ġ!= Ġother . patch ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( pre Release Ġ!= Ġother . pre Release ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( build Ġ!= Ġother . build ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġmajor . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 4 3 Ġ* Ġresult Ġ+ Ġminor . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 4 3 Ġ* Ġresult Ġ+ Ġpatch . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 4 3 Ġ* Ġresult Ġ+ Ġpre Release . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 4 3 Ġ* Ġresult Ġ+ Ġbuild . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġcompare Pre Release Segments ( ĊĠĠĠĠĠĠĠ Ġi : ĠInt , ĊĠĠĠĠĠĠĠ Ġleft : ĠList < Pair < Boolean , ĠString >>, ĊĠĠĠĠĠĠĠ Ġright : ĠList < Pair < Boolean , ĠString >> ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Item Ġ= Ġleft . get OrNull ( i ) ĊĠĠĠĠĠĠĠ Ġval Ġright Item Ġ= Ġright . get OrNull ( i ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Item Ġ== Ġnull Ġ&& Ġright Item Ġ== Ġnull Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Item Ġ== Ġnull Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Item Ġ== Ġnull Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Item . first Ġ&& Ġ! right Item . first Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! left Item . first Ġ&& Ġright Item . first Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcompare Pre Release Segment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Item . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Item . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Item . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). take Unless Ġ{ Ġit Ġ== Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġcompare Pre Release Segments ( i Ġ+ Ġ 1 , Ġleft , Ġright ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompare Pre Release Segment ( ĊĠĠĠĠĠĠĠ Ġleft : ĠString , ĊĠĠĠĠĠĠĠ Ġright : ĠString , ĊĠĠĠĠĠĠĠ Ġis Numeric : ĠBoolean ĊĠĠĠ Ġ): ĠInt Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ! is Numeric Ġ-> Ġleft . compareTo ( right ) ĊĠĠĠĠĠĠĠ Ġleft . length Ġ!= Ġright . length Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( left . length Ġ- Ġright . length ). sign ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcompare Pre Release Segment ( left , Ġright , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . join ( ĊĠĠĠĠĠĠĠ Ġsegments : ĠList < String > ĊĠĠĠ Ġ) Ġ= Ġsegments . take Unless Ġ{ ĊĠĠĠĠĠĠĠ Ġit . isEmpty () ĊĠĠĠ Ġ} ?. join ToString ( ĊĠĠĠĠĠĠĠ Ġseparator Ġ= Ġ".", ĊĠĠĠĠĠĠĠ Ġprefix Ġ= Ġthis ĊĠĠĠ Ġ) Ġ?: Ġ"" Ċ } Ċ Ċ // Ġhttps :// regex 1 0 1 . com / r / vk ij Kf / 1 / Ċ private Ġval Ġsem Ver Pattern Ġ= ĊĠĠĠ Ġ"^ ( 0 |[ 1 - 9 ]\\ d *) \\ .( 0 |[ 1 - 9 ]\\ d *) \\ .( 0 |[ 1 - 9 ]\\ d *)( ?: - (( ?: 0 |[ 1 - 9 ]\\ d * | \\ d *[ a - zA - Z - ][ 0 - 9 a - zA - Z - ]* )( ?: \\ .( ?: 0 |[ 1 - 9 ]\\ d * | \\ d *[ a - zA - Z - ][ 0 - 9 a - zA - Z - ]* ))* )) ?( ?: \\ + ([ 0 - 9 a - zA - Z - ]+ (?: \\ .[ 0 - 9 a - zA - Z - ]+ )* )) ?\ $" ĊĠĠĠĠĠĠĠ Ġ. to Regex () Ċ private Ġval Ġnumeric P atter Ġ= Ġ"\\ d +". to Regex () Ċ