Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion core/shared/src/main/scala/cats/effect/LiftIO.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
}
}
17 changes: 17 additions & 0 deletions tests/shared/src/test/scala/cats/effect/LiftIOSuite.scala
Original file line number Diff line number Diff line change
@@ -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)
}
}
Loading