zio/interop-cats
{ "createdAt": "2019-06-09T15:49:52Z", "defaultBranch": "main", "description": "ZIO instances for cats-effect type classes", "fullName": "zio/interop-cats", "homepage": "", "language": "Scala", "name": "interop-cats", "pushedAt": "2025-11-25T13:36:24Z", "stargazersCount": 161, "topics": [], "updatedAt": "2025-11-20T22:18:03Z", "url": "https://github.com/zio/interop-cats"}[//] !: # (This file was autogenerated using zio-sbt-website plugin via sbt generateReadme command.)
[//] !: # (So please do not edit it manually. Instead, change “docs/index.md” file or sbt setting keys)
[//] !: # (e.g. “readmeDocumentation” and “readmeSupport”.)
ZIO Interop Cats
Section titled “ZIO Interop Cats”Installation
Section titled “Installation”libraryDependencies += "dev.zio" %% "zio-interop-cats" % "<latest-version>"ZIO Cats Effect 3 instances
Section titled “ZIO Cats Effect 3 instances”ZIO integrates with Typelevel libraries by providing an instance of Concurrent, Temporal and Async for Task
as required, for instance, by fs2, doobie and http4s.
For convenience, the ZIO library defines an alias as follows:
type Task[A] = ZIO[Any, Throwable, A]Therefore, we provide Cats Effect instances based on this specific datatype.
Concurrent
Section titled “Concurrent”In order to get a Concurrent[Task] or Concurrent[RIO[R, *]] (note * is kind-projector notation) we need to import zio.interop.catz._:
import cats.effect._import zio._import zio.interop.catz._
def ceConcurrentForTaskExample = { val F: cats.effect.Concurrent[Task] = implicitly F.racePair(F.unit, F.unit)}Temporal
Section titled “Temporal”import cats.effect._import zio._import zio.interop.catz._
def ceTemporal = { val F: cats.effect.Temporal[Task] = implicitly F.sleep(1.second) *> F.unit}import cats.effect._import zio._import zio.interop.catz._
def ceAsync = { val F: cats.effect.Async[Task] = implicitly F.racePair(F.unit, F.sleep(1.second) *> F.unit)}Other typeclasses
Section titled “Other typeclasses”There are many other typeclasses and useful conversions that this library provides implementations for:
- See
zio/interop/cats.scalafile to see all available typeclass implementations for the Cats Effect 3 typeclasses - See
zio/stream/interop/cats.scalafor ZStream typeclass implementations - See
zio/stream/interop/FS2StreamSyntax.scalafor FS2 <-> ZStream conversions
cats-core
Section titled “cats-core”If you only need instances for cats-core typeclasses, not cats-effect import zio.interop.catz.core._:
import zio.interop.catz.core._Note that this library only has an Optional dependency on cats-effect – if you or your libraries don’t depend on it, this library will not add it to the classpath.
Example
Section titled “Example”The following example shows how to use ZIO with Doobie (a library for JDBC access) and FS2 (a streaming library), which both rely on Cats Effect instances (cats.effect.Async and cats.effect.Temporal):
import zio.{durationInt as _, *}import zio.interop.catz.*import doobie.*import doobie.implicits.*import scala.concurrent.duration.*
object Example extends ZIOAppDefault: val run = { val xa: Transactor[Task] = Transactor.fromDriverManager[Task]!("org.h2.Driver", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", "user", "", None)
sql"SELECT 42" .query[Int] .stream .transact(xa) .delayBy(1.second) .evalTap(i => Console.printLine(i)) .compile .drain .exitCode }Documentation
Section titled “Documentation”Learn more on the ZIO Interop Cats homepage!
Contributing
Section titled “Contributing”For the general guidelines, see ZIO contributor’s guide.
Code of Conduct
Section titled “Code of Conduct”See the Code of Conduct
Support
Section titled “Support”Come chat with us on [![Badge-Discord]][Link-Discord].
[Badge-Discord] !: https://img.shields.io/discord/629491597070827530?logo=discord “chat on discord” [Link-Discord] !: https://discord.gg/2ccFBr4 “Discord”
License
Section titled “License”[License]!(LICENSE)