This project is an iteratee implementation for Cats that began as a port of Scalaz's iteratee package, although the API and implementation are now very different from Scalaz's. There are API docs (but they're a work in progress), and I've published a blog post introducing the project.
The motivations for the port are similar to those for circe—in particular I'm aiming for a more consistent API, better performance, and better documentation.
Note that this library doesn't support many of the use cases that fs2 (formerly Scalaz Stream) is designed to handle. It doesn't support nondeterministic reading from multiple streams, for example, and in general is a less appropriate choice for situations where concurrency and parallelism are primary goals. Where the use cases of fs2 and this library do overlap, however, it's often likely to be a simpler, faster solution.
The initial performance benchmarks look promising. For example, here are the throughput results for
summing a sequence of numbers with this library and cats.Id
(II
), this library and Scalaz's
Task
(IT
), this library and Twitter futures (IR
), Scalaz Stream (S
), scalaz-iteratee (Z
),
play-iteratee (P
), the collections library (C
), and fs2 (F
). Higher numbers
are better.
Benchmark Mode Cnt Score Error Units
InMemoryBenchmark.sumInts0II thrpt 80 12891.838 ± 95.943 ops/s
InMemoryBenchmark.sumInts1IT thrpt 80 11934.148 ± 117.666 ops/s
InMemoryBenchmark.sumInts2IR thrpt 80 19735.557 ± 161.410 ops/s
InMemoryBenchmark.sumInts3S thrpt 80 73.350 ± 1.065 ops/s
InMemoryBenchmark.sumInts4Z thrpt 80 293.150 ± 2.559 ops/s
InMemoryBenchmark.sumInts5P thrpt 80 44.486 ± 0.899 ops/s
InMemoryBenchmark.sumInts6C thrpt 80 12816.016 ± 78.990 ops/s
InMemoryBenchmark.sumInts7F thrpt 80 10276.384 ± 67.759 ops/s
And the results for collecting the first 10,000 values from an infinite stream of non-negative
numbers into a Vector
:
Benchmark Mode Cnt Score Error Units
StreamingBenchmark.takeLongs0IS thrpt 80 1090.926 ± 21.696 ops/s
StreamingBenchmark.takeLongs1IR thrpt 80 932.749 ± 7.862 ops/s
StreamingBenchmark.takeLongs2IM thrpt 80 1485.798 ± 17.697 ops/s
StreamingBenchmark.takeLongs3S thrpt 80 59.347 ± 0.340 ops/s
StreamingBenchmark.takeLongs4Z thrpt 80 194.763 ± 3.603 ops/s
StreamingBenchmark.takeLongs5P thrpt 80 1.313 ± 0.035 ops/s
StreamingBenchmark.takeLongs6C thrpt 80 3196.885 ± 25.715 ops/s
StreamingBenchmark.takeLongs7F thrpt 80 6.760 ± 0.036 ops/s
Benchmark Mode Cnt Score Error Units
StreamingBenchmark.takeLongs0II thrpt 80 2300.547 ± 35.063 ops/s
StreamingBenchmark.takeLongs1IT thrpt 80 1054.962 ± 7.078 ops/s
StreamingBenchmark.takeLongs2IR thrpt 80 814.381 ± 19.351 ops/s
StreamingBenchmark.takeLongs3S thrpt 80 58.351 ± 0.528 ops/s
StreamingBenchmark.takeLongs4Z thrpt 80 191.689 ± 1.277 ops/s
StreamingBenchmark.takeLongs5P thrpt 80 1.855 ± 0.081 ops/s
StreamingBenchmark.takeLongs6C thrpt 80 2780.370 ± 150.970 ops/s
StreamingBenchmark.takeLongs7F thrpt 80 6.667 ± 0.056 ops/s
And allocation rates (lower is better):
Benchmark Mode Cnt Score Error Units
InMemoryBenchmark.sumInts0II:gc.alloc.rate.norm thrpt 10 161083.473 ± 10.157 B/op
InMemoryBenchmark.sumInts1IT:gc.alloc.rate.norm thrpt 10 161756.601 ± 10.011 B/op
InMemoryBenchmark.sumInts2IR:gc.alloc.rate.norm thrpt 10 161554.880 ± 9.051 B/op
InMemoryBenchmark.sumInts3S:gc.alloc.rate.norm thrpt 10 63416636.376 ± 255002.884 B/op
InMemoryBenchmark.sumInts4Z:gc.alloc.rate.norm thrpt 10 16401515.857 ± 255007.657 B/op
InMemoryBenchmark.sumInts5P:gc.alloc.rate.norm thrpt 10 13635867.405 ± 10698.402 B/op
InMemoryBenchmark.sumInts6C:gc.alloc.rate.norm thrpt 10 159851.919 ± 25.649 B/op
InMemoryBenchmark.sumInts7F:gc.alloc.rate.norm thrpt 10 288158.919 ± 3021.725 B/op
Benchmark Mode Cnt Score Error Units
StreamingBenchmark.takeLongs0II:gc.alloc.rate.norm thrpt 10 3123720.463 ± 0.004 B/op
StreamingBenchmark.takeLongs1IT:gc.alloc.rate.norm thrpt 10 5924305.297 ± 1.184 B/op
StreamingBenchmark.takeLongs2IR:gc.alloc.rate.norm thrpt 10 5204125.702 ± 9.920 B/op
StreamingBenchmark.takeLongs3S:gc.alloc.rate.norm thrpt 10 75607211.366 ± 255032.949 B/op
StreamingBenchmark.takeLongs4Z:gc.alloc.rate.norm thrpt 10 28888073.078 ± 17.792 B/op
StreamingBenchmark.takeLongs5P:gc.alloc.rate.norm thrpt 10 1206276610.133 ± 1008.603 B/op
StreamingBenchmark.takeLongs6C:gc.alloc.rate.norm thrpt 10 526752.381 ± 0.005 B/op
StreamingBenchmark.takeLongs7F:gc.alloc.rate.norm thrpt 10 650663709.714 ± 127478.253 B/op
iteratee.io is licensed under the Apache License, Version 2.0 (the "License"); you may not use this software except in compliance with the License.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.