Skip to content

Commit

Permalink
Update cats-effect, add Scala 3
Browse files Browse the repository at this point in the history
  • Loading branch information
kubukoz committed Apr 16, 2024
1 parent 14dd07a commit 52f1b3d
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 31 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.kubukoz/slick-effect_2.12/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.kubukoz/slick-effect_2.12)
[![License](https://img.shields.io/:license-Apache%202-green.svg)](https://www.apache.org/licenses/LICENSE-2.0.txt)

Compatibility tools for Slick + cats-effect. Released for Scala 2.12 and 2.13.
Compatibility tools for Slick + cats-effect. Released for Scala 2.12, 2.13 and Scala 3 (3.3.x and above).

## Usage

Expand Down
24 changes: 8 additions & 16 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
val Scala_2_12 = "2.12.17"
val Scala_2_13 = "2.13.13"

val catsEffectVersion = "3.3.14"
val Scala_3 = "3.3.3"

val catsEffectVersion = "3.5.4"

inThisBuild(
List(
Expand All @@ -24,7 +26,7 @@ inThisBuild(
val GraalVM11 = "graalvm-ce-java11@20.3.0"

ThisBuild / scalaVersion := Scala_2_12
ThisBuild / crossScalaVersions := Seq(Scala_2_12, Scala_2_13)
ThisBuild / crossScalaVersions := Seq(Scala_2_12, Scala_2_13, Scala_3)
ThisBuild / githubWorkflowJavaVersions := Seq(GraalVM11)
ThisBuild / githubWorkflowBuild := Seq(
WorkflowStep.Sbt(List("test", "mimaReportBinaryIssues"))
Expand All @@ -51,11 +53,11 @@ ThisBuild / githubWorkflowEnv ++= List(
}.toMap

def compilerPlugins(scalaVersion: String) =
List(
if (scalaVersion.startsWith("3.")) Nil
else
compilerPlugin(
"org.typelevel" % "kind-projector" % "0.13.3" cross CrossVersion.full
)
)
) :: Nil

val commonSettings = Seq(
Test / fork := true,
Expand Down Expand Up @@ -94,15 +96,6 @@ val transactor =
name := "slick-effect-transactor"
)

def versionSpecificDeps(scalaVersion: String) =
if (scalaVersion.startsWith("2.13")) Nil
else
List(
compilerPlugin(
"org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full
)
)

def versionSpecificOptions(scalaVersion: String) =
if (scalaVersion.startsWith("2.13"))
List("-Ymacro-annotations")
Expand All @@ -115,12 +108,11 @@ val examples = project
publish / skip := true,
libraryDependencies ++= Seq(
"org.typelevel" %% "cats-effect-kernel" % catsEffectVersion,
"org.typelevel" %% "cats-tagless-macros" % "0.15.0",
"org.typelevel" %% "cats-tagless-core" % "0.15.0",
"org.postgresql" % "postgresql" % "42.7.3"
),
mimaPreviousArtifacts := Set.empty
)
.settings(libraryDependencies ++= versionSpecificDeps(scalaVersion.value))
.settings(scalacOptions ++= versionSpecificOptions(scalaVersion.value))
.dependsOn(core, catsio, transactor)

Expand Down
2 changes: 1 addition & 1 deletion core/src/main/scala/slickeffect/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import cats.syntax.all._
package object slickeffect {

def liftEffectToDBIO[F[_]: Async]: Resource[F, F ~> DBIO] =
(Dispatcher[F], Async[F].executionContext.toResource)
(Dispatcher.sequential[F], Async[F].executionContext.toResource)
.mapN(liftEffectUsingDispatcher)

def liftEffectUsingDispatcher[F[_]](
Expand Down
32 changes: 24 additions & 8 deletions examples/src/main/scala/com/example/Demo.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,14 @@ import cats.effect.kernel.Async
import cats.effect.std.Console
import cats.effect.unsafe.IORuntime
import cats.syntax.all._
import cats.tagless.autoFunctorK
import cats.tagless.finalAlg
import cats.tagless.implicits._
import cats.~>
import slick.jdbc.JdbcBackend.Database
import slick.jdbc.PostgresProfile.api._
import slickeffect.Transactor
import slickeffect.catsio.implicits._
import slickeffect.implicits._
import cats.tagless.FunctorK

object Demo extends IOApp.Simple {
implicit val rt: IORuntime = runtime
Expand All @@ -40,7 +39,7 @@ object Demo extends IOApp.Simple {
)
} yield {

implicit val xa =
implicit val xa: Transactor[IO] =
transactor.configure(slickeffect.transactor.config.transactionally)

new Application[IO]
Expand All @@ -59,20 +58,29 @@ class Application[F[_]: Async: Transactor](
private val fClient = AsyncClient.instance[F]
private implicit val dbioClient: AsyncClient[DBIO] = fClient.mapK(fToDBIO)
private implicit val repo: Repository[DBIO] = Repository.instance
private implicit val console: Console[DBIO] = cats.effect.std.Console.make[DBIO]
private implicit val console: Console[DBIO] =
cats.effect.std.Console.make[F].mapK(fToDBIO)

private val program = Program.instance[DBIO].mapK(Transactor[F].transactK)

def run = program.run
}

@autoFunctorK
trait Program[F[_]] {
def run: F[Unit]
}

object Program {

implicit val functorK: FunctorK[Program] = new FunctorK[Program] {

def mapK[F[_], G[_]](af: Program[F])(fk: F ~> G): Program[G] =
new Program[G] {
def run: G[Unit] = fk(af.run)
}

}

def instance[
F[_]: AsyncClient: Repository: cats.effect.std.Console: FlatMap
]: Program[F] =
Expand All @@ -88,12 +96,12 @@ object Program {

}

@finalAlg
trait Repository[F[_]] {
def findAll: F[List[String]]
}

object Repository {
def apply[F[_]](implicit ev: Repository[F]): Repository[F] = ev

def instance(implicit ec: ExecutionContext): Repository[DBIO] =
new Repository[DBIO] {
Expand All @@ -103,13 +111,21 @@ object Repository {

}

@autoFunctorK
@finalAlg
trait AsyncClient[F[_]] {
def execute: F[Unit]
}

object AsyncClient {
def apply[F[_]](implicit ev: AsyncClient[F]): AsyncClient[F] = ev

implicit val functorK: FunctorK[AsyncClient] = new FunctorK[AsyncClient] {

def mapK[F[_], G[_]](af: AsyncClient[F])(fk: F ~> G): AsyncClient[G] =
new AsyncClient[G] {
def execute: G[Unit] = fk(af.execute)
}

}

def instance[F[_]: Async]: AsyncClient[F] =
new AsyncClient[F] {
Expand Down
12 changes: 8 additions & 4 deletions transactor/src/main/scala/slickeffect/Transactor.scala
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package slickeffect

import cats.effect.kernel.{Async, Resource, Sync}
import cats.effect.kernel.Async
import cats.effect.kernel.Resource
import cats.effect.kernel.Sync
import cats.~>
import slick.basic.DatabaseConfig
import slick.dbio.DBIO
import slick.jdbc.{JdbcBackend, JdbcProfile}
import slick.jdbc.JdbcBackend
import slick.jdbc.JdbcProfile

trait Transactor[F[_]] {
def transact[A](dbio: DBIO[A]): F[A] = transactK(dbio)
Expand All @@ -29,8 +32,9 @@ object Transactor {
.make(dbF)(db => Async[F].fromFuture(Sync[F].delay(db.shutdown)))
.map { db =>
liftK {
λ[DBIO ~> F] { dbio =>
Async[F].fromFuture(Sync[F].delay(db.run(dbio)))
new (DBIO ~> F) {
def apply[A](fa: DBIO[A]): F[A] =
Async[F].fromFuture(Sync[F].delay(db.run(fa)))
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ object config {
*/
def transactionally(implicit profile: JdbcProfile): DBIO ~> DBIO = {
import profile.api.{DBIO => _, _}
λ[DBIO ~> DBIO](_.transactionally)
new (DBIO ~> DBIO) {
def apply[A](fa: DBIO[A]): DBIO[A] = fa.transactionally
}
}

}

0 comments on commit 52f1b3d

Please sign in to comment.