package Ġkr . fel iz . tutorial _ collection . le mon fox . widget . net Ċ Ċ import Ġkr . fel iz . tutorial _ collection . le mon fox . widget . model . Chart Data Ċ import Ġkr . fel iz . tutorial _ collection . le mon fox . widget . utils . Chart Interval Ċ import Ġkr . fel iz . tutorial _ collection . le mon fox . widget . utils . Chart Period Ċ import Ġkr . fel iz . tutorial _ collection . le mon fox . widget . utils . to Epoch Second Ċ import Ġkr . fel iz . tutorial _ collection . le mon fox . widget . utils . to Upper Ċ import Ġjava . time . LocalDateTime Ċ Ċ class ĠChart DataSource ( private Ġval Ġapi Service : ĠChart ApiService ) Ġ{ ĊĊĠĠĠ Ġsuspend Ġfun Ġget Chart Data ( ĊĠĠĠĠĠĠĠ Ġbase : ĠString , ĊĠĠĠĠĠĠĠ Ġcounter : ĠString , ĊĠĠĠĠĠĠĠ Ġperiod : ĠChart Period , ĊĠĠĠĠĠĠĠ Ġinterval : ĠChart Interval , ĊĠĠĠĠĠĠĠ Ġdate : ĠLocalDateTime ĊĠĠĠ Ġ): ĠApi Result < Chart Data > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmanifest Sequence Ġ= Ġget Manifest Sequence ( base , Ġcounter , Ġinterval ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmanifest Ġ= Ġapi Service . get Manifest Data ( manifest Sequence ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manifest Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest Sequence Ġ= Ġget Manifest Sequence ( base , Ġcounter , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest Ġ= Ġapi Service . get Manifest Data ( manifest Sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsequence Ġ= ĠcheckNotNull ( manifest ). tail ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdata Ġ= Ġapi Service . get Remote Chart Data ( sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimit Time Ġ= Ġget Limit Time ( period , Ġdate ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Time Ġ= Ġdata . time . first OrNull ()?. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Time Ġ== Ġnull Ġ|| Ġfirst Time Ġ<= Ġlimit Time Ġ|| Ġdata . prev . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Data Ġ= Ġapi Service . get Remote Chart Data ( data . prev !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġappend Data ( data , Ġprev Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġget Filtered Data ( data , Ġlimit Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Result . success ( data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Result . error ( ApiError ( ApiError Case . UNKNOWN _ ERROR , Ġe . message )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Manifest Sequence ( ĊĠĠĠĠĠĠĠ Ġbase : ĠString , ĊĠĠĠĠĠĠĠ Ġcounter : ĠString , ĊĠĠĠĠĠĠĠ Ġinterval : ĠChart Interval ? ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinterval Value Ġ= Ġinterval ?. value Ġ?: Ġ" 1 m " ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ base . to Upper ()} _${ counter . to Upper ()} _$ interval Value . manifest " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Data ( data : ĠChart Data , Ġprev Data : ĠChart Data ): ĠChart Data Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠChart Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġprev Data . prev , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġdata . next , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= Ġprev Data . time . plus ( data . time ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġ= Ġprev Data . open . plus ( data . open ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhigh Ġ= Ġprev Data . high . plus ( data . high ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlow Ġ= Ġprev Data . low . plus ( data . low ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ġ= Ġprev Data . close . plus ( data . close ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Ġ= Ġprev Data . volume . plus ( data . volume ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Filtered Data ( data : ĠChart Data , Ġlimit Time : ĠLong ): ĠChart Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmutable ListOf < Long >() ĊĠĠĠĠĠĠĠ Ġval Ġopen Ġ= Ġmutable ListOf < Number >() ĊĠĠĠĠĠĠĠ Ġval Ġhigh Ġ= Ġmutable ListOf < Number >() ĊĠĠĠĠĠĠĠ Ġval Ġlow Ġ= Ġmutable ListOf < Number >() ĊĠĠĠĠĠĠĠ Ġval Ġclose Ġ= Ġmutable ListOf < Number >() ĊĠĠĠĠĠĠĠ Ġval Ġvolume Ġ= Ġmutable ListOf < Number >() ĊĊĠĠĠĠĠĠĠ Ġdata . time . forEach Indexed Ġ{ Ġindex , Ġtimestamp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timestamp Ġ>= Ġlimit Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime . add ( data . time [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen . add ( data . open [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhigh . add ( data . high [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlow . add ( data . low [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose . add ( data . close [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume . add ( data . volume [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠChart Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġdata . prev , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġdata . next , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= Ġtime , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġ= Ġopen , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhigh Ġ= Ġhigh , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlow Ġ= Ġlow , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ġ= Ġclose , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Ġ= Ġvolume ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Limit Time ( period : ĠChart Period , Ġdate : ĠLocalDateTime ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġdate . to Epoch Second () ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= Ġwhen Ġ( period ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChart Period . PERIOD _ ONE _ DAY Ġ-> Ġtimestamp Ġ- Ġ( timestamp Ġ% Ġ( 6 0 Ġ* Ġ 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChart Period . PERIOD _ ONE _ WEEK Ġ-> Ġtimestamp Ġ- Ġ( timestamp Ġ% Ġ( 6 0 Ġ* Ġ 1 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChart Period . PERIOD _ ONE _ MONTH , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChart Period . PERIOD _ TH REE _ MONTH Ġ-> Ġtimestamp Ġ- Ġ( timestamp Ġ% Ġ( 6 0 Ġ* Ġ 6 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChart Period . PERIOD _ ONE _ YEAR Ġ-> Ġdate . to LocalDate (). to Epoch Second () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChart Period . PERIOD _ 1 0 1 _ HOUR Ġ-> Ġdate . to LocalDate (). to Epoch Second () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChart Period . PERIOD _ 1 0 1 _ DAY Ġ-> Ġdate . to LocalDate (). to Epoch Second () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChart Period . NONE Ġ-> Ġtimestamp ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠstartTime Ġ- Ġperiod . value ĊĠĠĠ Ġ} Ċ }