package Ġio . kot est . assertions . until Ċ Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Duration . Companion . hours Ċ import Ġkotlin . time . Duration . Companion . milliseconds Ċ Ċ /** Ċ Ġ* ĠF ib onacci Ġdelay Ġimplements Ġa Ġdelay Ġwhere Ġeach Ġduration Ġis Ġcalculated Ġas Ġa Ġmultiplier Ċ Ġ* Ġof Ġthe Ġfib onacci Ġsequence , Ġ 0 , Ġ 1 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 5 .... Ċ Ġ* Ċ Ġ* ĠSome Ġpeople Ġstart Ġfib Ġat Ġ 0 , Ġsome Ġat Ġ 1 . Ċ Ġ* ĠThis Ġimplementation Ġstarts Ġwith Ġ 0 Ġas Ġper Ġhttps :// en . wikipedia . org / wiki / Fib onacci _ number Ċ Ġ* Ċ Ġ* Ġ@ param Ġoffset ĠĠ ĠAdded Ġto Ġthe Ġcount , Ġso Ġif Ġthe Ġoffset Ġis Ġ 4 , Ġthen Ġthe Ġfirst Ġvalue Ġwill Ġbe Ġthe Ġ 4 th Ġfib Ġnumber . Ċ Ġ* Ġ@ param Ġbase ĠThe Ġduration Ġthat Ġis Ġmultip lied Ġby Ġthe Ġfib onacci Ġvalue Ċ Ġ* Ġ@ param Ġmax Ġthe Ġmaximum Ġduration Ġto Ġclamp Ġthe Ġresulting Ġduration Ġto Ġdefaults Ġto Ġ[ Fib onacci Interval . default Max ] Ċ Ġ*/ Ċ class ĠF ib onacci Interval ( private Ġval Ġbase : ĠDuration , Ġprivate Ġval Ġoffset : ĠInt , Ġprivate Ġval Ġmax : ĠDuration ?) Ġ: ĠInterval Ġ{ ĊĊĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġrequire ( offset Ġ>= Ġ 0 ) Ġ{ Ġ" Offset Ġmust Ġbe Ġgreater Ġthan Ġor Ġequal Ġto Ġ 0 " Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Fib onacci Interval (${ :: base . name } =$ base , Ġ${ :: offset . name } =$ offset , Ġ${ :: max . name } =${ max ?. toString () })" ĊĊĠĠ Ġoverride Ġfun Ġnext ( count : ĠInt ): ĠDuration Ġ{ ĊĠĠĠĠĠ Ġval Ġbase Ms Ġ= Ġbase . in Whole Milliseconds ĊĠĠĠĠĠ Ġval Ġtotal Ġ= Ġbase Ms Ġ* Ġfib onacci ( offset Ġ+ Ġcount ) ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġtotal . milliseconds ĊĠĠĠĠĠ Ġreturn Ġif Ġ( max Ġ== Ġnull ) Ġresult Ġelse Ġmin Of ( max , Ġresult ) ĊĠĠ Ġ} ĊĊĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠ Ġval Ġdefault Max Ġ= Ġ 2 . hours ĊĠĠ Ġ} Ċ } Ċ Ċ fun ĠDuration . fib onacci ( max : ĠDuration ? Ġ= ĠF ib onacci Interval . default Max ) Ġ= ĠF ib onacci Interval ( this , Ġ 0 , Ġmax ) Ċ Ċ fun Ġfib onacci ( n : ĠInt ): ĠInt Ġ{ ĊĠĠ Ġtail rec Ġfun Ġfib ( k : ĠInt , Ġcurrent : ĠInt , Ġprevious : ĠInt ): ĠInt Ġ= Ġwhen Ġ( k ) Ġ{ ĊĠĠĠĠĠĠ 0 Ġ-> Ġprevious ĊĠĠĠĠĠĠ 1 Ġ-> Ġcurrent ĊĠĠĠĠĠ Ġelse Ġ-> Ġfib ( k Ġ- Ġ 1 , Ġcurrent Ġ+ Ġprevious , Ġcurrent ) ĊĠĠ Ġ} ĊĠĠ Ġreturn Ġfib ( n , Ġ 1 , Ġ 0 ) Ċ } Ċ