package Ġorg . jetbrains . bio . io Ċ Ċ import Ġcom . google . common . base . Char Matcher Ċ import Ġcom . google . common . collect . Iter ators Ċ import Ġcom . google . common . collect . Peek ing Iterator Ċ import Ġcom . google . common . collect . Un modifiable Iterator Ċ import Ġorg . jetbrains . bio . genome . Gen ome Ċ import Ġorg . jetbrains . bio . util . buffered Reader Ċ import Ġorg . jetbrains . bio . util . buffered Writer Ċ import Ġjava . io . Buffered Writer Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util .* Ċ import Ġjava . util . stream . Stream Ċ import Ġjava . util . stream . Stream Support Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġreader Ġfor ĠFAST A Ġfiles . Ċ Ġ* Ċ Ġ* ĠSee Ġhttp :// en . wikipedia . org / wiki / FAST A _ format . Ċ Ġ* Ċ Ġ* Ġ@ author ĠSer ge i ĠLe be dev Ċ Ġ*/ Ċ class ĠFast a Reader ( val Ġread Sequence : ĠBoolean ) Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġread ( it : ĠP eek ing Iterator < String >): ĠUn modifiable Iterator < Fast a Record > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠUn modifiable Iterator < Fast a Record >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext : ĠFast a Record ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġnull Ġ&& Ġit . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( description [ 0 ] Ġ== Ġ' >') ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsequence Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext () Ġ&& Ġit . peek ()[ 0 ] Ġ!= Ġ' >') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Sequence ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence . append ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= ĠFast a Record ( description . substring ( 1 ), Ġsequence . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnext Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠFast a Record Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( hasNext ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfast a Record Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfast a Record !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġread ( path : ĠPath , Ġread Sequence : ĠBoolean Ġ= Ġtrue ): ĠStream < Fast a Record > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġpath . buffered Reader (). lines () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠChar Matcher . whitespace (). trim From ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ( String :: isNotEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= ĠFast a Reader ( read Sequence ). read ( Iter ators . peek ing Iterator ( lines . iterator ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStream Support . stream ( Spl iter ators . spl iterator Unknown Size ( iterator , Ġ 0 ), Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" nothing _ to _ inline ") Ċ private Ġinline Ġfun ĠBuffered Writer . write ( ch : ĠChar ) Ġ= Ġwrite ( ch . toInt ()) Ċ Ċ @ Throws ( IOException :: class ) Ċ fun ĠIterable < Fast a Record >. write ( path : ĠPath , Ġwidth : ĠInt Ġ= Ġ 8 0 ) Ġ{ ĊĠĠĠ Ġpath . buffered Writer (). use Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠ ĠforEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write (' >') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( it . description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ('\ n ') ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġit . sequence . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( it . sequence [ i ]. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ% Ġwidth Ġ== Ġ 0 Ġ&& Ġi Ġ> Ġ 0 Ġ&& Ġi Ġ< Ġlength Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ('\ n ') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠFast a Record ( val Ġdescription : ĠString , Ġval Ġsequence : ĠString ) Ċ Ċ fun ĠGen ome . write As Fast a ( path : ĠPath ) Ġ{ ĊĠĠĠ Ġthis . chrom osome s . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġchr Ġ-> ĠFast a Record ( chr . name , Ġchr . sequence . toString ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Iterable (). write ( path ) Ċ }