package Ġio . horizontal systems . bank wallet . modules . transactions Ċ Ċ import Ġio . horizontal systems . bank wallet . entities . Transaction Record Ċ import Ġio . horizontal systems . bank wallet . entities . Wallet Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ class ĠPool ( val Ġstate : ĠState ) Ġ{ ĊĊĠĠĠ Ġclass ĠState ( val Ġwallet : ĠWallet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrecords : ĠMutable List < Transaction Record > Ġ= ĠCopy On Write ArrayList < Transaction Record >() ĊĊĠĠĠĠĠĠĠ Ġvar Ġfirst Unused Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġall Loaded Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġunused Records : ĠList < Transaction Record > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . isEmpty () Ġ-> ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġrecords . sub List ( first Unused Index , Ġrecords . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( records : ĠList < Transaction Record >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . records . addAll ( records ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠindexOf ( record : ĠTransaction Record ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrecords . indexOf ( record ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġinsert IndexOf ( record : ĠTransaction Record ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrecords . indexOf First Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Record ( index : ĠInt , Ġrecord : ĠTransaction Record ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords [ index ] Ġ= Ġrecord ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġinsert Record ( insert Index : ĠInt , Ġrecord : ĠTransaction Record ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . add ( insert Index , Ġrecord ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrecords : ĠMutable List < Transaction Record > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . records ĊĊĠĠĠ Ġval Ġall Shown : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . all Loaded Ġ&& Ġstate . unused Records . isEmpty () ĊĊĠĠĠ Ġval Ġunused Records : ĠList < Transaction Record > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . unused Records ĊĊĠĠĠ Ġval Ġwallet : ĠWallet ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . wallet ĊĊĠĠĠ Ġfun Ġincrease First Unused Index () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . first Unused Index ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset First Unused Index () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . first Unused Index Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Fetch Data ( limit : ĠInt ): ĠTransactions Module . Fetch Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state . all Loaded ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġunused Records Size Ġ= Ġstate . unused Records . size ĊĠĠĠĠĠĠĠ Ġif Ġ( unused Records Size Ġ> Ġlimit ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġrecord From Ġ= Ġstate . records . last OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Limit Ġ= Ġlimit Ġ+ Ġ 1 Ġ- Ġunused Records Size ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTransactions Module . Fetch Data ( state . wallet , Ġrecord From , Ġfetch Limit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( transaction Records : ĠList < Transaction Record >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( transaction Records . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . all Loaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . add ( transaction Records ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle Updated Record ( record : ĠTransaction Record ): ĠHandle Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdated Record Index Ġ= Ġstate . indexOf ( record ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( updated Record Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . set Record ( updated Record Index , Ġrecord ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( updated Record Index Ġ< Ġstate . first Unused Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHandle Result . UPDATED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHandle Result . IG NO RED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinsert Index Ġ= Ġstate . insert IndexOf ( record ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( insert Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . insert Record ( insert Index , Ġrecord ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( insert Index Ġ< Ġstate . first Unused Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrease First Unused Index () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHandle Result . INSERT ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( insert Index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHandle Result . NEW _ DATA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHandle Result . IG NO RED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state . all Loaded Ġ&& Ġunused Records . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . add ( listOf ( record )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHandle Result . NEW _ DATA ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHandle Result . IG NO RED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠHandle Result Ġ{ ĊĠĠĠĠĠĠĠ ĠUP D ATED , ĠINSERT ED , ĠIG NO RED , ĠNEW _ DATA ĊĠĠĠ Ġ} Ċ Ċ } Ċ