@zio.dev/zio-blocks 0.0.51 → 0.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adr/2026-07-18-data-migration.md +123 -0
- package/guides/async-getting-started.md +687 -0
- package/guides/compile-time-resource-safety-with-scope.md +6 -0
- package/guides/getting-started-with-mux.md +0 -112
- package/guides/query-dsl-extending.md +1 -1
- package/guides/query-dsl-fluent-builder.md +1 -1
- package/guides/query-dsl-reified-optics.md +1 -1
- package/guides/query-dsl-sql.md +395 -1
- package/guides/sql-checked-interpolation.md +173 -0
- package/guides/sql-transactions.md +286 -0
- package/guides/telemetry-guide.md +131 -70
- package/guides/zio-schema-migration.md +6 -6
- package/index.md +200 -559
- package/package.json +1 -1
- package/reference/async.md +1379 -531
- package/reference/chunk.md +3 -3
- package/reference/codegen/index.md +1 -1
- package/reference/combinators.md +4 -4
- package/reference/config/config-decoder.md +460 -0
- package/reference/config/config-source.md +489 -0
- package/reference/config/errors.md +278 -0
- package/reference/config/flags.md +369 -0
- package/reference/config/formats.md +314 -0
- package/reference/config/index.md +304 -0
- package/reference/config/rollout.md +336 -0
- package/reference/context.md +6 -49
- package/reference/data-migration.md +269 -0
- package/reference/datastar/attributes.md +302 -0
- package/reference/datastar/events.md +234 -0
- package/reference/datastar/index.md +256 -0
- package/reference/datastar/signals.md +230 -0
- package/reference/datastar/sse.md +295 -0
- package/reference/datastar.md +2 -2
- package/reference/docs.md +2 -2
- package/reference/endpoint/bulk-creation.md +96 -0
- package/reference/endpoint/endpoint.md +1 -0
- package/reference/endpoint/index.md +9 -89
- package/reference/endpoint/path-codec.md +12 -24
- package/reference/endpoint/route-pattern.md +4 -6
- package/reference/endpoint/segment-codec.md +19 -32
- package/reference/html.md +313 -9
- package/reference/htmx/index.md +4 -52
- package/reference/htmx/response-headers.md +240 -0
- package/reference/http-model/headers.md +735 -0
- package/reference/http-model/index.md +3 -1
- package/reference/http-model/model.md +107 -71
- package/reference/http-model/schema-codecs.md +522 -0
- package/reference/http-model/schema.md +6 -3
- package/reference/http-model/server-sent-event.md +341 -0
- package/reference/jwt.md +195 -0
- package/reference/maybe.md +128 -11
- package/reference/media-type.md +2 -2
- package/reference/mux.mdx +7 -2
- package/reference/openapi.md +3 -3
- package/reference/projection.md +654 -0
- package/reference/resource-management/index.md +1 -1
- package/reference/resource-management/resource.md +2 -98
- package/reference/resource-management/scope.md +1 -209
- package/reference/resource-management/wire.md +4 -50
- package/reference/ringbuffer/advanced.mdx +1 -1
- package/reference/ringbuffer/index.mdx +3 -3
- package/reference/ringbuffer/mpmc.mdx +38 -4
- package/reference/ringbuffer/mpsc.mdx +36 -4
- package/reference/ringbuffer/spmc.mdx +1 -1
- package/reference/ringbuffer/spsc.mdx +87 -15
- package/reference/schema/allows.md +0 -96
- package/reference/schema/binding.md +2 -2
- package/reference/schema/built-in-codecs/avro.md +2 -2
- package/reference/schema/built-in-codecs/bson.md +50 -20
- package/reference/schema/built-in-codecs/csv.md +2 -2
- package/reference/schema/built-in-codecs/index.md +3 -3
- package/reference/schema/built-in-codecs/json/index.md +2 -2
- package/reference/schema/built-in-codecs/json/json.md +1 -0
- package/reference/schema/built-in-codecs/messagepack.md +3 -3
- package/reference/schema/built-in-codecs/thrift.md +2 -2
- package/reference/schema/built-in-codecs/toon.md +3 -3
- package/reference/schema/built-in-codecs/yaml.md +2 -2
- package/reference/schema/codec.md +11 -11
- package/reference/schema/dynamic-optic.md +48 -3
- package/reference/schema/dynamic-schema.md +3 -3
- package/reference/schema/index.md +2 -0
- package/reference/schema/path-interpolator.md +2 -0
- package/reference/schema/reflect-transformer.md +140 -0
- package/reference/schema/schema-evolution/as.md +4 -4
- package/reference/schema/schema-evolution/into.md +2 -2
- package/reference/schema/schema-expr.md +2 -2
- package/reference/schema/schema-search.md +263 -0
- package/reference/schema/schema.md +10 -2
- package/reference/schema/type-class-derivation.md +1 -1
- package/reference/smithy.md +502 -3
- package/reference/sql/db-codec-deriver.md +3 -3
- package/reference/sql/db-codec.md +22 -22
- package/reference/sql/db-con.md +4 -4
- package/reference/sql/db-connection.md +1 -1
- package/reference/sql/db-param.md +1 -1
- package/reference/sql/db-result-reader.md +4 -2
- package/reference/sql/db-tx.md +46 -14
- package/reference/sql/ddl.md +1 -1
- package/reference/sql/frag.md +44 -10
- package/reference/sql/index.md +7 -7
- package/reference/sql/repo.md +15 -15
- package/reference/sql/sql-dialect.md +1 -1
- package/reference/sql/sql-logger.md +1 -1
- package/reference/sql/sql-name-mapper.md +3 -3
- package/reference/sql/table-metadata.md +3 -3
- package/reference/sql/table.md +10 -10
- package/reference/sql/transactor-zio.md +1 -1
- package/reference/sql/transactor.md +21 -11
- package/reference/sql-zio.md +2 -2
- package/reference/streams/core/index.md +32 -0
- package/reference/streams/{pipeline.md → core/pipeline.md} +210 -74
- package/reference/streams/{sink.md → core/sink.md} +331 -353
- package/reference/streams/{stream.md → core/stream.md} +919 -209
- package/reference/streams/execution-and-compatibility/async-execution.md +822 -0
- package/reference/streams/execution-and-compatibility/index.md +35 -0
- package/reference/streams/execution-and-compatibility/platform-differences.md +297 -0
- package/reference/streams/execution-and-compatibility/scala-2-compatibility.md +88 -0
- package/reference/streams/execution-and-compatibility/zero-boxing.md +393 -0
- package/reference/streams/index.md +140 -67
- package/reference/streams/primitives/index.md +30 -0
- package/reference/streams/primitives/reader.md +1992 -0
- package/reference/streams/{writer.md → primitives/writer.md} +254 -98
- package/reference/telemetry/common/any-value.md +90 -0
- package/reference/telemetry/common/attribute-key.md +87 -0
- package/reference/telemetry/common/attributes.md +118 -0
- package/reference/telemetry/common/index.md +39 -0
- package/reference/telemetry/common/instrumentation-scope.md +24 -0
- package/reference/telemetry/common/resource.md +34 -0
- package/reference/telemetry/index.md +311 -0
- package/reference/telemetry/logging/index.md +197 -0
- package/reference/telemetry/logging/log-enrichment.md +72 -0
- package/reference/telemetry/logging/log-formatter.md +100 -0
- package/reference/telemetry/logging/log-record-processor.md +56 -0
- package/reference/telemetry/logging/log-record.md +44 -0
- package/reference/telemetry/logging/log-writer.md +64 -0
- package/reference/telemetry/logging/logger-provider.md +142 -0
- package/reference/telemetry/logging/logger.md +83 -0
- package/reference/telemetry/logging/severity.md +62 -0
- package/reference/telemetry/metrics/index.md +150 -0
- package/reference/telemetry/metrics/instruments.md +183 -0
- package/reference/telemetry/metrics/labeled-instruments.md +74 -0
- package/reference/telemetry/metrics/meter-provider.md +76 -0
- package/reference/telemetry/metrics/meter.md +98 -0
- package/reference/telemetry/metrics/metric-data.md +57 -0
- package/reference/telemetry/otel/custom-exporter.md +216 -0
- package/reference/telemetry/otel/index.md +212 -0
- package/reference/telemetry/tracing/index.md +155 -0
- package/reference/telemetry/tracing/sampler.md +89 -0
- package/reference/telemetry/tracing/span-builder.md +57 -0
- package/reference/telemetry/tracing/span-context.md +39 -0
- package/reference/telemetry/tracing/span-data.md +32 -0
- package/reference/telemetry/tracing/span-kind.md +55 -0
- package/reference/telemetry/tracing/span-processor.md +53 -0
- package/reference/telemetry/tracing/span-status.md +47 -0
- package/reference/telemetry/tracing/span.md +117 -0
- package/reference/telemetry/tracing/tracer-provider.md +91 -0
- package/reference/telemetry/tracing/tracer.md +52 -0
- package/reference/typeid.md +0 -64
- package/sidebars.js +365 -185
- package/undocumented-report.md +528 -270
- package/reference/config.md +0 -158
- package/reference/streams/concurrent-operators.md +0 -106
- package/reference/streams/reader.md +0 -1284
- package/reference/streams/scala-2-compatibility.md +0 -55
- package/reference/streams/zero-boxing.md +0 -275
- package/reference/telemetry.md +0 -693
package/reference/config.md
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: config
|
|
3
|
-
title: "Config"
|
|
4
|
-
sidebar_label: "Config"
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
`zio.blocks.config` provides typed configuration loading, feature flags, provenance tracking, rollout selection, and source adapters for YAML, JSON, and HOCON. The module is synchronous and zero-dependency: configuration is loaded from `ConfigSource`, flags are read through `FlagSource`, and typed decoding is derived from `Schema[A]`.
|
|
8
|
-
|
|
9
|
-
## Installation
|
|
10
|
-
|
|
11
|
-
```scala
|
|
12
|
-
libraryDependencies += "dev.zio" %% "zio-blocks-config" % "0.0.51"
|
|
13
|
-
libraryDependencies += "dev.zio" %% "zio-blocks-config-yaml" % "0.0.51"
|
|
14
|
-
libraryDependencies += "dev.zio" %% "zio-blocks-config-json" % "0.0.51"
|
|
15
|
-
libraryDependencies += "dev.zio" %% "zio-blocks-config-hocon" % "0.0.51"
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
For Scala.js:
|
|
19
|
-
|
|
20
|
-
```scala
|
|
21
|
-
libraryDependencies += "dev.zio" %%% "zio-blocks-config" % "0.0.51"
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Supported Scala versions: 2.13.x and 3.x.
|
|
25
|
-
|
|
26
|
-
## Core Types
|
|
27
|
-
|
|
28
|
-
At the center of the module are two source abstractions:
|
|
29
|
-
|
|
30
|
-
```scala
|
|
31
|
-
import zio.blocks.maybe.Maybe
|
|
32
|
-
|
|
33
|
-
trait FlagSource {
|
|
34
|
-
def sourceId: String
|
|
35
|
-
def get(name: String): Maybe[SourceValue[String]]
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
trait ConfigSource extends FlagSource {
|
|
39
|
-
def get(key: String): Maybe[SourceValue[String]]
|
|
40
|
-
def all(prefix: String): Map[String, SourceValue[String]]
|
|
41
|
-
}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
`ConfigSource` extends `FlagSource`, so the same source can power both typed config loading and simple scalar flags.
|
|
45
|
-
|
|
46
|
-
## Loading Typed Configuration
|
|
47
|
-
|
|
48
|
-
Use `Config.load[A]` when you want a typed result and explicit errors:
|
|
49
|
-
|
|
50
|
-
```scala
|
|
51
|
-
import zio.blocks.config._
|
|
52
|
-
import zio.blocks.scope.Unscoped
|
|
53
|
-
|
|
54
|
-
final case class AppConfig(host: String, port: Int) derives Schema, Unscoped
|
|
55
|
-
|
|
56
|
-
val source = ConfigSource.fromMap(
|
|
57
|
-
Map("app.host" -> "localhost", "app.port" -> "8080"),
|
|
58
|
-
"example"
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
val loaded = Config.load[AppConfig](source.prefix("app"))
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
The main entry points are:
|
|
65
|
-
|
|
66
|
-
```scala
|
|
67
|
-
Config.load[A](source)
|
|
68
|
-
Config.loadOrThrow[A](source)
|
|
69
|
-
Config.loadWithProvenance[A](source)
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
`Config.loadWithProvenance` returns a `ProvenanceMap[A]`, which lets you inspect where resolved values came from.
|
|
73
|
-
|
|
74
|
-
## Wiring Config into Dependency Graphs
|
|
75
|
-
|
|
76
|
-
For application wiring, prefer `Config.wire[A]` or `Config.wire[A](prefix)` so decoding stays inside the dependency graph instead of being done manually at startup:
|
|
77
|
-
|
|
78
|
-
```scala
|
|
79
|
-
Config.wire[AppConfig]
|
|
80
|
-
Config.wire[AppConfig]("app")
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
That keeps `ConfigSource` as the injected input and the typed config as the derived output.
|
|
84
|
-
|
|
85
|
-
## Working with Sources
|
|
86
|
-
|
|
87
|
-
`ConfigSource` supports composition and key transformation:
|
|
88
|
-
|
|
89
|
-
```scala
|
|
90
|
-
val defaults = ConfigSource.fromMap(Map("db.host" -> "localhost"), "defaults")
|
|
91
|
-
val env = ConfigSource.fromMap(Map("db.port" -> "5432"), "env")
|
|
92
|
-
|
|
93
|
-
val combined = env.orElse(defaults)
|
|
94
|
-
val scoped = combined.prefix("db")
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Common adapters:
|
|
98
|
-
|
|
99
|
-
- `ConfigSource.fromMap(...)`
|
|
100
|
-
- `ConfigSource.fromYaml(...)` (requires `config-yaml` dependency)
|
|
101
|
-
- `ConfigSource.fromJson(...)` (requires `config-json` dependency)
|
|
102
|
-
- `ConfigSource.fromHocon(...)` (requires `config-hocon` dependency)
|
|
103
|
-
|
|
104
|
-
## Static and Dynamic Flags
|
|
105
|
-
|
|
106
|
-
`StaticFlag[A]` resolves once, during object initialization:
|
|
107
|
-
|
|
108
|
-
```scala
|
|
109
|
-
import zio.blocks.config._
|
|
110
|
-
|
|
111
|
-
object poolSize extends StaticFlag[Int](10)
|
|
112
|
-
|
|
113
|
-
val size: Int = poolSize()
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
`DynamicFlag[A]` keeps an updatable rollout expression and evaluates it on demand.
|
|
117
|
-
|
|
118
|
-
`StaticFlag` names are derived from the Scala object's fully qualified name, so custom `FlagSource` registrations must use that exact key.
|
|
119
|
-
|
|
120
|
-
`FlagSource.Registry` is consulted in registration order, so the first registered source wins when multiple sources provide the same flag.
|
|
121
|
-
|
|
122
|
-
:::note
|
|
123
|
-
Register `FlagSource`s before the first reference to a `StaticFlag` object. Once a static flag object is initialized, later registrations do not retroactively change its resolved value.
|
|
124
|
-
:::
|
|
125
|
-
|
|
126
|
-
## Rollout DSL
|
|
127
|
-
|
|
128
|
-
`Rollout` selects values based on a path and an optional percentage bucket:
|
|
129
|
-
|
|
130
|
-
```scala
|
|
131
|
-
import zio.blocks.config._
|
|
132
|
-
|
|
133
|
-
val bucket = Rollout.bucketFor("user-123")
|
|
134
|
-
val choice = Rollout.select("true@prod/50%;false", "prod", bucket)
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
The percentage uses slash-separated syntax (`prod/50%`). For the example above, `choice` is `Maybe.present("true")` for roughly half of the `prod` buckets and `Maybe.present("false")` otherwise. Bare values act as catch-all fallbacks and should come last.
|
|
138
|
-
|
|
139
|
-
## Provenance
|
|
140
|
-
|
|
141
|
-
Every resolved value carries provenance information through `SourceValue` and `Provenance`:
|
|
142
|
-
|
|
143
|
-
```scala
|
|
144
|
-
val source = ConfigSource.fromMap(Map("db.host" -> "localhost"), "defaults")
|
|
145
|
-
val host = source.get("db.host")
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
`host` contains both the raw value and a `Provenance.Resolved` entry that records the source id and key.
|
|
149
|
-
|
|
150
|
-
## Format Adapters
|
|
151
|
-
|
|
152
|
-
The format modules flatten structured documents into dot-separated keys:
|
|
153
|
-
|
|
154
|
-
- YAML: nested mappings become `a.b.c`
|
|
155
|
-
- JSON: arrays are indexed as `items.0`, `items.1`, ...
|
|
156
|
-
- HOCON: substitutions are resolved before flattening
|
|
157
|
-
|
|
158
|
-
Use these adapters when you want the convenience of file formats but still want a single `ConfigSource` API for decoding, composition, and provenance.
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: concurrent-operators
|
|
3
|
-
title: "Concurrent Operators"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
ZIO Blocks Streams ships **three** concurrent operators that fan work across virtual threads while preserving the typed-error, synchronous, pull-based programming model. The calling thread still receives `Either[E, Z]` — no effect system is required.
|
|
7
|
-
|
|
8
|
-
| Operator | Purpose |
|
|
9
|
-
|---|---|
|
|
10
|
-
| `Stream#mapPar(n)(f)` | Apply `f` to each element on up to `n` worker threads. Output is **unordered** (arrival order, not input order). |
|
|
11
|
-
| `Stream.mergeAll(n)(streams)` | Drain up to `n` inner streams concurrently; interleave their elements as they arrive. |
|
|
12
|
-
| `Stream#flatMapPar(n)(f)` | Per element, produce a sub-stream via `f`; drain up to `n` sub-streams concurrently. |
|
|
13
|
-
|
|
14
|
-
All three operators are **JVM-only**. On Scala.js they degrade to sequential equivalents (`map`, `flatten`, `flatMap`).
|
|
15
|
-
|
|
16
|
-
## Semantics
|
|
17
|
-
|
|
18
|
-
**Output order.** Concurrent output is **unordered** with respect to input position. Elements arrive as workers complete, not in input order. If you need input order, use sequential `map` / `flatMap`.
|
|
19
|
-
|
|
20
|
-
**Error propagation.** The first typed error from any worker or inner stream terminates all concurrent work and surfaces as `Left(e)` from the terminal operation. Defects (unexpected exceptions) propagate as thrown exceptions, same as sequential operators.
|
|
21
|
-
|
|
22
|
-
**Resource safety.** All worker threads and ring-buffer queues are cleaned up deterministically when the consumer closes the reader, the stream errors, or the scope finalizes.
|
|
23
|
-
|
|
24
|
-
**Primitive specialization.** Readers produced by concurrent operators preserve primitive specialization — `Int`, `Long`, `Float`, and `Double` streams use specialized lock-free queues internally, avoiding boxing in the concurrent handoff between threads.
|
|
25
|
-
|
|
26
|
-
## Buffer sizing
|
|
27
|
-
|
|
28
|
-
Concurrent operators use internal ring-buffer queues (default size **64**). Override with `Stream.bufferSize(n) { ... }` where `n` is a positive power of two:
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
Stream.bufferSize(256) {
|
|
32
|
-
Stream.range(0, 1_000_000).mapPar(8)(heavyComputation)
|
|
33
|
-
}.runCollect
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Larger buffers help when producers are bursty; smaller buffers reduce memory when many concurrent streams are active. The default is fine for most workloads.
|
|
37
|
-
|
|
38
|
-
`Pipeline.buffer(n)` inserts a buffer of `n` elements between upstream and downstream (async handoff on JVM, sync on JS).
|
|
39
|
-
|
|
40
|
-
## Examples
|
|
41
|
-
|
|
42
|
-
### `mapPar`
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
// Apply an expensive function using 8 virtual threads.
|
|
46
|
-
// Output order varies between runs.
|
|
47
|
-
val result = Stream.range(0, 1000)
|
|
48
|
-
.mapPar(8)(n => { Thread.sleep(1); n * 2 })
|
|
49
|
-
.runCollect
|
|
50
|
-
// result: Right(Chunk(...)) -- all 1000 elements, but not in 0,2,4,... order
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### `mergeAll`
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
// Drain 10 streams concurrently, up to 4 at a time.
|
|
57
|
-
val streams = Stream.fromIterable(
|
|
58
|
-
(0 until 10).map(i => Stream.range(i * 100, (i + 1) * 100))
|
|
59
|
-
)
|
|
60
|
-
val merged = Stream.mergeAll(4)(streams).runFold(0L)(_ + _)
|
|
61
|
-
// merged: Right(499500) -- all elements consumed, order interleaved
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### `flatMapPar`
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
// Each element spawns a sub-stream; up to 8 drained concurrently.
|
|
68
|
-
val flat = Stream.range(0, 50)
|
|
69
|
-
.flatMapPar(8)(i => Stream.range(i * 20, (i + 1) * 20))
|
|
70
|
-
.runFold(0L)(_ + _)
|
|
71
|
-
// flat: Right(499500)
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Error behaviour
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
// Typed error in a worker terminates all workers
|
|
78
|
-
val err1 = Stream.range(0, 1000)
|
|
79
|
-
.flatMap(n => if (n == 500) Stream.fail("bad element") else Stream.succeed(n))
|
|
80
|
-
.mapPar(4)(identity)
|
|
81
|
-
.runCollect
|
|
82
|
-
// err1: Left("bad element")
|
|
83
|
-
|
|
84
|
-
// Error in one inner stream terminates mergeAll
|
|
85
|
-
val err2 = Stream.mergeAll(4)(Stream.fromIterable(
|
|
86
|
-
List(Stream.range(0, 100), Stream.fail("inner error"), Stream.range(200, 300))
|
|
87
|
-
)).runCollect
|
|
88
|
-
// err2: Left("inner error")
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Guidelines
|
|
92
|
-
|
|
93
|
-
- **Use `mapPar(n)(f)` for expensive per-element work** — network calls, CPU-bound computation, blocking I/O. Do not use it for trivially cheap functions (e.g. `_ + 1`); the thread-handoff overhead exceeds the parallelism benefit.
|
|
94
|
-
- **Use `mergeAll(n)(streams)` for concurrent fan-in** — draining multiple independent sources (files, connections, partitions) simultaneously. Use `flatMapPar(n)(f)` when each input element produces a sub-stream to drain concurrently.
|
|
95
|
-
- **Concurrent output is unordered.** If you need sorted results, apply `.runCollect.map(_.sorted)` or accumulate into a structure that handles ordering. If you need input-order preservation, use sequential `map` / `flatMap`.
|
|
96
|
-
- **`mapPar`, `mergeAll`, and `flatMapPar` are JVM-only.** On JS they degrade to sequential equivalents.
|
|
97
|
-
|
|
98
|
-
## Comparison with other libraries
|
|
99
|
-
|
|
100
|
-
| Feature | ZB Streams | fs2 | Kyo | Ox | Pekko |
|
|
101
|
-
|---|---|---|---|---|---|
|
|
102
|
-
| Concurrent operators | `mapPar`, `mergeAll`, `flatMapPar` | `parEvalMap` | `mapParUnordered`* | `mapPar` | `mapAsync`, `flatMapMerge` |
|
|
103
|
-
| Effect system required | No | Yes (cats-effect) | Yes (Kyo) | No (virtual threads) | Yes (Akka) |
|
|
104
|
-
| Typed errors | `Either[E, Z]` | ApplicativeError | Kyo effects | Exceptions | No |
|
|
105
|
-
|
|
106
|
-
\* Kyo's `mapParUnordered` forks a fiber per element (very slow for large streams). Kyo's `collectAll` merges streams but does not parallelize pure computation within them.
|