├── .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 |
--------------------------------------------------------------------------------