|
| 1 | +package cats.tests |
| 2 | + |
| 3 | +import cats.{Defer, Eq, Monad} |
| 4 | +import cats.laws.discipline.{DeferTests, MonadTests, SerializableTests} |
| 5 | +import org.scalacheck.Arbitrary.arbitrary |
| 6 | +import org.scalacheck.{Arbitrary, Cogen, Gen} |
| 7 | + |
| 8 | +import scala.util.control.TailCalls.{done, tailcall, TailRec} |
| 9 | + |
| 10 | +class TailRecSuite extends CatsSuite { |
| 11 | + |
| 12 | + implicit def tailRecArb[A: Arbitrary: Cogen]: Arbitrary[TailRec[A]] = |
| 13 | + Arbitrary( |
| 14 | + Gen.frequency( |
| 15 | + (3, arbitrary[A].map(done)), |
| 16 | + (1, Gen.lzy(arbitrary[(A, A => TailRec[A])].map { case (a, fn) => tailcall(fn(a)) })), |
| 17 | + (1, Gen.lzy(arbitrary[(TailRec[A], A => TailRec[A])].map { case (a, fn) => a.flatMap(fn) })) |
| 18 | + ) |
| 19 | + ) |
| 20 | + |
| 21 | + implicit def eqTailRec[A: Eq]: Eq[TailRec[A]] = |
| 22 | + Eq.by[TailRec[A], A](_.result) |
| 23 | + |
| 24 | + checkAll("TailRec[Int]", MonadTests[TailRec].monad[Int, Int, Int]) |
| 25 | + checkAll("Monad[TailRec]", SerializableTests.serializable(Monad[TailRec])) |
| 26 | + |
| 27 | + checkAll("TailRec[Int]", DeferTests[TailRec].defer[Int]) |
| 28 | + checkAll("Defer[TailRec]", SerializableTests.serializable(Defer[TailRec])) |
| 29 | +} |
0 commit comments