From 92705fb2be5be935529e4f5199424f6bf6ac2fed Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Tue, 27 Sep 2022 09:58:51 +0200 Subject: [PATCH 1/3] Unify cats modules fixes #28 Credit: @Baccata --- build.sbt | 24 +-- .../src/test/scala/BaseCatsEffect2Test.scala | 23 -- .../src/test/scala/CatsEffect2TCTests.scala | 201 ------------------ .../src/test/scala/CatsEffect2Tests.scala | 185 ---------------- .../src/main/scala/catseffect3.scala | 14 -- .../src/main/scala/cats.scala | 7 +- .../src/test/scala/BaseCatsEffect3Test.scala | 0 .../src/test/scala/CatsEffect3TCTests.scala | 41 ++-- .../src/test/scala/CatsEffect3Tests.scala | 2 +- 9 files changed, 30 insertions(+), 467 deletions(-) delete mode 100644 cats-effect-2/src/test/scala/BaseCatsEffect2Test.scala delete mode 100644 cats-effect-2/src/test/scala/CatsEffect2TCTests.scala delete mode 100644 cats-effect-2/src/test/scala/CatsEffect2Tests.scala delete mode 100644 cats-effect-3/src/main/scala/catseffect3.scala rename cats-effect-2/src/main/scala/catseffect2.scala => cats/src/main/scala/cats.scala (62%) rename {cats-effect-3 => cats}/src/test/scala/BaseCatsEffect3Test.scala (100%) rename {cats-effect-3 => cats}/src/test/scala/CatsEffect3TCTests.scala (82%) rename {cats-effect-3 => cats}/src/test/scala/CatsEffect3Tests.scala (99%) diff --git a/build.sbt b/build.sbt index c764da5..143f9e1 100644 --- a/build.sbt +++ b/build.sbt @@ -35,10 +35,9 @@ lazy val root = project ) .aggregate(( avocado.projectRefs - ++ catsEffect3.projectRefs + ++ cats.projectRefs ++ zio2.projectRefs ++ zio1.projectRefs - ++ catsEffect2.projectRefs )*) lazy val avocado = projectMatrix @@ -49,25 +48,14 @@ lazy val avocado = projectMatrix ) .jvmPlatform(scalaVersions = List(scala3)) -lazy val catsEffect3 = projectMatrix - .in(file("cats-effect-3")) +lazy val cats = projectMatrix + .in(file("cats")) .settings(commonSettings) .settings( - name := "avocADO-cats-effect-3", + name := "avocADO-cats", libraryDependencies ++= Seq( - "org.typelevel" %%% "cats-effect" % "3.3.14" - ) - ) - .dependsOn(avocado) - .jvmPlatform(scalaVersions = List(scala3)) - -lazy val catsEffect2 = projectMatrix - .in(file("cats-effect-2")) - .settings(commonSettings) - .settings( - name := "avocADO-cats-effect-2", - libraryDependencies ++= Seq( - "org.typelevel" %% "cats-effect" % "2.5.5" + "org.typelevel" %% "cats-core" % "2.8.0", + "org.typelevel" %%% "cats-effect" % "3.3.14" % Test ) ) .dependsOn(avocado) diff --git a/cats-effect-2/src/test/scala/BaseCatsEffect2Test.scala b/cats-effect-2/src/test/scala/BaseCatsEffect2Test.scala deleted file mode 100644 index 127ae26..0000000 --- a/cats-effect-2/src/test/scala/BaseCatsEffect2Test.scala +++ /dev/null @@ -1,23 +0,0 @@ -package avocado.tests - -import cats.effect.IO -import cats.effect.Timer -import cats.effect.ContextShift -import scala.concurrent.ExecutionContext - -abstract class BaseCatsEffect2Test extends munit.FunSuite { - - def testWithTimeLimit[A](name: String, maxMillis: Long)(body: IO[A])(expected: A): Unit = { - test(name) { - val start = System.currentTimeMillis() - val res = body.unsafeRunSync() - val end = System.currentTimeMillis() - assertEquals(res, expected) - assert(end - start < maxMillis) - } - } - - given Timer[IO] = IO.timer(ExecutionContext.global) - given ContextShift[IO] = IO.contextShift(ExecutionContext.global) - -} diff --git a/cats-effect-2/src/test/scala/CatsEffect2TCTests.scala b/cats-effect-2/src/test/scala/CatsEffect2TCTests.scala deleted file mode 100644 index 06d7e01..0000000 --- a/cats-effect-2/src/test/scala/CatsEffect2TCTests.scala +++ /dev/null @@ -1,201 +0,0 @@ -package avocado.tests - -import avocado.* -import avocado.instances.catseffect2.given - -import scala.concurrent.duration.* -import cats.Monad -import cats.syntax.all.* -import cats.effect.IO -import cats.effect.IO.given - -class CatsEffect2TCTests extends BaseCatsEffect2Test { - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 1", 900) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- Monad[F].pure(1) - } yield a - } - run[IO](wait) - }(1) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 2", 900) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - } yield a + b - } - run[IO](wait) - }(3) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 3", 1400) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - c <- Monad[F].pure(a + b) - d <- wait.map(_ => 4) - } yield c + d - } - run[IO](wait) - }(7) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 4", 1400) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - c <- Monad[F].pure(a + b) - d <- wait.map(_ => 4) - e <- wait.map(Function.const(5)) - } yield c + d - } - run[IO](wait) - }(7) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 5", 1400) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - c <- Monad[F].pure(a + b) - d <- wait.map(_ => 4) - e <- wait - } yield c + d - } - run[IO](wait) - }(7) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 6", 1400) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - c <- Monad[F].pure(a + b) - d <- wait.map(_ => 4) - e <- wait - f <- wait - g <- wait.map(Function.const(7)) - } yield c + d + g - } - run[IO](wait) - }(14) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 7", 900) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - _ <- wait - } yield a + b - } - run[IO](wait) - }(3) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 8", 900) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - _ <- wait - c <- wait.map(_ => 3) - } yield a + b - } - run[IO](wait) - }(3) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 9", 900) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - _ <- wait - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - _ <- wait - c <- wait.map(_ => 3) - } yield a + b - } - run[IO](wait) - }(3) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 10", 1400) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - _ <- wait.map(_ => a) - b <- wait.map(_ => 2) - c <- wait.map(_ => 3) - } yield a + b - } - run[IO](wait) - }(3) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 11", 900) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => { - val a = 2 - a - }) - } yield a + b - } - run[IO](wait) - }(3) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 12", 900) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => { - val a = 2 - a - }) - c <- wait.map { a => - def b(): Int = 3 - b() - } - } yield a + b + c - } - run[IO](wait) - }(6) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 13", 900) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b = 2 - c <- wait.map(_ => 3) - } yield a + b + c - } - run[IO](wait) - }(6) - - testWithTimeLimit("cats effect 2 comprehension with typeclasses 14", 900) { - val wait = IO.sleep(500.millis) - def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { - for { - a <- wait.map(_ => 1) - b = 2 - c <- wait.map(_ => 3) - d = 4 - } yield a + b + c + d - } - run[IO](wait) - }(10) - -} diff --git a/cats-effect-2/src/test/scala/CatsEffect2Tests.scala b/cats-effect-2/src/test/scala/CatsEffect2Tests.scala deleted file mode 100644 index f796fd9..0000000 --- a/cats-effect-2/src/test/scala/CatsEffect2Tests.scala +++ /dev/null @@ -1,185 +0,0 @@ -package avocado.tests - -import avocado.* -import avocado.instances.catseffect2.given - -import scala.concurrent.duration.* -import cats.effect.IO -import cats.effect.IO.given - -class CatsEffect2Tests extends BaseCatsEffect2Test { - - testWithTimeLimit("cats effect 2 comprehension 1", 900) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- IO(1) - } yield a - } - }(1) - - testWithTimeLimit("cats effect 2 comprehension 2", 900) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - } yield a + b - } - }(3) - - testWithTimeLimit("cats effect 2 comprehension 3", 1400) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - c <- IO(a + b) - d <- wait.map(_ => 4) - } yield c + d - } - }(7) - - testWithTimeLimit("cats effect 2 comprehension 4", 1400) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - c <- IO(a + b) - d <- wait.map(_ => 4) - e <- wait.map(Function.const(5)) - } yield c + d - } - }(7) - - testWithTimeLimit("cats effect 2 comprehension 5", 1400) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - c <- IO(a + b) - d <- wait.map(_ => 4) - e <- wait - } yield c + d - } - }(7) - - testWithTimeLimit("cats effect 2 comprehension 6", 1400) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - c <- IO(a + b) - d <- wait.map(_ => 4) - e <- wait - f <- wait - g <- wait.map(Function.const(7)) - } yield c + d + g - } - }(14) - - testWithTimeLimit("cats effect 2 comprehension 7", 900) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - _ <- wait - } yield a + b - } - }(3) - - testWithTimeLimit("cats effect 2 comprehension 8", 900) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - _ <- wait - c <- wait.map(_ => 3) - } yield a + b - } - }(3) - - testWithTimeLimit("cats effect 2 comprehension 9", 900) { - val wait = IO.sleep(500.millis) - ado { - for { - _ <- wait - a <- wait.map(_ => 1) - b <- wait.map(_ => 2) - _ <- wait - c <- wait.map(_ => 3) - } yield a + b - } - }(3) - - testWithTimeLimit("cats effect 2 comprehension 10", 1400) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - _ <- wait.map(_ => a) - b <- wait.map(_ => 2) - c <- wait.map(_ => 3) - } yield a + b - } - }(3) - - testWithTimeLimit("cats effect 2 comprehension 11", 900) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => { - val a = 2 - a - }) - } yield a + b - } - }(3) - - testWithTimeLimit("cats effect 2 comprehension 12", 900) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b <- wait.map(_ => { - val a = 2 - a - }) - c <- wait.map { a => - def b(): Int = 3 - b() - } - } yield a + b + c - } - }(6) - - testWithTimeLimit("cats effect 2 comprehension 13", 900) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b = 2 - c <- wait.map(_ => 3) - } yield a + b + c - } - }(6) - - testWithTimeLimit("cats effect 2 comprehension 14", 900) { - val wait = IO.sleep(500.millis) - ado { - for { - a <- wait.map(_ => 1) - b = 2 - c <- wait.map(_ => 3) - d = 4 - } yield a + b + c + d - } - }(10) - -} diff --git a/cats-effect-3/src/main/scala/catseffect3.scala b/cats-effect-3/src/main/scala/catseffect3.scala deleted file mode 100644 index 8797679..0000000 --- a/cats-effect-3/src/main/scala/catseffect3.scala +++ /dev/null @@ -1,14 +0,0 @@ -package avocado.instances - -import avocado.AvocADO -import cats.Monad -import cats.effect.kernel.Async - -object catseffect3 { - given [F[_]: Monad: Async] : AvocADO[F] = new AvocADO[F] { - def pure[A](a: A): F[A] = Monad[F].pure(a) - def map[A, B](fa: F[A], f: A => B): F[B] = Monad[F].map(fa)(f) - def zip[A, B](fa: F[A], fb: F[B]): F[(A, B)] = Async[F].both(fa, fb) - def flatMap[A, B](fa: F[A], f: A => F[B]): F[B] = Monad[F].flatMap(fa)(f) - } -} diff --git a/cats-effect-2/src/main/scala/catseffect2.scala b/cats/src/main/scala/cats.scala similarity index 62% rename from cats-effect-2/src/main/scala/catseffect2.scala rename to cats/src/main/scala/cats.scala index 9409c21..b7d9022 100644 --- a/cats-effect-2/src/main/scala/catseffect2.scala +++ b/cats/src/main/scala/cats.scala @@ -1,14 +1,13 @@ package avocado.instances import avocado.AvocADO -import cats.Monad -import cats.Parallel +import _root_.cats.{Monad, Parallel} -object catseffect2 { +object cats { given [F[_]: Monad: Parallel] : AvocADO[F] = new AvocADO[F] { def pure[A](a: A): F[A] = Monad[F].pure(a) def map[A, B](fa: F[A], f: A => B): F[B] = Monad[F].map(fa)(f) - def zip[A, B](fa: F[A], fb: F[B]): F[(A, B)] = Parallel.parAp[F, B, (A, B)](Monad[F].map(fa)(a => (b: B) => a -> b))(fb) + def zip[A, B](fa: F[A], fb: F[B]): F[(A, B)] = Parallel.parTuple2(fa, fb) def flatMap[A, B](fa: F[A], f: A => F[B]): F[B] = Monad[F].flatMap(fa)(f) } } diff --git a/cats-effect-3/src/test/scala/BaseCatsEffect3Test.scala b/cats/src/test/scala/BaseCatsEffect3Test.scala similarity index 100% rename from cats-effect-3/src/test/scala/BaseCatsEffect3Test.scala rename to cats/src/test/scala/BaseCatsEffect3Test.scala diff --git a/cats-effect-3/src/test/scala/CatsEffect3TCTests.scala b/cats/src/test/scala/CatsEffect3TCTests.scala similarity index 82% rename from cats-effect-3/src/test/scala/CatsEffect3TCTests.scala rename to cats/src/test/scala/CatsEffect3TCTests.scala index 55650c7..b66ad71 100644 --- a/cats-effect-3/src/test/scala/CatsEffect3TCTests.scala +++ b/cats/src/test/scala/CatsEffect3TCTests.scala @@ -1,11 +1,10 @@ package avocado.tests import avocado.* -import avocado.instances.catseffect3.given +import avocado.instances.cats.given import scala.concurrent.duration.* import cats.Monad -import cats.effect.kernel.Async import cats.syntax.all.* import cats.effect.IO import cats.effect.unsafe.implicits.* @@ -14,7 +13,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 1", 900) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- Monad[F].pure(1) } yield a @@ -24,7 +23,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 2", 900) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => 2) @@ -35,7 +34,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 3", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => 2) @@ -48,7 +47,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 4", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => 2) @@ -62,7 +61,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 5", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => 2) @@ -76,7 +75,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 6", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => 2) @@ -92,7 +91,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 7", 900) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => 2) @@ -104,7 +103,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 8", 900) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => 2) @@ -117,7 +116,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 9", 900) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { _ <- wait a <- wait.map(_ => 1) @@ -131,7 +130,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 10", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) _ <- wait.map(_ => a) @@ -144,7 +143,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 11", 900) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => { @@ -158,7 +157,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 12", 900) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => { @@ -176,7 +175,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 13", 900) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b = 2 @@ -188,7 +187,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 14", 900) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b = 2 @@ -201,7 +200,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 15", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b = 2 @@ -214,7 +213,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 16", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b = 2 @@ -227,7 +226,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 17", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => 2) @@ -241,7 +240,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 18", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b <- wait.map(_ => 2) @@ -255,7 +254,7 @@ class CatsEffect3TCTests extends BaseCatsEffect3Test { testWithTimeLimit("cats effect 3 comprehension with typeclasses 19", 1400) { val wait = IO.sleep(500.millis) - def run[F[_]: Monad: Async](wait: F[Unit]): F[Int] = ado { + def run[F[_]: Monad: AvocADO](wait: F[Unit]): F[Int] = ado { for { a <- wait.map(_ => 1) b = 2 diff --git a/cats-effect-3/src/test/scala/CatsEffect3Tests.scala b/cats/src/test/scala/CatsEffect3Tests.scala similarity index 99% rename from cats-effect-3/src/test/scala/CatsEffect3Tests.scala rename to cats/src/test/scala/CatsEffect3Tests.scala index 4274d32..da60296 100644 --- a/cats-effect-3/src/test/scala/CatsEffect3Tests.scala +++ b/cats/src/test/scala/CatsEffect3Tests.scala @@ -1,7 +1,7 @@ package avocado.tests import avocado.* -import avocado.instances.catseffect3.given +import avocado.instances.cats.given import scala.concurrent.duration.* import cats.effect.IO From 5f2fcb1677e93ee5fca75526205769d4b2280f3c Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Tue, 27 Sep 2022 10:07:37 +0200 Subject: [PATCH 2/3] Update README + try reducing possibility of flaky tests --- README.md | 13 ++++++++----- zio-1/src/test/scala/ZIO1Tests.scala | 6 +++--- zio-2/src/test/scala/ZIO2Tests.scala | 6 +++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index c70c5e2..534f7ed 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![avocado Scala version support](https://index.scala-lang.org/virtuslab/avocado/avocado/latest.svg)](https://index.scala-lang.org/virtuslab/avocado/avocado) +[![avocado Scala version support](https://index.scala-lang.org/virtuslab/avocado/avocado/latest-by-scala-version.svg?platform=jvm)](https://index.scala-lang.org/virtuslab/avocado/avocado) # avocADO - Safe compile-time parallelization of `for` comprehensions @@ -8,7 +8,7 @@ import cats.effect.IO import avocado.* -import avocado.instances.catseffect3.given +import avocado.instances.cats.given val run: IO[Int] = ado { @@ -42,8 +42,9 @@ The name `avocADO` is a pun on the most important function exposed by the librar ```scala libraryDependencies ++= Seq( "org.virtuslab" %% "avocado" % "version from the badge", - "org.virtuslab" %% "avocado-cats-effect-3" % "version from the badge", // for Cats Effect 3.x + "org.virtuslab" %% "avocado-cats" % "version from the badge", // for Cats "org.virtuslab" %% "avocado-zio-2" % "version from the badge", // for ZIO 2.x + "org.virtuslab" %% "avocado-zio-1" % "version from the badge", // for ZIO 1.x ) ``` @@ -51,8 +52,9 @@ libraryDependencies ++= Seq( ```scala //> using lib "org.virtuslab::avocado:version from the badge" -//> using lib "org.virtuslab::avocado-cats-effect-3:version from the badge" // for Cats Effect 3.x +//> using lib "org.virtuslab::avocado-cats:version from the badge" // for Cats //> using lib "org.virtuslab::avocado-zio-2:version from the badge" // for ZIO 2.x +//> using lib "org.virtuslab::avocado-zio-1:version from the badge" // for ZIO 1.x ``` ## Usage (in code) @@ -61,8 +63,9 @@ All you need to do in order to use `avocADO` is to import the `ado` function and ```scala import avocado.* // This line exposes the `ado` function - entrypoint of the library // You should choose one of the following imports depending on your effect system of choice -import avocado.instances.catseffect3.given +import avocado.instances.cats.given import avocado.instances.zio2.given +import avocado.instances.zio1.given ``` And that's it! All that's left is to wrap the `for`-comprehensions that you want to parallelize with a call to `ado` an watch your program run in parallel! Like so: diff --git a/zio-1/src/test/scala/ZIO1Tests.scala b/zio-1/src/test/scala/ZIO1Tests.scala index 91ceb87..efc5526 100644 --- a/zio-1/src/test/scala/ZIO1Tests.scala +++ b/zio-1/src/test/scala/ZIO1Tests.scala @@ -8,11 +8,11 @@ import zio.duration.* class ZIO1Tests extends BaseZIO1Test { - testWithTimeLimit("ZIO1 comprehension 1", 900) { - val wait = ZIO.sleep(500.millis) + testWithTimeLimit("ZIO1 comprehension 1", 4000) { + val wait = ZIO.sleep(1000.millis) ado { for { - a <- ZIO.succeed(1) + a <- wait.map(_ => 1) } yield a } }(Right(1)) diff --git a/zio-2/src/test/scala/ZIO2Tests.scala b/zio-2/src/test/scala/ZIO2Tests.scala index 1ad48c5..29c8216 100644 --- a/zio-2/src/test/scala/ZIO2Tests.scala +++ b/zio-2/src/test/scala/ZIO2Tests.scala @@ -7,11 +7,11 @@ import zio.* class ZIO2Tests extends BaseZIO2Test { - testWithTimeLimit("ZIO2 comprehension 1", 900) { - val wait = ZIO.sleep(500.millis) + testWithTimeLimit("ZIO2 comprehension 1", 4000) { + val wait = ZIO.sleep(1000.millis) ado { for { - a <- ZIO.succeed(1) + a <- wait.map(_ => 1) } yield a } }(Right(1)) From 3bfeed5e89ecab7a2edb2160a2846c4f3a0bd5c9 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Tue, 27 Sep 2022 10:09:43 +0200 Subject: [PATCH 3/3] Rename workflows --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1525acc..53e50da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: CI +name: AvocADO on: push: @@ -11,7 +11,7 @@ env: branch-name: ${GITHUB_REF#refs/heads/} jobs: - buildSbt: + test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2