package Ġorg . ma ure zen . indexer . impl Ċ Ċ import Ġarrow . core . Either Ċ import Ġorg . ma ure zen . indexer . FileReader Ċ import Ġjava . io . File Ċ import Ġjava . io . File Filter Ċ import Ġjava . io . FileNotFoundException Ċ Ċ // Ġ@ TODO ĠCRL F Ġfiles Ġread Ġat ĠL F Ġor ĠCR Ġsystems Ġand Ġvice Ġvers a Ċ val Ġdefault EOL : ĠString Ġ= ĠSystem . line Separator () Ċ Ċ val ĠAC CEPT S _ E VERY TH ING Ġ= ĠFile Filter Ġ{ Ġtrue Ġ} Ċ Ċ class ĠFileReader Basic : ĠFileReader Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġlogger () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġsequence Ġof Ġlines Ġof Ġthis Ġfile Ġwithout Ġpulling Ġthe Ġwhole Ġthing Ġinto Ġmemory . ĠAss umes Ġthe Ġfile Ġexists . ĊĠĠĠĠ Ġ* ĠFor Ġthe Ġmoment Ġassumes ĠUTF - 8 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġread And ( filename : ĠString , Ġblock : Ġ( Sequence < String >) Ġ-> ĠT ): ĠEither < Unit , ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . Right ( File ( filename ). use Lines Ġ{ Ġblock ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Couldn 't Ġopen Ġfile Ġ$ filename , Ġskipping ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Couldn 't Ġopen Ġfile Ġ$ filename , Ġskipping ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . Left ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexplode File Roots ( roots : ĠList < String >, Ġfilter : ĠFile Filter ): ĠArrayList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġarray ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġfilter Or Directory Ġ= ĠFile Filter Ġ{ Ġfile Ġ-> Ġ( file Ġ!= Ġnull Ġ&& Ġfile . isDirectory ) Ġ|| Ġfilter . accept ( file ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Queue Ġ= ĠArray Deque < String >() ĊĠĠĠĠĠĠĠ Ġfile Queue . addAll ( roots ) ĊĠĠĠĠĠĠĠ Ġ//@ todo Ġhandle Ġsymlink s Ġ( and Ġuse ĠFiles . walk Ġin Ġgeneral ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! file Queue . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( file Queue . remove First ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġfile . list Files ( filter Or Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Queue . addAll ( list . map ( File :: getAbsolutePath )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Got Ġ` null ` Ġinstead Ġof Ġdirectory Ġlisting Ġfor Ġ$ file , Ġskipping ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( filter Or Directory . accept ( file )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( file . absolute Path . intern ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfiles ĊĠĠĠ Ġ} Ċ }