From 3b248a1f1c34fdc6df5b8946beb6686923503a21 Mon Sep 17 00:00:00 2001
From: Karan Ahlawat <ahlawatkaran12@gmail.com>
Date: Tue, 14 Jan 2025 19:30:48 +0530
Subject: [PATCH] remove trace implicit, convert to Tagless Final style using
 Sync class

---
 .../magnum/magcats/cats-effect.scala          | 48 +++++++++----------
 .../ImmutableRepoCatsEffectTests.scala        |  5 +-
 2 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/magnum-cats-effect/src/main/scala/com/augustnagro/magnum/magcats/cats-effect.scala b/magnum-cats-effect/src/main/scala/com/augustnagro/magnum/magcats/cats-effect.scala
index fa60fb9..26f14dd 100644
--- a/magnum-cats-effect/src/main/scala/com/augustnagro/magnum/magcats/cats-effect.scala
+++ b/magnum-cats-effect/src/main/scala/com/augustnagro/magnum/magcats/cats-effect.scala
@@ -1,15 +1,12 @@
 package com.augustnagro.magnum.magcats
 
-import javax.sql.DataSource
-import com.augustnagro.magnum.DbCon
-import cats.effect.IO
-import com.augustnagro.magnum.Transactor
-import cats.effect.kernel.Resource
+import cats.effect.Sync
+import cats.effect.Resource
+import com.augustnagro.magnum.{DbCon, DbTx, Transactor}
+
 import java.sql.Connection
-import com.augustnagro.magnum.DbTx
-import cats.effect.unsafe.IORuntime
+import javax.sql.DataSource
 import scala.util.control.NonFatal
-import natchez.Trace
 
 /** Executes a given query on a given DataSource
   *
@@ -23,9 +20,7 @@ import natchez.Trace
   *   connect(datasource) { cn ?=> repo.findById(id) }
   * }}}
   */
-def connect[A](dataSource: DataSource)(q: DbCon ?=> A)(using
-    trace: Trace[IO]
-): IO[A] =
+def connect[F[_]: Sync, A](dataSource: DataSource)(q: DbCon ?=> A): F[A] =
   connect(Transactor(dataSource))(q)
 
 /** Executes a given query on a given Transactor
@@ -40,13 +35,15 @@ def connect[A](dataSource: DataSource)(q: DbCon ?=> A)(using
   *   connect(transactor) { cn ?=> repo.findById(id) }
   * }}}
   */
-def connect[A](
+def connect[F[_]: Sync, A](
     transactor: Transactor
-)(q: DbCon ?=> A)(using trace: Trace[IO]): IO[A] =
+)(q: DbCon ?=> A): F[A] =
   Resource
-    .fromAutoCloseable(IO.interruptible(transactor.dataSource.getConnection()))
+    .fromAutoCloseable(
+      Sync[F].interruptible(transactor.dataSource.getConnection())
+    )
     .use { cn =>
-      IO.interruptible {
+      Sync[F].interruptible {
         transactor.connectionConfig(cn)
         q(using DbCon(cn, transactor.sqlLogger))
       }
@@ -64,9 +61,7 @@ def connect[A](
   *   transact(dataSource) { tx ?=> repo.insertReturning(creator) }
   * }}}
   */
-def transact[A](dataSource: DataSource)(q: DbTx ?=> A)(using
-    trace: Trace[IO]
-): IO[A] =
+def transact[F[_]: Sync, A](dataSource: DataSource)(q: DbTx ?=> A): F[A] =
   transact(Transactor(dataSource))(q)
 
 /** Executes a given transaction on a given DataSource
@@ -81,9 +76,12 @@ def transact[A](dataSource: DataSource)(q: DbTx ?=> A)(using
   *   transact(dataSource, ...) { tx ?=> repo.insertReturning(creator) }
   * }}}
   */
-def transact[A](dataSource: DataSource, connectionConfig: Connection => Unit)(
+def transact[F[_]: Sync, A](
+    dataSource: DataSource,
+    connectionConfig: Connection => Unit
+)(
     q: DbTx ?=> A
-)(using trace: Trace[IO]): IO[A] =
+): F[A] =
   val transactor =
     Transactor(dataSource = dataSource, connectionConfig = connectionConfig)
   transact(transactor)(q)
@@ -100,13 +98,15 @@ def transact[A](dataSource: DataSource, connectionConfig: Connection => Unit)(
   *   transact(transactor) { tx ?=> repo.insertReturning(creator) }
   * }}}
   */
-def transact[A](
+def transact[F[_]: Sync, A](
     transactor: Transactor
-)(q: DbTx ?=> A)(using trace: Trace[IO]): IO[A] =
+)(q: DbTx ?=> A): F[A] =
   Resource
-    .fromAutoCloseable(IO.interruptible(transactor.dataSource.getConnection()))
+    .fromAutoCloseable(
+      Sync[F].interruptible(transactor.dataSource.getConnection())
+    )
     .use { cn =>
-      IO.blocking {
+      Sync[F].blocking {
         transactor.connectionConfig(cn)
         cn.setAutoCommit(false)
         try {
diff --git a/magnum-cats-effect/src/test/scala/com/augustnagro/magnum/magcats/ImmutableRepoCatsEffectTests.scala b/magnum-cats-effect/src/test/scala/com/augustnagro/magnum/magcats/ImmutableRepoCatsEffectTests.scala
index 014a841..8acb910 100644
--- a/magnum-cats-effect/src/test/scala/com/augustnagro/magnum/magcats/ImmutableRepoCatsEffectTests.scala
+++ b/magnum-cats-effect/src/test/scala/com/augustnagro/magnum/magcats/ImmutableRepoCatsEffectTests.scala
@@ -23,7 +23,6 @@ def immutableRepoCatsEffectTests(
   import suite.*
 
   given IORuntime = IORuntime.global
-  given natchez.Trace[IO] = natchez.Trace.Implicits.noop
 
   def runIO[A](io: IO[A]): A =
     io.unsafeRunSync()
@@ -96,7 +95,7 @@ def immutableRepoCatsEffectTests(
         magcats.connect(xa()):
           carRepo.findById(3L) -> carRepo.findById(4L)
     assert(exists3.get == allCars.last)
-    assert(exists4 == None)
+    assert(exists4.isEmpty)
 
   test("findAllByIds"):
     assume(dbType != ClickhouseDbType)
@@ -176,7 +175,7 @@ def immutableRepoCatsEffectTests(
       runIO:
         magcats.connect(xa()):
           carRepo.findById(3L)
-    assert(maybeCar.get.vinNumber == None)
+    assert(maybeCar.get.vinNumber.isEmpty)
 
   test("created timestamps should match"):
     val allCars =