package Ġarrow . free Ċ Ċ import Ġarrow . core .* Ċ import Ġarrow . free . instances . For Co y oned a Ċ import Ġarrow . free . instances . co y oned a . functor . functor Ċ import Ġarrow . instances . id . functor . functor Ċ import Ġarrow . instances . option . functor . functor Ċ import Ġarrow . test . Unit Spec Ċ import Ġarrow . test . l aws . Functor L aws Ċ import Ġarrow . type classes . Eq Ċ import Ġio . kot lint est . K Test JUnit Runner Ċ import Ġio . kot lint est . matchers . shouldBe Ċ import Ġio . kot lint est . properties . for All Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ RunWith ( K Test JUnit Runner :: class ) Ċ class ĠCo y oned a Test Ġ: ĠUnit Spec () Ġ{ ĊĠ Ġval ĠE Q : ĠEq < Co y oned a Of < For Id , ĠInt , ĠInt >> Ġ= ĠEq Ġ{ Ġa , Ġb Ġ-> ĊĠĠĠ Ġa . fix (). lower ( Id . functor ()) Ġ== Ġb . fix (). lower ( Id . functor ()) ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĊĠĠĠĠĠ Ġtest L aws ( Functor L aws . l aws ( Co y oned a . functor (), Ġ{ Ġ_ Ġ-> ĠCo y oned a ( Id ( 0 )) Ġ{ Ġit Ġ} Ġ}, ĠE Q )) ĊĊĠĠĠ Ġ" map Ġshould Ġbe Ġstack - safe " Ġ{ ĊĠĠĠĠĠ Ġval Ġloops Ġ= Ġ 1 0 0 0 0 ĊĊĠĠĠĠĠ Ġtail rec Ġfun Ġloop ( n : ĠInt , Ġacc : ĠCo y oned a < For Option , ĠInt , ĠInt >): ĠCo y oned a < For Option , ĠInt , ĠInt > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ<= Ġ 0 ) Ġacc ĊĠĠĠĠĠĠĠ Ġelse Ġloop ( n Ġ- Ġ 1 , Ġacc . map Ġ{ Ġit Ġ+ Ġ 1 Ġ}) ĊĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġloop ( loops , Ġarrow . free . Co y oned a ( Some ( 0 ), Ġ:: identity )). lower ( Option . functor ()) ĊĠĠĠĠĠ Ġval Ġexpected Ġ= ĠSome ( loops ) ĊĊĠĠĠĠĠ Ġexpected ĠshouldBe Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" to Y oned a Ġshould Ġconvert Ġto Ġan Ġequivalent ĠY oned a " Ġ{ ĊĠĠĠĠĠ Ġfor All Ġ{ Ġx : ĠInt Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġop Ġ= ĠCo y oned a ( Id ( x ), ĠInt :: toString ) ĊĠĠĠĠĠĠĠ Ġval Ġto Y oned a Ġ= Ġop . to Y oned a ( Id . functor ()). lower (). fix () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠY oned a ( Id ( x . toString ()), ĠId . functor ()). lower (). fix () ĊĊĠĠĠĠĠĠĠ Ġexpected Ġ== Ġto Y oned a ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ