Typelevel Cats Integration

You are viewing the documentation for the older Monix 2.x series.
For the latest version: see here!

Monix provides integration with Typelevel’s Cats library, implementing useful type-classes for the data types exposed.

Adding the Optional Dependency #

The monix-cats is an optional dependency that you can add alongside the main Monix dependency. So in build.sbt:

libraryDependencies ++= Seq(
  "io.monix" %% "monix" % "2.3.3",
  "io.monix" %% "monix-cats" % "2.3.3"
)

Or maybe you want to use just Task along with this integration:

libraryDependencies ++= Seq(
  "io.monix" %% "monix-eval" % "2.3.3",
  "io.monix" %% "monix-cats" % "2.3.3"
)

For more details, see Usage in SBT and Maven.

Usage #

You just need to import the defined implicits:

import monix.cats._

This will bring Monix’s type-class instances in scope. And now we can verify that Task is indeed a cats.Monad:

import cats.Monad
import monix.eval.Task

implicitly[Monad[Task]]
// res0: Monad[Task] = monix.cats.MonixToCatsCore11$MonixToCatsMonadRec@68ef5ac6

In case you want a more à la carte importing experience, that’s possible as well:

import monix.cats.monixToCatsMonad

What these imports are doing is to convert the types defined in monix.types to Cats’ type-classes. However the convertion can also work in reverse:

import monix.cats.reverse._

Here is a reverse conversion in action, pulling a monix.types.Monad[cats.Eval]:

implicitly[monix.types.Monad[cats.Eval]]
// res2: monix.types.Monad[cats.Eval] = monix.cats.CatsCoreToMonix2$$anon$4@6c2fb56b

Note that having both of these wildcard imports in scope generates problems, so avoid doing it:

// DO NOT DO THIS!
import monix.cats._
import monix.cats.reverse._

That’s it, now you can use the Cats awesome type-classes along with Monix’s abstractions, such as Coeval, Task and Observable.