package Ġnl . j ste ge . ad vent of code . a oc common . utils . extensions Ċ Ċ import Ġjava . time . Duration Ċ Ċ /** Ċ Ġ* ĠForm ats Ġa Ġ[ Duration ] Ġlike Ġ[ java . text . SimpleDateFormat ] Ġcan Ġformat Ġa Ġ[ java . util . Date ]. ĠAs Ġlike Ċ Ġ* ĠSimpleDateFormat , Ġa Ġ[ pattern ] Ġof Ġsymbols Ġcan Ġbe Ġgiven Ġto Ġbe Ġparsed Ġas Ġsegments Ġof Ġthis Ċ Ġ* Ġ[ Duration ]. ĠText Ġis Ġpossible Ġby Ġencaps ulating Ġit Ġin Ġsingle Ġquot ation Ġmarks Ġ( '), Ġwhen Ġa Ġquot ation Ċ Ġ* Ġmark Ġis Ġneeded Ġwithin Ġa Ġtext Ġsegment , Ġuse Ġtwo Ġsingle Ġquot ation Ġmarks Ġ(' '). ĠIf Ġyou Ġneed Ġa Ċ Ġ* Ġsemi - fixed Ġamount Ġof Ġdigits Ġ( overflow s Ġwill Ġoverflow , Ġn atur ally ), Ġit Ġis Ġpossible Ġto Ġadd Ġextra Ċ Ġ* Ġsymbols , Ġadd Ġthe Ġamount Ġof Ġneeded Ġdigits Ċ Ġ* Ċ Ġ* ĠPossible Ġsymbols Ġare : Ċ Ġ* Ġ- Ġd Ġfor Ġdays Ċ Ġ* Ġ- ĠH Ġfor Ġhours Ċ Ġ* Ġ- Ġm Ġfor Ġminutes Ċ Ġ* Ġ- Ġs Ġfor Ġseconds Ċ Ġ* Ġ- ĠS Ġfor Ġmilliseconds Ċ Ġ* Ċ Ġ* ĠBy Ġdefault , Ġ[ pattern ] Ġis Ġd : HH : mm : ss . ss , Ġnote Ġthat Ġonce Ġthere Ġare Ġmore Ġthan Ġ 1 0 Ġdays Ġin Ġthis Ċ Ġ* Ġduration , Ġthe Ġdays Ġwill Ġoverflow Ġand Ġuse Ġmore Ġdigits . Ċ Ġ*/ Ċ fun ĠDuration . format ( pattern : ĠString Ġ= Ġ" d : HH : mm : ss . SS S "): ĠString Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠ Ġvar Ġprevious Duration Ġ= Ġthis ĊĠĠĠ Ġvar Ġpattern Index Ġ= Ġ 0 ĊĊĠĠĠ Ġwhile Ġ( pattern Index Ġ< Ġpattern . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( segment , Ġsegment Length ) Ġ= Ġwhen Ġ( val Ġsymbol Ġ= Ġpattern [ pattern Index ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠP ATTERN _ SYMBOL S Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġof Unit : Ġ( Long ) Ġ-> ĠDuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Unit : Ġ( Duration ) Ġ-> ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Unit : Ġ( Duration , ĠLong ) Ġ-> ĠDuration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ= ĠP ATTERN _ SYMBOL S [ symbol ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( new Duration : ĠDuration , Ġduration Segment : ĠLong ) Ġ= Ġprevious Duration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Unit ( of Unit , Ġto Unit , Ġmin Unit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidentifier Length Ġ= Ġpattern ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop ( pattern Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġit Ġ== Ġsymbol Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. length ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Duration Ġ= Ġnew Duration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ("$ duration Segment ". pad Start ( identifier Length , Ġ' 0 '), Ġidentifier Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\'' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠTEXT _ REGEX . find ( pattern . drop ( pattern Index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Un terminated Ġquote ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġresult . group Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Text Ġ= Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Remove Ġsurrounding Ġquotes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring ( 1 , Ġtext . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Replace Ġdouble Ġquotes Ġwith Ġsingle Ġquote ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" '' ", Ġ"' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Use Ġtext . length Ġas Ġsegment Length Ġsince Ġwe Ġwant Ġto Ġmove Ġover Ġall Ġthe Ġextra ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// quotation Ġmarks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( parsed Text , Ġtext . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( symbol . toString (), Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . append ( segment ) ĊĠĠĠĠĠĠĠ Ġpattern Index Ġ+= Ġsegment Length ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġbuilder . toString () Ċ } Ċ Ċ /** Ċ Ġ* ĠExtract s Ġa Ġtime Ġunit Ġfrom Ġthis Ġduration Ġand Ġreturns Ġa Ġnew Ġ[ Duration ] Ġalong Ġwith Ġthe Ġextracted Ċ Ġ* Ġunit Ġas Ġa Ġlong . ĠNote Ġthat Ġthis Ġfunction Ġuses Ġfunctions Ġto Ġextract Ġa Ġcertain Ġtime Ġunit . Ċ Ġ* Ġ@ receiver ĠDuration ĠThe Ġduration Ġto Ġextract Ġa Ġtime Ġunit Ġfrom Ċ Ġ* Ġ@ param Ġof Unit Ġ( Long ) Ġ-> ĠDuration ĠA Ġfunction Ġwhich Ġreturns Ġa Ġduration Ġof Ġthe Ġgiven Ġlong . ĠThis Ġis Ċ Ġ* Ġused Ġto Ġdetermine Ġwhether Ġit Ġis Ġpossible Ġto Ġactually Ġextract Ġthe Ġgiven Ġtime Ġunit . Ċ Ġ* Ġ@ param Ġto Unit Ġ( Duration ) Ġ-> ĠLong ĠA Ġfunction Ġwhich Ġconverts Ġthe Ġ[ Duration ] Ġto Ġthe Ġgiven Ġtime Ġunit . Ċ Ġ* Ġ@ param Ġmin Unit Ġ( Duration , ĠLong ) Ġ-> ĠDuration ĠA Ġfunction Ġwhich Ġsub stract s Ġas Ġmuch Ġas Ġpossible Ġof Ċ Ġ* Ġthe Ġgiven Ġtime Ġunit Ġfrom Ġthe Ġ[ Duration ] Ġand Ġreturns Ġthe Ġnew Ġ[ Duration ]. Ċ Ġ* Ġ@ return ĠPair < Duration , ĠLong > ĠA Ġpair Ġof Ġthe Ġnew Ġ[ Duration ], Ġminus Ġthe Ġsub stract ed Ġtime Ġunits Ġand Ċ Ġ* Ġthe Ġamount Ġof Ġtime Ġunits Ġwhich Ġwere Ġpresent Ġin Ġthe Ġreceiver . Ċ Ġ*/ Ċ private Ġfun ĠDuration . extract Unit ( ĊĠĠĠ Ġof Unit : Ġ( Long ) Ġ-> ĠDuration , ĊĠĠĠ Ġto Unit : Ġ( Duration ) Ġ-> ĠLong , ĊĠĠĠ Ġmin Unit : Ġ( Duration , ĠLong ) Ġ-> ĠDuration Ċ ): ĠPair < Duration , ĠLong > Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ< Ġof Unit ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( this , Ġ 0 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġunit Ġ= Ġto Unit ( this ) ĊĠĠĠ Ġreturn ĠPair ( min Unit ( this , Ġunit ), Ġunit ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġsymbols Ġsupported Ġin Ġa Ġpattern Ġto Ġformat Ġa Ġ[ Duration ]. Ċ Ġ*/ Ċ private Ġval ĠP ATTERN _ SYMBOL S Ġ= ĊĠĠĠ Ġmap Of < Char , ĠTrip le <( Long ) Ġ-> ĠDuration , Ġ( Duration ) Ġ-> ĠLong , Ġ( Duration , ĠLong ) Ġ-> ĠDuration >>( ĊĠĠĠĠĠĠĠ Ġ' d ' Ġto ĠTrip le ( Duration :: of Days , ĠDuration :: to Days , ĠDuration :: minus Days ), ĊĠĠĠĠĠĠĠ Ġ' H ' Ġto ĠTrip le ( Duration :: of Hours , ĠDuration :: to Hours , ĠDuration :: minus Hours ), ĊĠĠĠĠĠĠĠ Ġ' m ' Ġto ĠTrip le ( Duration :: of Minutes , ĠDuration :: to Minutes , ĠDuration :: minus Minutes ), ĊĠĠĠĠĠĠĠ Ġ' s ' Ġto ĠTrip le ( Duration :: of Seconds , ĠDuration :: get Seconds , ĠDuration :: minus Seconds ), ĊĠĠĠĠĠĠĠ Ġ' S ' Ġto ĠTrip le ( Duration :: of Millis , ĠDuration :: to Millis , ĠDuration :: minus Millis ) ĊĠĠĠ Ġ) Ċ Ċ /** Ċ Ġ* ĠMat ches Ġa Ġtext Ġsegment Ġin Ġa Ġ[ Duration ] Ġformatting . Ċ Ġ*/ Ċ private Ġval ĠTEXT _ REGEX Ġ= Ġ""" ^( (' [^ '] * ') +) """. to Regex () Ċ