/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . squareup . sample . time machine Ċ Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Experimental Time Ċ Ċ /** Ċ Ġ* ĠAn Ġimmutable , Ġ[ append ]- only Ġlist Ġof Ġvalues Ġthat Ġare Ġeach Ġassociated Ġwith Ġincreasing Ġtimestamps . Ċ Ġ* Ċ Ġ* ĠTimestamp s Ġare Ġrepresented Ġas Ġ[ Duration ] s , Ġrelative Ġto Ġsome Ġstarting Ġpoint Ġ( usually Ġa Ċ Ġ* Ġ[ Clock Mark ][ kotlin . time . Clock Mark ], Ġprobably Ġfrom Ġ[ Clock . mark Now ][ kotlin . time . Clock . mark Now ]). Ċ Ġ* Ċ Ġ* ĠThe Ġtimestamp Ġof Ġthe Ġlast Ġvalue Ġis Ġexposed Ġas Ġ[ duration ]. Ċ Ġ* ĠTo Ġget Ġthe Ġvalues Ġwithout Ġtheir Ġtimestamps , Ġuse Ġthe Ġ[ values ] Ġsequence . Ċ Ġ* ĠValues Ġcan Ġbe Ġqueried Ġby Ġtimestamp Ġusing Ġ[ find Value Nearest ]. Ċ Ġ* Ċ Ġ* Ġ@ constructor ĠInitializes Ġa Ġ[ TimeSeries ] Ġwith Ġa Ġlist Ġof Ġincreasing Ġvalue / timestamp Ġpairs . Ċ Ġ*/ Ċ @ Experimental Time Ċ internal Ġclass ĠTime Series < out ĠT >( ĊĠ Ġprivate Ġval Ġdata : ĠList < Pair < T , ĠDuration >> Ġ= Ġempty List () Ċ ) Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġlatest Ġtimestamp Ġin Ġthe Ġseries . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThis Ġvalue Ġis Ġ_ not _ Ġrelative Ġto Ġthe Ġfirst Ġvalue : Ġif Ġthe Ġseries Ġcontains Ġvalues Ġat Ġtimes ĊĠĠ Ġ* Ġ`[ 1 s , Ġ 3 s ] `, Ġthis Ġproperty Ġwill Ġreturn Ġ` 3 s `. ĊĠĠ Ġ*/ ĊĠ Ġval Ġduration : ĠDuration Ġget () Ġ= Ġdata . last OrNull ()?. second Ġ?: ĠDuration . ZERO ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġlazy Ġ[ Sequence ] Ġof Ġall Ġthe Ġvalues Ġin Ġthe Ġseries , Ġwithout Ġtheir Ġtimestamps . ĊĠĠ Ġ*/ ĊĠ Ġval Ġvalues : ĠSequence < T > Ġget () Ġ= Ġdata . as Sequence (). map Ġ{ Ġit . first Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġa Ġ[ TimeSeries ] Ġwith Ġa Ġvalue Ġappended . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġtimestamp ĠThe Ġtimestamp Ġof Ġthe Ġvalue . ĠMust Ġbe Ġgreater Ġthan Ġor Ġequal Ġto Ġ[ duration ]. ĊĠĠ Ġ*/ ĊĠ Ġfun Ġappend ( ĊĠĠĠ Ġvalue : Ġ@ Unsafe Variance ĠT , ĊĠĠĠ Ġtimestamp : ĠDuration ĊĠ Ġ): ĠTime Series < T > Ġ{ ĊĠĠĠ Ġrequire ( timestamp Ġ>= Ġduration ) ĊĠĠĠ Ġreturn ĠTime Series ( data Ġ+ Ġ( value Ġto Ġtimestamp )) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠIf Ġthe Ġseries Ġis Ġnot Ġempty , Ġreturns Ġthe Ġvalue Ġwhose Ġtimestamp Ġis Ġnearest Ġ[ timestamp ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġtimestamp ĠThe Ġtimestamp Ġto Ġlook Ġup . ĠThis Ġdoes Ġnot Ġneed Ġto Ġexactly Ġmatch Ġany Ġtimestamp ĊĠĠ Ġ* Ġcontained Ġin Ġthe Ġseries . ĠIf Ġthe Ġseries Ġhas Ġat Ġleast Ġone Ġelement , Ġthis Ġmethod Ġwill Ġalways ĊĠĠ Ġ* Ġreturn Ġa Ġvalue . ĊĠĠ Ġ* Ġ@ throws ĠNoSuch ElementException ĠIf Ġthe Ġseries Ġis Ġempty . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġfind Value Nearest ( timestamp : ĠDuration ): ĠT Ġ{ ĊĠĠĠ Ġif Ġ( data . isEmpty ()) Ġthrow ĠNoSuch ElementException (" TimeSeries Ġis Ġempty ") ĊĊĠĠĠ Ġval Ġindex Ġ= Ġdata . binary Search By ( timestamp ) Ġ{ Ġit . second Ġ} ĊĠĠĠ Ġif Ġ( index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠExact Ġmatch Ġwas Ġfound . ĊĠĠĠĠĠ Ġreturn Ġdata [ index ]. first ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠIndex Ġis Ġ-( insertion Ġpoint ). ĠWe Ġneed Ġto Ġdo Ġour Ġown Ġcalculation Ġto Ġdecide Ġwhich Ġside Ġof Ġthe ĊĠĠĠ Ġ// Ġinsertion Ġpoint Ġis Ġcloser . ĠWe Ġconsider Ġthe Ġ" insertion Ġpoint " Ġto Ġbe Ġthe Ġ" right " Ġindex , Ġsince ĊĠĠĠ Ġ// Ġit Ġwould Ġbe Ġon Ġthe Ġright Ġof Ġthe Ġinserted Ġvalue Ġafter Ġinsertion . ĊĠĠĠ Ġval Ġright Index Ġ= Ġ(- index ). coerce At Most ( data . size Ġ- Ġ 1 ) ĊĠĠĠ Ġval Ġleft Index Ġ= Ġ( right Index Ġ- Ġ 1 ). coerce At Least ( 0 ) ĊĠĠĠ Ġval Ġright Timestamp Ġ= Ġdata [ right Index ]. second ĊĠĠĠ Ġval Ġleft Timestamp Ġ= Ġdata [ left Index ]. second ĊĠĠĠ Ġval Ġright Distance Ġ= Ġright Timestamp Ġ- Ġtimestamp ĊĠĠĠ Ġval Ġleft Distance Ġ= Ġtimestamp Ġ- Ġleft Timestamp ĊĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠ Ġright Distance Ġ< Ġleft Distance Ġ-> Ġdata [ right Index ] ĊĠĠĠĠĠ Ġelse Ġ-> Ġdata [ left Index ] ĊĠĠĠ Ġ}. first ĊĠ Ġ} Ċ } Ċ