package Ġbr . com . le andro . book search Ċ Ċ import Ġbr . com . le andro . book search . domain . Book Ċ import Ġbr . com . le andro . book search . file io . read Book FromFile Ċ import Ġbr . com . le andro . book search . indexing . Word Position Ċ import Ġbr . com . le andro . book search . indexing . parse Indexes Ċ import Ġbr . com . le andro . book search . indexing . to Human String Ċ import Ġbr . com . le andro . book search . search . findFirst Sentence Ċ Ċ // Type Ġthe Ġsentence Ġyou Ġw anna Ġsearch Ġhere !! Ċ private Ġconst Ġval ĠSEARCH _ SENT ENCE Ġ= Ġ" Are Ġyou Ġlooking Ġfor " Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġbook : ĠBook Ġ= Ġread Book FromFile (" Kit ty , Ġthe Ġcat ") ĊĠĠĠ Ġval Ġindexes : ĠMap < String , ĠList < Word Position >> Ġ= Ġparse Indexes ( book ) ĊĊĠĠĠ Ġfind First Sentence ( SEARCH _ SENT ENCE , Ġindexes ) ĊĠĠĠĠĠĠĠ Ġ. let (:: parse Answer ) ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġanswer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --- ĠAnswer Ġ--- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( answer ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġprint Book On Console ( book : ĠBook ) Ġ{ ĊĠĠĠ Ġbook . pages . forEach Ġ{ Ġpage Ġ-> ĊĠĠĠĠĠĠĠ Ġprintln (" --- ĠPage : Ġ${ page . number } Ġ--- ") ĊĠĠĠĠĠĠĠ Ġpage . lines List . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Position Ġ${ line . position }: Ġ${ line . content }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġprint Positions Dictionary ( positions Map : ĠMap < String , ĠList < Word Position >>) Ġ{ ĊĠĠĠ Ġprintln (" Index ation Ġtable ") ĊĊĠĠĠ Ġpositions Map . forEach Ġ{ Ġ( word , Ġword Position ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġposition String Ġ= Ġword Position . join ToString Ġ{ Ġit . to Human String () Ġ} ĊĠĠĠĠĠĠĠ Ġprintln ("$ word : Ġ$ position String ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġprint Results ( find Result : ĠList < List < Word Position >>) Ġ{ ĊĠĠĠ Ġfind Result . map Ġ{ Ġpositions Ġ-> ĊĠĠĠĠĠĠĠ Ġprintln ( positions . join ToString Ġ{ Ġit . to Human String () Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġparse Answer ( word Positions : ĠList < Word Position >) Ġ: ĠString Ġ{ ĊĠĠĠ Ġval Ġpage : ĠInt ? Ġ= Ġword Positions . first OrNull ()?. page ĊĠĠĠ Ġval Ġline : ĠInt ? Ġ= Ġword Positions . first OrNull ()?. line ĊĊĠĠĠ Ġval Ġfirst Position : ĠInt ? Ġ= Ġword Positions . first OrNull ()?. position ĊĠĠĠ Ġval Ġlast Position Ġ: ĠInt ? Ġ= Ġword Positions . last OrNull ()?. position ĊĊĠĠĠ Ġreturn Ġif Ġ( first Position Ġ!= Ġnull Ġ&& Ġlast Position Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Page Ġ- Ġ$ page , ĠLine : Ġ$ line , Ġfrom Ġposition : Ġ$ first Position Ġto Ġ$ last Position " ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Not Ġfound " ĊĠĠĠ Ġ} Ċ }