Skip to content

Commit

Permalink
Merge pull request #2763 from mpilquist/bugfix/2762
Browse files Browse the repository at this point in the history
Fix #2762 - eval after zip may cause interruption
  • Loading branch information
mpilquist authored Dec 23, 2021
2 parents 61b593c + 93ba90b commit ebb169f
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
2 changes: 1 addition & 1 deletion core/shared/src/main/scala/fs2/internal/Scope.scala
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ private[fs2] final class Scope[F[_]] private (
* that caused the interruption is returned so that it can be handled.
*/
private[fs2] def interruptibleEval[A](f: F[A]): F[Either[InterruptionOutcome, A]] =
interruptible match {
openScope.map(_.interruptible).flatMap {
case None =>
f.attempt.map(_.leftMap(t => Outcome.Errored(t)))
case Some(iCtx) =>
Expand Down
18 changes: 16 additions & 2 deletions core/shared/src/test/scala/fs2/StreamZipSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -420,11 +420,25 @@ class StreamZipSuite extends Fs2Suite {
test("#2717 - unexpected behavior of Pull") {
val stream = Stream(1).as(1).scope ++ Stream(2)
val zippedPull =
stream.pull.uncons1.flatMap { case Some((_, s)) =>
s.zipWith(Stream(3))((_, _)).pull.echo
stream.pull.uncons1.flatMap {
case Some((_, s)) =>
s.zipWith(Stream(3))((_, _)).pull.echo
case None => Pull.done
}
val actual = zippedPull.stream.map(identity).covary[IO].compile.toList
actual.assertEquals(List((2, 3)))
}

test("#2762 - unexpected behavior of Pull") {
val stream = Stream(1).as(1) ++ Stream(2)
val zippedPull =
stream.pull.uncons1.flatMap {
case Some((_, s)) =>
s.zipWith(Stream(3))((_, _)).pull.echo
case None => Pull.done
}
val actual = zippedPull.stream.evalTap(_ => IO.unit).map(identity).compile.toList
actual.assertEquals(List((2, 3)))
}
}
}

0 comments on commit ebb169f

Please sign in to comment.