ZIO Cheat Sheet
March 25, 2023 ยท View on GitHub
- This is based on ZIO 2.0.X (in particular 2.0.10).
- For simplicity, ZIO environment has been omitted but all the functions also work with the form
ZIO[R, E, A]. - Function arguments are usually by name, but that has (mostly) been ignored for simplicity. Also, functions are often "more generic" in their parameter types than shown below.
- For many functions there are several (unmentioned) related functions that are conceptually similar but differ in some detail. They are usually easy to learn due to consistent naming.
- Important ZIO types other than the functional effect type
ZIO[R, E, A]have been left out. For example:ZStream[R, E, A],ZLayer[RIn, E, ROut],Fiber[E, A]andRef[A]. - In the remainder of this cheat sheet,
E1 >: E, butE2can be any error type. AlsoA1 >: A.
Aliases
| Alias | Full Form |
|---|---|
UIO[A] | ZIO[Any, Nothing, A] |
IO[E, A] | ZIO[Any, E, A] |
Task[A] | ZIO[Any, Throwable, A] |
RIO[R, A] | ZIO[R, Throwable, A] |
URIO[R, A] | ZIO[R, Nothing, A] |
Creating effects
| Name | Given | To |
|---|---|---|
| ZIO.succeed | => A | IO[Nothing, A] |
| ZIO.fail | => E | IO[E, Nothing] |
| ZIO.interrupt | IO[Nothing, Nothing] | |
| ZIO.die | Throwable | IO[Nothing, Nothing] |
| ZIO.attempt | => A | IO[Throwable, A] |
| ZIO.async | ((IO[E, A] => Unit) => Unit) FiberId | IO[E, A] |
| ZIO.fromEither | Either[E, A] | IO[E, A] |
| ZIO.left | A | IO[Nothing, Either[A, Nothing]] |
| ZIO.right | B | IO[Nothing, Either[Nothing, B]] |
| ZIO.fromFiber | Fiber[E, A] | IO[E, A] |
| ZIO.fromFuture | ExecutionContext => Future[A] | IO[Throwable, A] |
| ZIO.fromOption | Option[A] | IO[Option[Nothing], A] |
| ZIO.none | IO[Nothing, Option[Nothing]] | |
| ZIO.some | A | IO[Nothing, Option[A]] |
| ZIO.fromTry | Try[A] | IO[Throwable, A] |
| ZIO.acquireReleaseWith | IO[E, A] (acquire) A => IO[Nothing, Any] (release) A => IO[E, B] (use) | IO[E, B] |
| ZIO.when | Boolean IO[E, A] | IO[E, Option[A]] |
| ZIO.whenZIO | IO[E, Boolean] IO[E, A] | IO[E, Option[A]] |
| ZIO.whenCase | A PartialFunction[A, IO[E, B]] | IO[E, Option[B]] |
| ZIO.whenCaseZIO | IO[E, A] PartialFunction[A, IO[E, B]] | IO[E, Option[B]] |
| ZIO.filter | Iterable[A] A => IO[E, Boolean] | IO[E, List[A]] |
| ZIO.cond | Boolean A E | IO[E, A] |
Transforming effects
| Name | From | Given | To |
|---|---|---|---|
| map | IO[E, A] | A => B | IO[E, B] |
| mapAttempt | IO[Throwable, A] | A => B | IO[Throwable, B] |
| as | IO[E, A] | B | IO[E, B] |
| asSome | IO[E, A] | IO[E, Option[A]] | |
| asSomeError | IO[E, A] | IO[Option[E], A] | |
| orElseFail | IO[E, A] | E2 | IO[E2, A] |
| unit | IO[E, A] | IO[E, Unit] | |
| flatMap | IO[E, A] | A => IO[E1, B] | IO[E1, B] |
| flatten | IO[E, IO[E1, A]] | IO[E1, A] | |
| mapBoth | IO[E, A] | E => E2 A => B | IO[E2, B] |
| mapError | IO[E, A] | E => E2 | IO[E2, A] |
| mapErrorCause | IO[E, A] | Cause[E] => Cause[E2] | IO[E2, A] |
| flatMapError | IO[E, A] | E => IO[Nothing, E2] | IO[E2, A] |
| collect | IO[E, A] | E1 PartialFunction[A, B] | IO[E1, B] |
| sandbox | IO[E, A] | IO[Cause[E], A] | |
| flip | IO[E, A] | IO[A, E] | |
| tap | IO[E, A] | A => IO[E1, _] | IO[E1, A] |
| tapBoth | IO[E, A] | E => IO[E1, _] A => IO[E1, _] | IO[E1, A] |
| tapError | IO[E, A] | E => IO[E1, _] | IO[E1, A] |
| absolve | IO[E, Either[E, A]] | IO[E, A] | |
| some | IO[E, Option[A]] | IO[Option[E], A] | |
| head | IO[E, List[A]] | IO[Option[E], A] | |
| toFuture | IO[Throwable, A] | IO[Nothing, Future[A]] | |
| filterOrDie | IO[E, A] | A => Boolean Throwable | IO[E, A] |
| filterOrDieMessage | IO[E, A] | A => Boolean String | IO[E, A] |
| filterOrElse | IO[E, A] | A => Boolean A => IO[E, A] | IO[E, A] |
| filterOrFail | IO[E, A] | A => Boolean E | IO[E, A] |
| when | IO[E, A] | Boolean | IO[E, Option[A]] |
| unless | IO[E, A] | Boolean | IO[E, Option[A]] |
Declaring and providing the environment
| Name | From | Given | To |
|---|---|---|---|
| ZIO.service | given Tag[A] | ZIO[A, Nothing, A] | |
| provideEnvironment | ZIO[R, E, A] | ZEnvironment[R] | IO[E, A] |
| provideLayer | ZIO[R, E, A] | ZLayer[R0, E, R] | ZIO[R0, E, A] |
Configuration
| Name | From | Given | To |
|---|---|---|---|
| ZIO.config | Config[A] | IO[Config.Error, A] |
Recover from errors
| Name | From | Given | To |
|---|---|---|---|
| either | IO[E, A] | IO[Nothing, Either[E, A]] | |
| option | IO[E, A] | IO[Nothing, Option[A]] | |
| ignore | IO[E, A] | IO[Nothing, Unit] | |
| exit | IO[E, A] | IO[Nothing, Exit[E, A]] | |
<> (orElse) | IO[E, A] | IO[E2, A1] | IO[E2, A1] |
| orElseEither | IO[E, A] | IO[E2, B] | IO[E2, Either[A, B]] |
| fold | IO[E, A] | E => B A => B | IO[Nothing, B] |
| foldZIO | IO[E, A] | E => IO[E2, B] A => IO[E2, B] | IO[E2, B] |
| foldCauseZIO | IO[E, A] | Cause[E] => IO[E2, B] A => IO[E2, B] | IO[E2, B] |
| catchAll | IO[E, A] | E => IO[E2, A1] | IO[E2, A1] |
| catchAllCause | IO[E, A] | Cause[E] => IO[E2, A1] | IO[E2, A1] |
| catchSome | IO[E, A] | PartialFunction[E, IO[E1, A1]] | IO[E1, A1] |
| retry | IO[E, A] | Schedule[E, S] | IO[E, A] |
| eventually | IO[E, A] | IO[Nothing, A] |
Terminate fiber with errors
| Name | From | Given | To |
|---|---|---|---|
| orDie | IO[Throwable, A] | IO[Nothing, A] | |
| orDieWith | IO[E, A] | E => Throwable | IO[Nothing, A] |
| refineOrDie | IO[Throwable, A] | PartialFunction[Throwable, E2] | IO[E2, A] |
| refineOrDieWith | IO[E, A] | PartialFunction[E, E2] E => Throwable | IO[E2, A] |
Combining effects + parallelism
| Name | From | Given | To |
|---|---|---|---|
| ZIO.foldLeft | Iterable[A] S (S, A) => IO[E, S] | IO[E, S] | |
| ZIO.foreach | Iterable[A] A => IO[E, B] | IO[E, List[B]] | |
| ZIO.foreachPar | Iterable[A] A => IO[E, B] | IO[E, List[B]] | |
| ZIO.collectAll | Iterable[IO[E, A]] | IO[E, List[A]] | |
| ZIO.collectAllPar | Iterable[IO[E, A]] | IO[E, List[A]] | |
| ZIO.forkAll | Iterable[IO[E, A]] | IO[Nothing, Fiber[E, List[A]]] | |
| fork | IO[E, A] | IO[Nothing, Runtime[E, A]] | |
<*> (zip) | IO[E, A] | IO[E1, B] | IO[E1, (A, B)] |
*> (zipRight) | IO[E, A] | IO[E1, B] | IO[E1, B] |
<* (zipLeft) | IO[E, A] | IO[E1, B] | IO[E1, A] |
<&> (zipPar) | IO[E, A] | IO[E1, B] | IO[E1, (A, B)] |
&> (zipParRight) | IO[E, A] | IO[E1, B] | IO[E1, B] |
<& (zipParLeft) | IO[E, A] | IO[E1, B] | IO[E1, A] |
| race | IO[E, A] | IO[E1, A1] | IO[E1, A1] |
| raceAll | IO[E, A] | Iterable[IO[E1, A1]] | IO[E1, A1] |
| raceEither | IO[E, A] | IO[E1, B] | IO[E1, Either[A, B]] |
Finalizers
| Name | From | Given | To |
|---|---|---|---|
| ensuring | IO[E, A] | UIO[_] | IO[E, A] |
| onError | IO[E, A] | Cause[E] => UIO[_] | IO[E, A] |
| onInterrupt | IO[E, A] | UIO[_] | IO[E, A] |
| onTermination | IO[E, A] | Cause[Nothing] => UIO[_] | IO[E, A] |
Timing and repetition
| Name | From | Given | To |
|---|---|---|---|
| ZIO.never | IO[Nothing, Nothing] | ||
| ZIO.sleep | Duration | IO[Nothing, Unit] | |
| delay | IO[E, A] | Duration | IO[E, A] |
| timeout | IO[E, A] | Duration | IO[E, Option[A]] |
| timed | IO[E, A] | IO[E, (Duration, A)] | |
| forever | IO[E, A] | IO[E, Nothing] | |
| repeat | IO[E, A] | Schedule[A, B] | IO[E, B] |
| repeatUntil | IO[E, A] | A => Boolean | IO[E, A] |
| repeatWhile | IO[E, A] | A => Boolean | IO[E, A] |
Logging
| Name | From | Given | To |
|---|---|---|---|
| ZIO.log | String | IO[Nothing, Unit] | |
| ZIO.logFatal | String | IO[Nothing, Unit] | |
| ZIO.logError | String | IO[Nothing, Unit] | |
| ZIO.logWarning | String | IO[Nothing, Unit] | |
| ZIO.logInfo | String | IO[Nothing, Unit] | |
| ZIO.logDebug | String | IO[Nothing, Unit] | |
| ZIO.logTrace | String | IO[Nothing, Unit] |