Introduction
ZIO contains a few data types that can help you solve complex problems in asynchronous and concurrent programming. ZIO data types categorize into these sections:
- Core Data Types
- Contextual Data Types
- State Management
- Concurrency
- Resource Management
- Streaming
- Metrics
- Testing
- Miscellaneous
Core Data Types
- ZIO —
ZIO
is a value that models an effectful program, which might fail or succeed. - ZIOApp —
ZIOApp
and theZIOAppDefault
are entry points for ZIO applications. - Runtime —
Runtime[R]
is capable of executing tasks within an environmentR
. - Exit —
Exit[E, A]
describes the result of executing anIO
value. - Cause —
Cause[E]
is a description of a full story of a fiber failure.
Contextual Data Types
- ZEnvironment —
ZEnvironment[R]
is a built-in type-level map for theZIO
data type which is responsible for maintaining the environment of aZIO
effect. - ZLayer —
ZLayer[-RIn, E, ROut]
is a recipe to build an environment of typeROut
, starting from a valueRIn
, and possibly producing an errorE
during creation.- RLayer —
RLayer[-RIn, ROut]
is a type alias forZLayer[RIn, Throwable, ROut]
, which represents a layer that requiresRIn
as its input, it may fail withThrowable
value, or returnsROut
as its output. - ULayer —
ULayer[ ROut]
is a type alias forZLayer[Any, Nothing, ROut]
, which represents a layer that doesn't require any services as its input, it can't fail, and returnsROut
as its output. - Layer —
Layer[ E, ROut]
is a type alias forZLayer[Any, E, ROut]
, which represents a layer that doesn't require any services, it may fail with an error type ofE
, and returnsROut
as its output. - URLayer —
URLayer[-RIn, ROut]
is a type alias forZLayer[RIn, Nothing, ROut]
, which represents a layer that requiresRIn
as its input, it can't fail, and returnsROut
as its output. - TaskLayer —
TaskLayer[ ROut]
is a type alias forZLayer[Any, Throwable, ROut]
, which represents a layer that doesn't require any services as its input, it may fail withThrowable
value, and returnsROut
as its output.
- RLayer —
State Management
- ZState— It models a state that can be read from and written to during the execution of an effect.
- Ref—
Ref[A]
models a mutable reference to a value of typeA
. - FiberRef—
FiberRef[A]
models a mutable reference to a value of typeA
. As opposed toRef[A]
, a value is bound to an executingFiber
only. You can think of it as Java'sThreadLocal
on steroids.
Concurrency
Fiber Primitives
- Fiber — A fiber value models an
IO
value that has started running, and is the moral equivalent of a green thread. - Fiber.Status —
Fiber.Status
describe the current status of a Fiber. - FiberId —
FiberId
describe the unique identity of a Fiber.
Concurrency Primitives
- Hub — A
Hub
is an asynchronous message hub that allows publishers to efficiently broadcast values to many subscribers. - Promise — A
Promise
is a model of a variable that may be set a single time, and awaited on by many fibers. - Semaphore — A
Semaphore
is an asynchronous (non-blocking) semaphore that plays well with ZIO's interruption. - Ref —
Ref[A]
models a mutable reference to a value of typeA
. The two basic operations areset
, which fills theRef
with a new value, andget
, which retrieves its current content. All operations on aRef
are atomic and thread-safe, providing a reliable foundation for synchronizing concurrent programs. - Ref.Synchronized —
Ref.Synchronized[A]
models a mutable reference to a value of typeA
in which we can store immutable data, and update it atomically and effectfully. - Queue — A
Queue
is an asynchronous queue that never blocks, which is safe for multiple concurrent producers and consumers.
Synchronization Aids
- ReentrantLock— The
ReentrantLock
is a synchronization tool that is useful for synchronizing blocks of code. - CountdownLatch — A synchronization aid that allows one or more fibers to wait until a set of operations being performed in other fibers completes.
- CyclicBarrier — A synchronization aid that allows a set of fibers to all wait for each other to reach a common barrier point.
- ConcurrentMap — A Map wrapper over
java.util.concurrent.ConcurrentHashMap
- ConcurrentSet — A Set implementation over
java.util.concurrent.ConcurrentHashMap
STM
- STM — An
STM
represents an effect that can be performed transactionally resulting in a failure or success. - TArray — A
TArray
is an array of mutable references that can participate in transactions. - TSet — A
TSet
is a mutable set that can participate in transactions. - TMap — A
TMap
is a mutable map that can participate in transactions. - TRef — A
TRef
is a mutable reference to an immutable value that can participate in transactions. - TPriorityQueue — A
TPriorityQueue
is a mutable priority queue that can participate in transactions. - TPromise — A
TPromise
is a mutable reference that can be set exactly once and can participate in transactions. - TQueue — A
TQueue
is a mutable queue that can participate in transactions. - TReentrantLock — A
TReentrantLock
is a reentrant read / write lock that can be composed. - TSemaphore — A
TSemaphore
is a semaphore that can participate in transactions.
Resource Management
- Scope — A scope in which resources can safely be used.
- ZPool — An asynchronous and concurrent generalized pool of reusable resources.
Streaming
- ZStream —
ZStream
is a lazy, concurrent, asynchronous source of values.- Stream —
Stream[E, A]
is a type alias forZStream[Any, E, A]
, which represents a ZIO stream that does not require any services, and may fail with anE
, or produce elements with anA
.
- Stream —
- ZSink —
ZSink
is a consumer of values from aZStream
, which may produce a value when it has consumed enough.- Sink —
Sink[InErr, A, OutErr, L, B]
is a type alias forZSink[Any, InErr, A, OutErr, L, B]
.
- Sink —
- ZPipeline —
ZPipeline
is a polymorphic stream transformer. - SubscriptionRef —
SubscriptionRef[A]
contains a current value of typeA
and a stream that can be consumed to observe all changes to that value.
Metrics
IO supports 5 types of Metrics:
- Counter — The Counter is used for any value that increases over time like request counts.
- Gauge — The gauge is a single numerical value that can arbitrary goes up or down over time like memory usage.
- Histogram — The Histogram is used to track the distribution of a set of observed values across a set of buckets like request latencies.
- Summary — The Summary represents a sliding window of a time series along with metrics for certain percentiles of the time series, referred to as quantiles like request latencies.
- Frequency — The Frequency is a metric that counts the number of occurrences of distinct string values.
Testing
- Spec— A
Spec[R, E]
is the backbone of ZIO Test. All specs require an environment of typeR
and may potentially fail with an error of typeE
. - Assertion— An
Assertion[A]
is a test assertion that can be used to assert the predicate of typeA => Boolean
. - TestAspect— A
TestAspect
is an aspect that can be weaved into specs. We can think of an aspect as a polymorphic function, capable of transforming one test into another. - Gen— A
Gen[R, A]
represents a generator of values of typeA
, which requires an environmentR
. - Test Service— ZIO Test has the following out-of-the-box test services:
- TestConsole— It allows testing of applications that interact with the console.
- TestClock— We can deterministically and efficiently test effects involving the passage of time without actually having to wait for the full amount of time to pass.
- TestRandom— This service allows us having fully deterministic testing of code that deals with Randomness.
- TestSystem— It supports deterministic testing of effects involving system properties.
- Live— It provides access to the live environment from within the test environment for effects.
- TestConfig— It provides access to default configuration settings used by ZIO Test.
- Sized— It enables Sized Generators to access the size from the ZIO Test environment.
Miscellaneous
- Chunk—
Chunk
is a fast, pure alternative to Arrays. - Supervisor—
Supervisor[A]
is allowed to supervise the launching and termination of fibers, producing some visible value of typeA
from the supervision.
To learn more about these data types, please explore the pages above, or check out the Scaladoc documentation.