diff --git a/core/jvm/src/test/scala/fs2/TaskSpec.scala b/core/jvm/src/test/scala/fs2/TaskSpec.scala new file mode 100644 index 0000000000..89a6792a18 --- /dev/null +++ b/core/jvm/src/test/scala/fs2/TaskSpec.scala @@ -0,0 +1,28 @@ +package fs2 + +import scala.concurrent.duration._ + +class TaskSpec extends Fs2Spec{ + + "Task" - { + "Ref" - { + + /** + * Tests whether set after access causes said access's + * set to default to no-op as the value in ref has changed + */ + "Interleaving set and access " in { + + Task.ref[Int].flatMap{ref => + ref.setPure(1).flatMap{_ => + ref.access.flatMap{case ((_, set)) => + ref.setPure(2).flatMap{_ => + set(Right(3)).schedule(100.millis) + } + } + } + }.unsafeRun() shouldBe false + } + } + } +} diff --git a/core/shared/src/main/scala/fs2/Task.scala b/core/shared/src/main/scala/fs2/Task.scala index fd6b858e11..99d5c05de5 100644 --- a/core/shared/src/main/scala/fs2/Task.scala +++ b/core/shared/src/main/scala/fs2/Task.scala @@ -290,8 +290,8 @@ object Task extends TaskPlatform with TaskInstances { else { val r = result; val id = nonce; S { cb(r.map((_,id))) } } case Msg.Set(r) => + nonce += 1L if (result eq null) { - nonce += 1L val id = nonce waiting.values.foreach(cb => S { cb(r.map((_,id))) }) waiting = LinkedMap.empty