package Ġcom . github . mp e 8 5 . gr amp a . input Ċ Ċ import Ġjava . util . Navig able Map Ċ import Ġjava . util . TreeMap Ċ import Ġkotlin . streams . as Sequence Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Line Counter ] Ġimplementation Ġfor Ġ[ CharSequence ] s . Ċ Ġ* Ċ Ġ* Ġ@ author Ġmp e 8 5 Ċ Ġ* Ġ@ property [ input ] ĠThe Ġinput Ġin Ġwhich Ġthe Ġlines Ġare Ġcounted Ċ Ġ*/ Ċ public Ġclass ĠCharSequence Line Counter ( private Ġval Ġinput : ĠCharSequence ) Ġ: ĠLine Counter Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġline Count : ĠInt Ġget () Ġ= Ġlines . size ĊĠĠĠ Ġprivate Ġval Ġlines Ġ= Ġget Lines ( input ) ĊĊĠĠĠ Ġprivate Ġfun Ġget Lines ( input : ĠCharSequence ): ĠNavig able Map < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠTreeMap < Int , ĠInt >() ĊĠĠĠĠĠĠĠ Ġvar Ġline Start Idx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar ĠlineNumber Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġinput . chars (). as Sequence (). forEach Indexed Ġ{ Ġindex , Ġch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ch Ġ== ĠL F ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ line Start Idx ] Ġ= Ġ++ line Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Start Idx Ġ= Ġindex Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( index Ġ== Ġinput . length Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ line Start Idx ] Ġ= Ġ++ line Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Position ( index : ĠInt ): ĠInput Position Ġ= Ġif Ġ( index Ġ== Ġ 0 Ġ&& Ġinput . isEmpty ()) ĊĠĠĠĠĠĠĠ ĠInput Position ( 0 , Ġ 0 ) ĊĠĠĠ Ġelse Ġlines . floor Entry ( check Bounds ( index )). let Ġ{ ĊĠĠĠĠĠĠĠ ĠInput Position ( it . value , Ġindex Ġ- Ġit . key Ġ+ Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Bounds ( index : ĠInt ) Ġ= Ġindex . also Ġ{ Ġinput [ it ] Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠL F : ĠInt Ġ= Ġ'\ n '. code ĊĠĠĠ Ġ} Ċ } Ċ