From 45d3afa92b8d327eb25055a4254c80530db6f6fa Mon Sep 17 00:00:00 2001 From: Jules Ivanic Date: Tue, 22 Apr 2025 20:17:31 +1000 Subject: [PATCH 1/2] Optimize `ZPipeline::mapEitherChunked` --- .../src/main/scala/zio/stream/ZPipeline.scala | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/streams/shared/src/main/scala/zio/stream/ZPipeline.scala b/streams/shared/src/main/scala/zio/stream/ZPipeline.scala index 099de5c07424..843c568aae81 100644 --- a/streams/shared/src/main/scala/zio/stream/ZPipeline.scala +++ b/streams/shared/src/main/scala/zio/stream/ZPipeline.scala @@ -1820,8 +1820,7 @@ object ZPipeline extends ZPipelinePlatformSpecificConstructors { chunk => { val size = chunk.size - if (size == 0) reader - else if (size == 1) { + if (size == 1) { val a = chunk.head f(a) match { @@ -1829,13 +1828,15 @@ object ZPipeline extends ZPipelinePlatformSpecificConstructors { case l: Left[Err, ?] => ZChannel.refailCause(Cause.fail(l.value)) } } else { - val builder: ChunkBuilder[Out] = ChunkBuilder.make[Out](chunk.size) - val iterator: Iterator[In] = chunk.iterator + val builder: ChunkBuilder[Out] = ChunkBuilder.make[Out](size) + val iterator = chunk.chunkIterator + var index: Int = 0 var error: Err = null.asInstanceOf[Err] - while (iterator.hasNext && (error == null)) { - val a = iterator.next() - f(a) match { + while (iterator.hasNextAt(index) && (error == null)) { + val in = iterator.nextAt(index) + index += 1 + f(in) match { case r: Right[?, Out] => builder.addOne(r.value) case l: Left[Err, ?] => error = l.value } From 0e0684bd6ca0071650dc5f77648ec32b5b3983ce Mon Sep 17 00:00:00 2001 From: Jules Ivanic Date: Tue, 29 Jul 2025 15:42:56 +1000 Subject: [PATCH 2/2] Review: Prefer `index < size` --- streams/shared/src/main/scala/zio/stream/ZPipeline.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streams/shared/src/main/scala/zio/stream/ZPipeline.scala b/streams/shared/src/main/scala/zio/stream/ZPipeline.scala index bf58841990fd..5c8a7b7064fe 100644 --- a/streams/shared/src/main/scala/zio/stream/ZPipeline.scala +++ b/streams/shared/src/main/scala/zio/stream/ZPipeline.scala @@ -1857,7 +1857,7 @@ object ZPipeline extends ZPipelinePlatformSpecificConstructors { var index: Int = 0 var error: Err = null.asInstanceOf[Err] - while (iterator.hasNextAt(index) && (error == null)) { + while (index < size && error == null) { val in = iterator.nextAt(index) index += 1 f(in) match {