import Ġarrow . core . getOrElse Ċ import Ġarrow . core . to Option Ċ import Ġarrow . syntax . function . cur ried Ċ import Ġarrow . syntax . function . reverse Ċ Ċ open Ġclass ĠF izz Bu zz Service Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrules Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRule ( numbers Div isible By ( 3 ), Ġ" F izz "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRule ( numbers Div isible By ( 5 ), Ġ" Bu zz ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġopen Ġfun Ġsequence Up To ( limit : ĠInt ) Ġ= Ġ( 1 .. limit ). map (:: single ) ĊĊĠĠĠ Ġopen Ġfun Ġsingle ( input : ĠInt ) Ġ= Ġtry GetResult From Rules ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Option () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getOrElse Ġ{ Ġinput . toString () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnumbers Div isible By ( div isor : ĠInt ): Ġ( input : ĠInt ) Ġ-> ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ:: is Div isible By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reverse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cur ried ()( div isor ) ĊĊĠĠĠ Ġprivate Ġfun Ġis Div isible By ( input : ĠInt , Ġdivisor : ĠInt ) Ġ= Ġinput Ġ% Ġdivisor Ġ== Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġtry GetResult From Rules ( input : ĠInt ) Ġ= Ġrules ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . app lies To ( input ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("- ") Ġ{ Ġit . result Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠRule ( val Ġapplies To : Ġ( Int ) Ġ-> ĠBoolean , Ġval Ġresult : ĠString )