package Ġcom . y ichi uan . mo ed ict . data Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . support . annotation . Visible ForTesting Ċ import Ġio . reactivex . Comp letable Ċ import Ġmo e . Dictionary Ċ import Ġmo e . Index Ċ import Ġmo e . Word Ċ import Ġjava . io . InputStream Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . util .* Ċ Ċ class ĠMo e Repository Ġinternal Ġconstructor ( private Ġval Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMOD _ MASK Ġ= Ġ 0 x 3 FF Ġ// Ġ 0 b 1 1 1 1 1 1 1 1 1 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBUFFER _ SIZE Ġ= Ġ( 1 0 2 4 . 0 Ġ* Ġ 1 0 2 4 . 0 Ġ* Ġ 1 . 2 ). toInt () Ġ// Ġ 1 . 2 ĠMB ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMO E _ INDEX _ DAT AP ATH Ġ= Ġ" moe / index . bin " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġappend able Ġ= ĠStringBuilder () ĊĠĠĠ Ġprivate Ġval Ġformatter Ġ= ĠFormatter ( append able ) ĊĊĠĠĠ Ġprivate Ġvar Ġdict Buffer : ĠByteArray ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġindex : ĠIndex ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġget Mo e Word ( word : ĠString ): ĠWord ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Word Ġ= Ġword . code Point At ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġmod Ġ= Ġfirst Word Ġand ĠMOD _ MASK Ġ// Ġcode Ġpoint Ġ% Ġ 1 0 2 4 ĊĊĠĠĠĠĠĠĠ Ġappend able . set Length ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdata Path Ġ= Ġformatter . format (" moe /% d . bin ", Ġmod ). toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġdict Ġ= ĠDictionary . getRoot As Dictionary ( load Dict Data ( data Path )) ĊĠĠĠĠĠĠĠ Ġreturn Ġdict . words ByKey ( word ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġfun Ġget Mo e Dictionary ( mod : ĠInt ): ĠDictionary Ġ{ ĊĠĠĠĠĠĠĠ Ġappend able . set Length ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdata Path Ġ= Ġformatter . format (" moe /% d . bin ", Ġmod ). toString () ĊĠĠĠĠĠĠĠ Ġreturn ĠDictionary . getRoot As Dictionary ( load Dict Data ( data Path )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Index Data (): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= ĠIndex . getRoot As Index ( load Data ( MO E _ INDEX _ DAT AP ATH , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Dict Data ( data Path : ĠString ): ĠByteBuffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( dict Buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdict Buffer Ġ= ĠByteArray ( BUFFER _ SIZE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġload Data ( data Path , Ġdict Buffer ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġload Data ( data Path : ĠString , Ġbuffer : ĠByteArray ?): ĠByteBuffer ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġbyte Buffer : ĠByteBuffer ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġcontext . assets . open ( data Path ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Buffer Ġ= Ġload Data ( it , Ġbuffer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbyte Buffer ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġload Data ( inputStream : ĠInputStream , Ġbuffer : ĠByteArray ?): ĠByteBuffer Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġread Buffer Ġ= Ġbuffer ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠinputStream . available () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( read Buffer Ġ== Ġnull Ġ|| Ġread Buffer . size Ġ< Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Buffer Ġ= ĠByteArray ( size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġread Size Ġ= ĠinputStream . read ( read Buffer , Ġ 0 , Ġsize ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠByteBuffer . wrap ( read Buffer , Ġ 0 , Ġread Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch ( query : ĠString ): ĠArrayList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġindex !!. search ( query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Word ( position : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġindex !!. words ( position ) ĊĠĠĠ Ġ} Ċ }