diff --git a/core/shared/src/main/scala/cats/effect/LiftIO.scala b/core/shared/src/main/scala/cats/effect/LiftIO.scala index 5aba0460f7..9f51e665b3 100644 --- a/core/shared/src/main/scala/cats/effect/LiftIO.scala +++ b/core/shared/src/main/scala/cats/effect/LiftIO.scala @@ -19,12 +19,13 @@ package cats.effect import cats.{~>, Applicative, FlatMap, Functor} import cats.data.{ContT, EitherT, IorT, Kleisli, OptionT, ReaderWriterStateT, StateT, WriterT} import cats.kernel.Monoid +import cats.mtl.LiftValue trait LiftIO[F[_]] { def liftIO[A](ioa: IO[A]): F[A] } -object LiftIO { +object LiftIO extends LiftIOInstances0 { def apply[F[_]](implicit F: LiftIO[F]): F.type = F @@ -155,3 +156,10 @@ object LiftIO { Resource.eval(F0.liftIO(ioa)) } } + +private[effect] sealed trait LiftIOInstances0 { + implicit def catsEffectLiftIOFromLiftValue[F[_]](implicit lift: LiftValue[IO, F]): LiftIO[F] = + new LiftIO[F] { + override def liftIO[A](ioa: IO[A]): F[A] = lift(ioa) + } +} diff --git a/tests/shared/src/test/scala/cats/effect/LiftIOSuite.scala b/tests/shared/src/test/scala/cats/effect/LiftIOSuite.scala new file mode 100644 index 0000000000..78e17a226b --- /dev/null +++ b/tests/shared/src/test/scala/cats/effect/LiftIOSuite.scala @@ -0,0 +1,17 @@ +package cats.effect + +import cats.Applicative +import cats.data.IdT +import cats.mtl.LiftValue + +class LiftIOSuite extends BaseSuite { + ticked("LiftIO from LiftValue") { implicit ticker => + implicit val lift: LiftValue[IO, IdT[IO, *]] = + new LiftValue[IO, IdT[IO, *]] { + def applicativeF: Applicative[IO] = implicitly + def applicativeG: Applicative[IdT[IO, *]] = implicitly + def apply[A](fa: IO[A]): IdT[IO, A] = IdT(fa) + } + assertCompleteAs(IO.pure(42).to[IdT[IO, *]].value, 42) + } +}