package Ġio . kot est . assertions . until Ċ Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Experimental Time Ċ import Ġkotlin . time . 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 Ċ Ġ*/ Ċ @ Opt In ( Experimental Time :: class ) Ċ class ĠF ib onacci Interval ( private Ġval Ġbase : ĠDuration , Ġprivate Ġval Ġoffset : ĠInt ) Ġ: ĠInterval Ġ{ ĊĊĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġrequire ( offset Ġ>= Ġ 0 ) Ġ{ Ġ" Offset Ġmust Ġbe Ġgreater Ġthan Ġor Ġequal Ġto Ġ 0 " Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġfun Ġnext ( count : ĠInt ): ĠDuration Ġ{ ĊĠĠĠĠĠ Ġval Ġbase Ms Ġ= Ġbase . to Long Milliseconds () ĊĠĠĠĠĠ Ġval Ġtotal Ġ= Ġbase Ms Ġ* Ġfib onacci ( offset Ġ+ Ġcount ) ĊĠĠĠĠĠ Ġreturn Ġtotal . milliseconds ĊĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Experimental Time :: class ) Ċ fun ĠDuration . fib onacci () Ġ= ĠF ib onacci Interval ( this , Ġ 0 ) Ċ Ċ 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 ) Ċ } Ċ