diff --git a/modules/core/src/main/scala/doobie/syntax/connectionio.scala b/modules/core/src/main/scala/doobie/syntax/connectionio.scala index c74255317..705f80d15 100644 --- a/modules/core/src/main/scala/doobie/syntax/connectionio.scala +++ b/modules/core/src/main/scala/doobie/syntax/connectionio.scala @@ -14,6 +14,8 @@ import doobie.hi.{connection as IHC} class ConnectionIOOps[A](ma: ConnectionIO[A]) { def transact[M[_]: MonadCancelThrow](xa: Transactor[M]): M[A] = xa.trans.apply(ma) + + def transactRaw[M[_]: MonadCancelThrow](xa: Transactor[M]): M[A] = xa.rawTrans.apply(ma) } class OptionTConnectionIOOps[A](ma: OptionT[ConnectionIO, A]) { @@ -21,6 +23,11 @@ class OptionTConnectionIOOps[A](ma: OptionT[ConnectionIO, A]) { OptionT( xa.trans.apply(ma.orElseF(IHC.rollback.as(None)).value) ) + + def transactRaw[M[_]: MonadCancelThrow](xa: Transactor[M]): OptionT[M, A] = + OptionT( + xa.rawTrans.apply(ma.orElseF(IHC.rollback.as(None)).value) + ) } class EitherTConnectionIOOps[E, A](ma: EitherT[ConnectionIO, E, A]) { @@ -28,11 +35,19 @@ class EitherTConnectionIOOps[E, A](ma: EitherT[ConnectionIO, E, A]) { EitherT( xa.trans.apply(ma.leftSemiflatMap(IHC.rollback.as(_)).value) ) + + def transactRaw[M[_]: MonadCancelThrow](xa: Transactor[M]): EitherT[M, E, A] = + EitherT( + xa.rawTrans.apply(ma.leftSemiflatMap(IHC.rollback.as(_)).value) + ) } class KleisliConnectionIOOps[A, B](ma: Kleisli[ConnectionIO, A, B]) { def transact[M[_]: MonadCancelThrow](xa: Transactor[M]): Kleisli[M, A, B] = ma.mapK(xa.trans) + + def transactRaw[M[_]: MonadCancelThrow](xa: Transactor[M]): Kleisli[M, A, B] = + ma.mapK(xa.rawTrans) } trait ToConnectionIOOps { diff --git a/modules/core/src/test/scala/doobie/util/ConnectionIOSuite.scala b/modules/core/src/test/scala/doobie/util/ConnectionIOSuite.scala index 31f70f0f5..74909f8d3 100644 --- a/modules/core/src/test/scala/doobie/util/ConnectionIOSuite.scala +++ b/modules/core/src/test/scala/doobie/util/ConnectionIOSuite.scala @@ -26,8 +26,17 @@ class ConnectionIOSuite extends munit.CatsEffectSuite { prg.transact(xa).assertEquals(List(1, 2, 3, 4, 5, 6)) } + test("Semigroup ConnectionIO raw") { + val prg = Applicative[ConnectionIO].pure(List(1, 2, 3)) `combine` Applicative[ConnectionIO].pure(List(4, 5, 6)) + prg.transactRaw(xa).assertEquals(List(1, 2, 3, 4, 5, 6)) + } + test("Monoid ConnectionIO") { Monoid[ConnectionIO[List[Int]]].empty.transact(xa).assertEquals(Nil) } + test("Monoid ConnectionIO raw") { + Monoid[ConnectionIO[List[Int]]].empty.transactRaw(xa).assertEquals(Nil) + } + }