From 3e2613547a10c4311bd866b1de343193b67459e8 Mon Sep 17 00:00:00 2001 From: IvanPrikaznov Date: Wed, 30 Oct 2024 10:42:46 +0100 Subject: [PATCH 1/2] fix: fromSeq stack-safe --- .../com/twitter/concurrent/AsyncStream.scala | 2 +- .../twitter/concurrent/AsyncStreamTest.scala | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/util-core/src/main/scala/com/twitter/concurrent/AsyncStream.scala b/util-core/src/main/scala/com/twitter/concurrent/AsyncStream.scala index a26def1ace..770c9b3758 100644 --- a/util-core/src/main/scala/com/twitter/concurrent/AsyncStream.scala +++ b/util-core/src/main/scala/com/twitter/concurrent/AsyncStream.scala @@ -647,7 +647,7 @@ object AsyncStream { def fromSeq[A](seq: Seq[A]): AsyncStream[A] = seq match { case Nil => empty case _ if SeqUtil.hasKnownSize(seq) && seq.tail.isEmpty => of(seq.head) - case _ => seq.head +:: fromSeq(seq.tail) + case _ => of(seq.head).flatMap(_ +:: fromSeq(seq.tail)) } /** diff --git a/util-core/src/test/scala/com/twitter/concurrent/AsyncStreamTest.scala b/util-core/src/test/scala/com/twitter/concurrent/AsyncStreamTest.scala index d24f1fcb7f..813bdd676c 100644 --- a/util-core/src/test/scala/com/twitter/concurrent/AsyncStreamTest.scala +++ b/util-core/src/test/scala/com/twitter/concurrent/AsyncStreamTest.scala @@ -748,6 +748,21 @@ class AsyncStreamTest extends AnyFunSuite with ScalaCheckDrivenPropertyChecks { assert(Await.result(stream.toSeq()) == Seq(n)) } + + test(s"$impl: fromSeq is stack-safe") { + val n = 100000 + val longSeq = (0 until n).toSeq + val result = AsyncStream.fromSeq(longSeq) + .filter(i => i > 10) + .filter(i => i > 100) + .filter(i => i > 1000) + .filter(i => i > 10000) + .filter(i => i > 100000) + .take(Int.MaxValue) + .toSeq + + assert(Await.result(result.liftToTry).isReturn) + } } } @@ -805,4 +820,4 @@ private object AsyncStreamTest { } def seqImpl: Seq[FromSeq] = Seq(Cons, EmbeddedCons, OfFuture, EmbeddedFuture) -} \ No newline at end of file +} From 9042fdcb63f4749b448b23988602bc15702c51f5 Mon Sep 17 00:00:00 2001 From: IvanPrikaznov Date: Wed, 30 Oct 2024 13:18:11 +0100 Subject: [PATCH 2/2] fix: Simplify lambdas --- .../com/twitter/concurrent/AsyncStreamTest.scala | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/util-core/src/test/scala/com/twitter/concurrent/AsyncStreamTest.scala b/util-core/src/test/scala/com/twitter/concurrent/AsyncStreamTest.scala index 813bdd676c..a60ed91ee8 100644 --- a/util-core/src/test/scala/com/twitter/concurrent/AsyncStreamTest.scala +++ b/util-core/src/test/scala/com/twitter/concurrent/AsyncStreamTest.scala @@ -752,16 +752,15 @@ class AsyncStreamTest extends AnyFunSuite with ScalaCheckDrivenPropertyChecks { test(s"$impl: fromSeq is stack-safe") { val n = 100000 val longSeq = (0 until n).toSeq - val result = AsyncStream.fromSeq(longSeq) - .filter(i => i > 10) - .filter(i => i > 100) - .filter(i => i > 1000) - .filter(i => i > 10000) - .filter(i => i > 100000) + val stream = AsyncStream.fromSeq(longSeq) + .filter(_ > 10) + .filter(_ > 100) + .filter(_ > 1000) + .filter(_ > 10000) + .filter(_ > 100000) .take(Int.MaxValue) - .toSeq - assert(Await.result(result.liftToTry).isReturn) + assert(Await.result(stream.toSeq.liftToTry).isReturn) } }