package Ġcom . se an sh ub in . cond orc et . table . formatter Ċ Ċ class ĠDuration Format ( private Ġval Ġscales : ĠList < Scale >, Ġval Ġpadded : ĠBoolean ) Ġ{ ĊĠĠĠ Ġfun Ġparse ( s : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwhitespace Pattern Ġ= ĠRegex ("\\ s +") ĊĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġs . trim (). split ( whitespace Pattern ) ĊĠĠĠĠĠĠĠ Ġval Ġchunk ed Ġ= Ġparts . chunk ed ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġnumbers Ġ= Ġchunk ed . map (:: chunk To Number ) ĊĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġnumbers . sum () ĊĠĠĠĠĠĠĠ Ġreturn Ġsum ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġformat ( quantity : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Ġ= ĠBuilder ( quantity , Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġscales . fold ( initial , ĠComp anion :: append Segment ) ĊĠĠĠĠĠĠĠ Ġval Ġsegments Ġ= Ġif Ġ( padded ) Ġfilter Segments P added ( builder . segments ) Ġelse Ġfilter Segments ( builder . segments ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( segments . isEmpty ()) Ġsegment ToString ( builder . segments . first ()) ĊĠĠĠĠĠĠĠ Ġelse Ġsegments . map (:: segment ToString ). reversed (). join ToString (" Ġ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnormalize ( s : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquantity Ġ= Ġparse ( s ) ĊĠĠĠĠĠĠĠ Ġval Ġformatted Ġ= Ġformat ( quantity ) ĊĠĠĠĠĠĠĠ Ġreturn Ġformatted ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Segments ( segments : ĠList < Segment >): ĠList < Segment > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( segments . size Ġ== Ġ 1 ) Ġsegments ĊĠĠĠĠĠĠĠ Ġelse Ġsegments . filter Ġ{ Ġsegment Ġ-> Ġsegment . quantity Ġ!= Ġ 0 L Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Segments P added ( segments : ĠList < Segment >): ĠList < Segment > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( segments . size Ġ== Ġ 1 ) Ġsegments ĊĠĠĠĠĠĠĠ Ġelse Ġsegments . reversed (). drop While Ġ{ Ġsegment Ġ-> Ġsegment . quantity Ġ== Ġ 0 L Ġ}. reversed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsegment ToString ( segment : ĠSegment ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( padded ) Ġsegment . to P added String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsegment . toString () ĊĊĠĠĠ Ġprivate Ġfun Ġchunk To Number ( chunk : ĠList < String >): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . size Ġ== Ġ 1 Ġ-> Ġto Long ( chunk [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . size Ġ== Ġ 2 Ġ-> Ġscaled To Number ( to Long ( chunk [ 0 ]), Ġchunk [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Expected Ġ 1 Ġor Ġ 2 Ġparts , Ġgot Ġ${ chunk . size }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscaled To Number ( quantity : ĠLong , Ġscale Name : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġfrom Scale Name ( scale Name ) ĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġquantity ĊĠĠĠĠĠĠĠ Ġvar Ġscale Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( scale Ġ!= Ġscales [ scale Index ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ*= Ġscales [ scale Index ]. quantity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Index ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfrom Scale Name ( name : ĠString ): ĠScale Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġscales . find Ġ{ Ġit . matches ( name ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġscale Ġ?: Ġthrow ĠRuntimeException ( compose Scale NotFound Message ( name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompose Scale NotFound Message ( name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscales String Ġ= Ġscales . map Ġ{ Ġit . plural Ġ}. join ToString (", Ġ") ĊĠĠĠĠĠĠĠ Ġreturn Ġ"' $ name ' Ġdoes Ġnot Ġmatch Ġa Ġvalid Ġtime Ġunit Ġ($ scales String )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Long ( s : ĠString ): ĠLong Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġs . to Long () ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unable Ġto Ġconvert Ġ'$ s ' Ġto Ġa Ġnumber ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠScale ( val Ġquantity : ĠLong , Ġval Ġsingular : ĠString , Ġval Ġplural : ĠString , Ġval Ġpad Size : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġname ( x : ĠLong ): ĠString Ġ= Ġif Ġ( x Ġ== Ġ 1 L ) Ġsingular Ġelse Ġplural ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġpadded Name ( x : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmaxSize Ġ= Ġmax Of ( singular . length , Ġplural . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpadding Needed Ġ= ĠmaxSize Ġ- Ġname . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpadding Ġ= Ġ" Ġ". repeat ( padding Needed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname Ġ+ Ġpadding ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġmatches ( s : ĠString ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingular . equals ( s , Ġignore Case Ġ= Ġtrue ) Ġ|| Ġplural . equals ( s , Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnan ose cond Scale Ġ= ĠScale ( 1 0 0 0 , Ġ" nan ose cond ", Ġ" nan oseconds ", Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmicro second Scale Ġ= ĠScale ( 1 0 0 0 , Ġ" micro second ", Ġ" micro seconds ", Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmilli second Scale Ġ= ĠScale ( 1 0 0 0 , Ġ" milli second ", Ġ" milliseconds ", Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsecond Scale Ġ= ĠScale ( 6 0 , Ġ" second ", Ġ" seconds ", Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġminute Scale Ġ= ĠScale ( 6 0 , Ġ" minute ", Ġ" minutes ", Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhour Scale Ġ= ĠScale ( 2 4 , Ġ" hour ", Ġ" hours ", Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġday Scale Ġ= ĠScale ( Long . MAX _ VALUE , Ġ" day ", Ġ" days ", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmilli second Sca les Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmilli second Scale , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Scale , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminute Scale , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhour Scale , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday Scale ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnan ose cond Sca les Ġ= ĠlistOf ( nan ose cond Scale , Ġmicro second Scale ) Ġ+ Ġmilli second Sca les ĊĊĠĠĠĠĠĠĠ Ġprivate Ġdata Ġclass ĠSegment ( val Ġscale : ĠScale , Ġval Ġquantity : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ"$ quantity Ġ${ scale . name ( quantity )}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġto P added String (): ĠString Ġ= Ġ"${ pad ( quantity )} Ġ${ scale . padded Name ( quantity )}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġpad ( x : ĠLong ): ĠString Ġ= Ġpad ( x . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġpad ( s : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpadding Needed Ġ= Ġscale . pad Size Ġ- Ġs . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( padding Needed Ġ> Ġ 0 ) Ġ" Ġ". repeat ( scale . pad Size Ġ- Ġs . length ) Ġ+ Ġs Ġelse Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġdata Ġclass ĠBuilder ( val Ġremain Value : ĠLong , Ġval Ġsegments : ĠList < Segment >) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġappend Segment ( builder : ĠBuilder , Ġscale : ĠScale ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġbuilder . remain Value Ġ% Ġscale . quantity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremain Ġ= Ġbuilder . remain Value Ġ/ Ġscale . quantity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsegment Ġ= ĠSegment ( scale , Ġcurrent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuilder ( remain , Ġbuilder . segments Ġ+ Ġsegment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmilliseconds Ġ= ĠDuration Format ( milli second Sca les , Ġpadded Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġmilliseconds P added Ġ= ĠDuration Format ( milli second Sca les , Ġpadded Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġnan oseconds Ġ= ĠDuration Format ( nan ose cond Sca les , Ġpadded Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġnan oseconds P added Ġ= ĠDuration Format ( nan ose cond Sca les , Ġpadded Ġ= Ġtrue ) ĊĠĠĠ Ġ} Ċ } Ċ