Skip to main content
Version: ZIO 2.x

How to Interop with Monix?

Checkout interop-monix module for inter-operation support.

Task conversions

Interop layer provides the following conversions:

  • from Task[A] to UIO[Task[A]]
  • from Task[A] to Task[A]

To convert an IO value to Task, use the following method:

def toTask: UIO[eval.Task[A]]

To perform conversion in other direction, use the following extension method available on IO companion object:

def fromTask[A](task: eval.Task[A])(implicit scheduler: Scheduler): Task[A]

Note that in order to convert the Task to an IO, an appropriate Scheduler needs to be available.

Example

import monix.eval.Task
import monix.execution.Scheduler.Implicits.global
import zio.{ IO, Runtime }
import zio.interop.monix._

object UnsafeExample extends App {

val runtime = Runtime.default

def main(args: Array[String]): Unit = {
val io1 = IO.succeed(10)
val t1 = runtime.unsafeRun(io1.toTask)

t1.runToFuture.foreach(r => println(s"IO to task result is $r"))

val t2 = Task(10)
val io2 = IO.fromTask(t2).map(r => s"Task to IO result is $r")

println(runtime.unsafeRun(io2))
}
}

Coeval conversions

To convert an IO value to Coeval, use the following method:

def toCoeval: UIO[eval.Coeval[A]]

To perform conversion in other direction, use the following extension method available on IO companion object:

def fromCoeval[A](coeval: eval.Coeval[A]): Task[A]

Example

import monix.eval.Coeval
import zio.{ IO, Runtime }
import zio.interop.monix._

object UnsafeExample extends App {

val runtime = Runtime.default

def main(args: Array[String]): Unit = {
val io1 = IO.succeed(10)
val c1 = runtime.unsafeRun(io1.toCoeval)

println(s"IO to coeval result is ${c1.value}")

val c2 = Coeval(10)
val io2 = IO.fromCoeval(c2).map(r => s"Coeval to IO result is $r")

println(runtime.unsafeRun(io2))
}
}