├── .github └── FUNDING.yml └── README.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: ghostdogpr 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ZIO Cheat Sheet 2 | 3 | - This is based on [ZIO](https://github.com/zio/zio) 2.0.X (in particular 2.0.10). 4 | - For simplicity, ZIO environment has been omitted but all the functions also work with the form `ZIO[R, E, A]`. 5 | - 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. 6 | - 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. 7 | - 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]` and `Ref[A]`. 8 | - In the remainder of this cheat sheet, `E1 >: E`, but `E2` can be any error type. Also `A1 >: A`. 9 | 10 | ## Aliases 11 | 12 | | Alias | Full Form | 13 | | ------------ | ------------------------ | 14 | | `UIO[A]` | `ZIO[Any, Nothing, A]` | 15 | | `IO[E, A]` | `ZIO[Any, E, A]` | 16 | | `Task[A]` | `ZIO[Any, Throwable, A]` | 17 | | `RIO[R, A]` | `ZIO[R, Throwable, A]` | 18 | | `URIO[R, A]` | `ZIO[R, Nothing, A]` | 19 | 20 | ## Creating effects 21 | 22 | | Name | Given | To | 23 | | --------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------- | 24 | | ZIO.succeed | `=> A` | `IO[Nothing, A]` | 25 | | ZIO.fail | `=> E` | `IO[E, Nothing]` | 26 | | ZIO.interrupt | | `IO[Nothing, Nothing]` | 27 | | ZIO.die | `Throwable` | `IO[Nothing, Nothing]` | 28 | | ZIO.attempt | `=> A` | `IO[Throwable, A]` | 29 | | ZIO.async | `((IO[E, A] => Unit) => Unit)`
FiberId | `IO[E, A]` | 30 | | ZIO.fromEither | `Either[E, A]` | `IO[E, A]` | 31 | | ZIO.left | `A` | `IO[Nothing, Either[A, Nothing]]` | 32 | | ZIO.right | `B` | `IO[Nothing, Either[Nothing, B]]` | 33 | | ZIO.fromFiber | `Fiber[E, A]` | `IO[E, A]` | 34 | | ZIO.fromFuture | `ExecutionContext => Future[A]` | `IO[Throwable, A]` | 35 | | ZIO.fromOption | `Option[A]` | `IO[Option[Nothing], A]` | 36 | | ZIO.none | | `IO[Nothing, Option[Nothing]]` | 37 | | ZIO.some | `A` | `IO[Nothing, Option[A]]` | 38 | | ZIO.fromTry | `Try[A]` | `IO[Throwable, A]` | 39 | | ZIO.acquireReleaseWith | `IO[E, A]` (acquire)
`A => IO[Nothing, Any]` (release)
`A => IO[E, B]` (use) | `IO[E, B]` | 40 | | ZIO.when | `Boolean`
`IO[E, A]` | `IO[E, Option[A]]` | 41 | | ZIO.whenZIO | `IO[E, Boolean]`
`IO[E, A]` | `IO[E, Option[A]]` | 42 | | ZIO.whenCase | `A`
`PartialFunction[A, IO[E, B]]` | `IO[E, Option[B]]` | 43 | | ZIO.whenCaseZIO | `IO[E, A]`
`PartialFunction[A, IO[E, B]]` | `IO[E, Option[B]]` | 44 | | ZIO.filter | `Iterable[A]`
`A => IO[E, Boolean]` | `IO[E, List[A]]` | 45 | | ZIO.cond | `Boolean`
`A`
`E` | `IO[E, A]` | 46 | 47 | ## Transforming effects 48 | 49 | | Name | From | Given | To | 50 | | ------------------ | ------------------------ | --------------------------------------- | ------------------------ | 51 | | map | `IO[E, A]` | `A => B` | `IO[E, B]` | 52 | | mapAttempt | `IO[Throwable, A]` | `A => B` | `IO[Throwable, B]` | 53 | | as | `IO[E, A]` | `B` | `IO[E, B]` | 54 | | asSome | `IO[E, A]` | | `IO[E, Option[A]]` | 55 | | asSomeError | `IO[E, A]` | | `IO[Option[E], A]` | 56 | | orElseFail | `IO[E, A]` | `E2` | `IO[E2, A]` | 57 | | unit | `IO[E, A]` | | `IO[E, Unit]` | 58 | | flatMap | `IO[E, A]` | `A => IO[E1, B]` | `IO[E1, B]` | 59 | | flatten | `IO[E, IO[E1, A]]` | | `IO[E1, A]` | 60 | | mapBoth | `IO[E, A]` | `E => E2`
`A => B` | `IO[E2, B]` | 61 | | mapError | `IO[E, A]` | `E => E2` | `IO[E2, A]` | 62 | | mapErrorCause | `IO[E, A]` | `Cause[E] => Cause[E2]` | `IO[E2, A]` | 63 | | flatMapError | `IO[E, A]` | `E => IO[Nothing, E2]` | `IO[E2, A]` | 64 | | collect | `IO[E, A]` | `E1`
`PartialFunction[A, B]` | `IO[E1, B]` | 65 | | sandbox | `IO[E, A]` | | `IO[Cause[E], A]` | 66 | | flip | `IO[E, A]` | | `IO[A, E]` | 67 | | tap | `IO[E, A]` | `A => IO[E1, _]` | `IO[E1, A]` | 68 | | tapBoth | `IO[E, A]` | `E => IO[E1, _]`
`A => IO[E1, _]` | `IO[E1, A]` | 69 | | tapError | `IO[E, A]` | `E => IO[E1, _]` | `IO[E1, A]` | 70 | | absolve | `IO[E, Either[E, A]]` | | `IO[E, A]` | 71 | | some | `IO[E, Option[A]]` | | `IO[Option[E], A]` | 72 | | head | `IO[E, List[A]]` | | `IO[Option[E], A]` | 73 | | toFuture | `IO[Throwable, A]` | | `IO[Nothing, Future[A]]` | 74 | | filterOrDie | `IO[E, A]` | `A => Boolean`
`Throwable` | `IO[E, A]` | 75 | | filterOrDieMessage | `IO[E, A]` | `A => Boolean`
`String` | `IO[E, A]` | 76 | | filterOrElse | `IO[E, A]` | `A => Boolean`
`A => IO[E, A]` | `IO[E, A]` | 77 | | filterOrFail | `IO[E, A]` | `A => Boolean`
`E` | `IO[E, A]` | 78 | | when | `IO[E, A]` | `Boolean` | `IO[E, Option[A]]` | 79 | | unless | `IO[E, A]` | `Boolean` | `IO[E, Option[A]]` | 80 | 81 | ## Declaring and providing the environment 82 | 83 | | Name | From | Given | To | 84 | | ------------------ | ------------------------ | --------------------------------------- | ------------------------ | 85 | | ZIO.service | | `given Tag[A]` | `ZIO[A, Nothing, A]` | 86 | | provideEnvironment | `ZIO[R, E, A]` | `ZEnvironment[R]` | `IO[E, A]` | 87 | | provideLayer | `ZIO[R, E, A]` | `ZLayer[R0, E, R]` | `ZIO[R0, E, A]` | 88 | 89 | ## Configuration 90 | 91 | | Name | From | Given | To | 92 | | ------------------ | ------------------------ | --------------------------------------- | ------------------------ | 93 | | ZIO.config | | `Config[A]` | `IO[Config.Error, A]` | 94 | 95 | ## Recover from errors 96 | 97 | | Name | From | Given | To | 98 | | ------------- | ---------- | --------------------------------------------- | --------------------------- | 99 | | either | `IO[E, A]` | | `IO[Nothing, Either[E, A]]` | 100 | | option | `IO[E, A]` | | `IO[Nothing, Option[A]]` | 101 | | ignore | `IO[E, A]` | | `IO[Nothing, Unit]` | 102 | | exit | `IO[E, A]` | | `IO[Nothing, Exit[E, A]]` | 103 | | `<>` (orElse) | `IO[E, A]` | `IO[E2, A1]` | `IO[E2, A1]` | 104 | | orElseEither | `IO[E, A]` | `IO[E2, B]` | `IO[E2, Either[A, B]]` | 105 | | fold | `IO[E, A]` | `E => B`
`A => B` | `IO[Nothing, B]` | 106 | | foldZIO | `IO[E, A]` | `E => IO[E2, B]`
`A => IO[E2, B]` | `IO[E2, B]` | 107 | | foldCauseZIO | `IO[E, A]` | `Cause[E] => IO[E2, B]`
`A => IO[E2, B]` | `IO[E2, B]` | 108 | | catchAll | `IO[E, A]` | `E => IO[E2, A1]` | `IO[E2, A1]` | 109 | | catchAllCause | `IO[E, A]` | `Cause[E] => IO[E2, A1]` | `IO[E2, A1]` | 110 | | catchSome | `IO[E, A]` | `PartialFunction[E, IO[E1, A1]]` | `IO[E1, A1]` | 111 | | retry | `IO[E, A]` | `Schedule[E, S]` | `IO[E, A]` | 112 | | eventually | `IO[E, A]` | | `IO[Nothing, A]` | 113 | 114 | ## Terminate fiber with errors 115 | 116 | | Name | From | Given | To | 117 | | ----------------- | ------------------ | ----------------------------------------------- | --------------------------- | 118 | | orDie | `IO[Throwable, A]` | | `IO[Nothing, A]` | 119 | | orDieWith | `IO[E, A]` | `E => Throwable` | `IO[Nothing, A]` | 120 | | refineOrDie | `IO[Throwable, A]` | `PartialFunction[Throwable, E2]` | `IO[E2, A]` | 121 | | refineOrDieWith | `IO[E, A]` | `PartialFunction[E, E2]`
`E => Throwable` | `IO[E2, A]` | 122 | 123 | ## Combining effects + parallelism 124 | 125 | | Name | From | Given | To | 126 | | ------------------ | ---------- | ------------------------------------------------ | -------------------------------- | 127 | | ZIO.foldLeft | | `Iterable[A]`
`S`
`(S, A) => IO[E, S]` | `IO[E, S]` | 128 | | ZIO.foreach | | `Iterable[A]`
`A => IO[E, B]` | `IO[E, List[B]]` | 129 | | ZIO.foreachPar | | `Iterable[A]`
`A => IO[E, B]` | `IO[E, List[B]]` | 130 | | ZIO.collectAll | | `Iterable[IO[E, A]]` | `IO[E, List[A]]` | 131 | | ZIO.collectAllPar | | `Iterable[IO[E, A]]` | `IO[E, List[A]]` | 132 | | ZIO.forkAll | | `Iterable[IO[E, A]]` | `IO[Nothing, Fiber[E, List[A]]]` | 133 | | fork | `IO[E, A]` | | `IO[Nothing, Runtime[E, A]]` | 134 | | `<*>` (zip) | `IO[E, A]` | `IO[E1, B]` | `IO[E1, (A, B)]` | 135 | | `*>` (zipRight) | `IO[E, A]` | `IO[E1, B]` | `IO[E1, B]` | 136 | | `<*` (zipLeft) | `IO[E, A]` | `IO[E1, B]` | `IO[E1, A]` | 137 | | `<&>` (zipPar) | `IO[E, A]` | `IO[E1, B]` | `IO[E1, (A, B)]` | 138 | | `&>` (zipParRight) | `IO[E, A]` | `IO[E1, B]` | `IO[E1, B]` | 139 | | `<&` (zipParLeft) | `IO[E, A]` | `IO[E1, B]` | `IO[E1, A]` | 140 | | race | `IO[E, A]` | `IO[E1, A1]` | `IO[E1, A1]` | 141 | | raceAll | `IO[E, A]` | `Iterable[IO[E1, A1]]` | `IO[E1, A1]` | 142 | | raceEither | `IO[E, A]` | `IO[E1, B]` | `IO[E1, Either[A, B]]` | 143 | 144 | ## Finalizers 145 | 146 | | Name | From | Given | To | 147 | | ------------- | ---------- | -------------------------- | ---------- | 148 | | ensuring | `IO[E, A]` | `UIO[_]` | `IO[E, A]` | 149 | | onError | `IO[E, A]` | `Cause[E] => UIO[_]` | `IO[E, A]` | 150 | | onInterrupt | `IO[E, A]` | `UIO[_]` | `IO[E, A]` | 151 | | onTermination | `IO[E, A]` | `Cause[Nothing] => UIO[_]` | `IO[E, A]` | 152 | 153 | ## Timing and repetition 154 | 155 | | Name | From | Given | To | 156 | | ----------- | ---------- | ---------------- | ------------------------------ | 157 | | ZIO.never | | | `IO[Nothing, Nothing]` | 158 | | ZIO.sleep | | `Duration` | `IO[Nothing, Unit]` | 159 | | delay | `IO[E, A]` | `Duration` | `IO[E, A]` | 160 | | timeout | `IO[E, A]` | `Duration` | `IO[E, Option[A]]` | 161 | | timed | `IO[E, A]` | | `IO[E, (Duration, A)]` | 162 | | forever | `IO[E, A]` | | `IO[E, Nothing]` | 163 | | repeat | `IO[E, A]` | `Schedule[A, B]` | `IO[E, B]` | 164 | | repeatUntil | `IO[E, A]` | `A => Boolean` | `IO[E, A]` | 165 | | repeatWhile | `IO[E, A]` | `A => Boolean` | `IO[E, A]` | 166 | 167 | ## Logging 168 | 169 | | Name | From | Given | To | 170 | | --------------- | ---------- | ---------------- | ------------------------------ | 171 | | ZIO.log | | `String` | `IO[Nothing, Unit]` | 172 | | ZIO.logFatal | | `String` | `IO[Nothing, Unit]` | 173 | | ZIO.logError | | `String` | `IO[Nothing, Unit]` | 174 | | ZIO.logWarning | | `String` | `IO[Nothing, Unit]` | 175 | | ZIO.logInfo | | `String` | `IO[Nothing, Unit]` | 176 | | ZIO.logDebug | | `String` | `IO[Nothing, Unit]` | 177 | | ZIO.logTrace | | `String` | `IO[Nothing, Unit]` | 178 | --------------------------------------------------------------------------------