From 0e0b3adbc83e7c55aac0cb96189cb8ea53718768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Fri, 27 Mar 2026 13:59:21 +0100 Subject: [PATCH 01/15] refactor: enforce explicit type annotations, replace unused loop variables, and clean up unused imports in tests and core implementations --- build.sbt | 18 ----------------- .../monix/eval/internal/TaskConversions.scala | 2 +- .../monix/eval/internal/TaskCreate.scala | 2 +- .../monix/eval/internal/TaskFromFuture.scala | 2 +- .../eval/TaskExecuteWithOptionsSuite.scala | 2 +- .../eval/TaskMemoizeOnSuccessSuite.scala | 20 +++++++++---------- .../AdaptedThreadPoolExecutor.scala | 2 +- .../atomic/ConcurrentAtomicNumberSuite.scala | 18 ++++++++--------- .../atomic/ConcurrentAtomicSuite.scala | 6 +++--- .../src/main/scala/monix/execution/Ack.scala | 8 ++++---- .../monix/execution/CancelableFuture.scala | 2 +- .../monix/execution/CancelablePromise.scala | 2 +- .../monix/execution/CancelableSuite.scala | 4 ++-- .../cancelables/OrderedCancelableSuite.scala | 4 ++-- .../schedulers/ExecutionModelSuite.scala | 2 +- .../operators/BufferIntrospectiveSuite.scala | 2 +- .../MonixSubscriberAsReactiveSuite.scala | 2 +- .../subjects/BehaviorSubjectSuite.scala | 4 ++-- .../subjects/ProfunctorSubjectSuite.scala | 8 ++++---- .../subjects/PublishSubjectSuite.scala | 4 ++-- .../subjects/ReplaySubjectSuite.scala | 4 ++-- .../tail/internal/IterantCompleteL.scala | 2 +- .../monix/tail/internal/IterantTakeLast.scala | 4 ++-- 23 files changed, 53 insertions(+), 71 deletions(-) diff --git a/build.sbt b/build.sbt index 85631e914..19b5b7334 100644 --- a/build.sbt +++ b/build.sbt @@ -193,16 +193,6 @@ lazy val sharedSettings = pgpSettings ++ Seq( "-Xlint:infer-any", "-Wnonunit-statement" ), - // Disabled from tpolecat for test compilation: - // -Wunused:patvars triggers on for-comprehension loop vars in tests (pre-existing pattern) - // -Xlint:constant triggers on intentional overflow tests (e.g. Long.MaxValue + 1) - Test / scalacOptions --= { - CrossVersion.partialVersion(scalaVersion.value) match { - case Some((2, 13)) => Seq("-Wunused:patvars", "-Xlint:constant") - case Some((2, 12)) => Seq("-Ywarn-unused:patvars") - case _ => Seq.empty - } - }, // Turning off fatal warnings for doc generation Compile / doc / tpolecatExcludeOptions ++= ScalacOptions.defaultConsoleExclude, // Silence everything in auto-generated files @@ -212,14 +202,6 @@ lazy val sharedSettings = pgpSettings ++ Seq( else Seq("-P:silencer:pathFilters=.*[/]src_managed[/].*") }, - scalacOptions --= { - if (isDotty.value) - // tpolecat uses -Werror in Scala 3; disable fatal warnings - // so that pre-existing value-discard and similar patterns don't break Scala 3 builds - Seq("-Werror") - else - Seq() - }, // Syntax improvements, linting, etc. libraryDependencies ++= { if (isDotty.value) diff --git a/monix-eval/shared/src/main/scala/monix/eval/internal/TaskConversions.scala b/monix-eval/shared/src/main/scala/monix/eval/internal/TaskConversions.scala index 1776618b0..3f9a84c38 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/internal/TaskConversions.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/internal/TaskConversions.scala @@ -184,7 +184,7 @@ private[eval] object TaskConversions { def run(): Unit = { if (canCall) { canCall = false - if (conn ne null) conn.pop() + if (conn ne null) conn.pop(): Unit cb(value) value = null } diff --git a/monix-eval/shared/src/main/scala/monix/eval/internal/TaskCreate.scala b/monix-eval/shared/src/main/scala/monix/eval/internal/TaskCreate.scala index 0fe10a715..b623a754a 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/internal/TaskCreate.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/internal/TaskCreate.scala @@ -219,7 +219,7 @@ private[eval] object TaskCreate { private def startExecution(): Unit = { // Cleanup of the current finalizer - if (shouldPop) ctx.connection.pop() + if (shouldPop) ctx.connection.pop(): Unit // Optimization — if the callback was called on the same thread // where it was created, then we are not going to fork // This is not safe to do when localContextPropagation enabled diff --git a/monix-eval/shared/src/main/scala/monix/eval/internal/TaskFromFuture.scala b/monix-eval/shared/src/main/scala/monix/eval/internal/TaskFromFuture.scala index ac1437775..c4ed47535 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/internal/TaskFromFuture.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/internal/TaskFromFuture.scala @@ -145,7 +145,7 @@ private[eval] object TaskFromFuture { } def run(): Unit = { - if (conn ne null) conn.pop() + if (conn ne null) conn.pop(): Unit val v = value value = null cb(v) diff --git a/monix-eval/shared/src/test/scala/monix/eval/TaskExecuteWithOptionsSuite.scala b/monix-eval/shared/src/test/scala/monix/eval/TaskExecuteWithOptionsSuite.scala index 4e5cad600..9fadb9004 100644 --- a/monix-eval/shared/src/test/scala/monix/eval/TaskExecuteWithOptionsSuite.scala +++ b/monix-eval/shared/src/test/scala/monix/eval/TaskExecuteWithOptionsSuite.scala @@ -31,7 +31,7 @@ object TaskExecuteWithOptionsSuite extends BaseTestSuite { val f = task.runToFuture s.tick() - val Some(Success((opt1, opt2))) = f.value + val Some(Success((opt1, opt2))) = f.value: @unchecked assert(opt1.localContextPropagation, "opt1.localContextPropagation") assert(!opt2.localContextPropagation, "!opt2.localContextPropagation") } diff --git a/monix-eval/shared/src/test/scala/monix/eval/TaskMemoizeOnSuccessSuite.scala b/monix-eval/shared/src/test/scala/monix/eval/TaskMemoizeOnSuccessSuite.scala index 4f1ade877..f89852389 100644 --- a/monix-eval/shared/src/test/scala/monix/eval/TaskMemoizeOnSuccessSuite.scala +++ b/monix-eval/shared/src/test/scala/monix/eval/TaskMemoizeOnSuccessSuite.scala @@ -56,7 +56,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { test("Task.memoizeOnSuccess should be stack safe") { implicit s => val count = if (Platform.isJVM) 50000 else 5000 var task = Task.evalAsync(1) - for (i <- 0 until count) task = task.memoizeOnSuccess + for (_ <- 0 until count) task = task.memoizeOnSuccess val f = task.runToFuture assertEquals(f.value, None) @@ -68,7 +68,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { val count = if (Platform.isJVM) 50000 else 5000 var task = Task.evalAsync(1) - for (i <- 0 until count) { + for (_ <- 0 until count) { task = task.memoizeOnSuccess.flatMap(x => Task.now(x)) } @@ -81,7 +81,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { test("Task.flatMap.memoizeOnSuccess should be stack safe, test 2") { implicit s => val count = if (Platform.isJVM) 50000 else 5000 var task = Task.evalAsync(1) - for (i <- 0 until count) { + for (_ <- 0 until count) { task = task.memoizeOnSuccess.flatMap(x => Task.evalAsync(x)) } @@ -171,7 +171,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { test("Task.eval.memoizeOnSuccess should be stack safe") { implicit s => val count = if (Platform.isJVM) 50000 else 5000 var task = Task.eval(1) - for (i <- 0 until count) + for (_ <- 0 until count) task = task.memoizeOnSuccess val f = task.runToFuture; s.tick() @@ -181,7 +181,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { test("Task.eval.flatMap.memoizeOnSuccess should be stack safe") { implicit s => val count = if (Platform.isJVM) 50000 else 5000 var task = Task.eval(1) - for (i <- 0 until count) { + for (_ <- 0 until count) { task = task.memoizeOnSuccess.flatMap(x => Task.eval(x)) } @@ -242,7 +242,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { test("Task.evalOnce.memoizeOnSuccess should be stack safe") { implicit s => val count = if (Platform.isJVM) 50000 else 5000 var task = Task.eval(1) - for (i <- 0 until count) { + for (_ <- 0 until count) { task = task.memoizeOnSuccess } @@ -253,7 +253,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { test("Task.evalOnce.flatMap.memoizeOnSuccess should be stack safe") { implicit s => val count = if (Platform.isJVM) 50000 else 5000 var task = Task.eval(1) - for (i <- 0 until count) { + for (_ <- 0 until count) { task = task.memoizeOnSuccess.flatMap(x => Task.evalOnce(x)) } @@ -297,7 +297,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { test("Task.now.memoizeOnSuccess should be stack safe") { implicit s => val count = if (Platform.isJVM) 50000 else 5000 var task = Task.now(1) - for (i <- 0 until count) { + for (_ <- 0 until count) { task = task.memoizeOnSuccess } @@ -308,7 +308,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { test("Task.now.flatMap.memoizeOnSuccess should be stack safe") { implicit s => val count = if (Platform.isJVM) 50000 else 5000 var task = Task.now(1) - for (i <- 0 until count) { + for (_ <- 0 until count) { task = task.memoizeOnSuccess.flatMap(x => Task.now(x)) } @@ -321,7 +321,7 @@ object TaskMemoizeOnSuccessSuite extends BaseTestSuite { test("Task.suspend.memoizeOnSuccess should be stack safe") { implicit s => val count = if (Platform.isJVM) 50000 else 5000 var task = Task.defer(Task.now(1)) - for (i <- 0 until count) { + for (_ <- 0 until count) { task = task.memoizeOnSuccess.map(x => x) } diff --git a/monix-execution/jvm/src/main/scala/monix/execution/schedulers/AdaptedThreadPoolExecutor.scala b/monix-execution/jvm/src/main/scala/monix/execution/schedulers/AdaptedThreadPoolExecutor.scala index 7bde71c5a..4c8eefc40 100644 --- a/monix-execution/jvm/src/main/scala/monix/execution/schedulers/AdaptedThreadPoolExecutor.scala +++ b/monix-execution/jvm/src/main/scala/monix/execution/schedulers/AdaptedThreadPoolExecutor.scala @@ -33,7 +33,7 @@ private[schedulers] abstract class AdaptedThreadPoolExecutor(corePoolSize: Int, if ((exception eq null) && r.isInstanceOf[Future[_]]) { try { val future = r.asInstanceOf[Future[_]] - if (future.isDone) future.get() + if (future.isDone) future.get(): Unit } catch { case ex: ExecutionException => exception = ex.getCause diff --git a/monix-execution/jvm/src/test/scala/monix/execution/atomic/ConcurrentAtomicNumberSuite.scala b/monix-execution/jvm/src/test/scala/monix/execution/atomic/ConcurrentAtomicNumberSuite.scala index 0129a6822..cf8f622fb 100644 --- a/monix-execution/jvm/src/test/scala/monix/execution/atomic/ConcurrentAtomicNumberSuite.scala +++ b/monix-execution/jvm/src/test/scala/monix/execution/atomic/ConcurrentAtomicNumberSuite.scala @@ -39,8 +39,8 @@ abstract class ConcurrentAtomicNumberSuite[A, R <: AtomicNumber[A]]( test("should perform concurrent compareAndSet") { val r = Atomic(ev.zero) - val futures = for (i <- 0 until 5) yield Future { - for (j <- 0 until 100) + val futures = for (_ <- 0 until 5) yield Future { + for (_ <- 0 until 100) r.increment() } @@ -51,7 +51,7 @@ abstract class ConcurrentAtomicNumberSuite[A, R <: AtomicNumber[A]]( test("should perform concurrent getAndSet") { val r = Atomic(ev.zero) - val futures = for (i <- 0 until 5) yield Future { + val futures = for (_ <- 0 until 5) yield Future { for (j <- 0 until 100) r.getAndSet(ev.fromInt(j + 1)) } @@ -63,8 +63,8 @@ abstract class ConcurrentAtomicNumberSuite[A, R <: AtomicNumber[A]]( test("should perform concurrent increment") { val r = Atomic(ev.zero) - val futures = for (i <- 0 until 5) yield Future { - for (j <- 0 until 100) + val futures = for (_ <- 0 until 5) yield Future { + for (_ <- 0 until 100) r.increment() } @@ -75,8 +75,8 @@ abstract class ConcurrentAtomicNumberSuite[A, R <: AtomicNumber[A]]( test("should perform concurrent incrementAndGet") { val r = Atomic(ev.zero) - val futures = for (i <- 0 until 5) yield Future { - for (j <- 0 until 100) + val futures = for (_ <- 0 until 5) yield Future { + for (_ <- 0 until 100) r.incrementAndGet() } @@ -87,8 +87,8 @@ abstract class ConcurrentAtomicNumberSuite[A, R <: AtomicNumber[A]]( test("should perform concurrent getAndIncrement") { val r = Atomic(ev.zero) - val futures = for (i <- 0 until 5) yield Future { - for (j <- 0 until 100) + val futures = for (_ <- 0 until 5) yield Future { + for (_ <- 0 until 100) r.getAndIncrement() } diff --git a/monix-execution/jvm/src/test/scala/monix/execution/atomic/ConcurrentAtomicSuite.scala b/monix-execution/jvm/src/test/scala/monix/execution/atomic/ConcurrentAtomicSuite.scala index 2df5b8ef7..3952d260e 100644 --- a/monix-execution/jvm/src/test/scala/monix/execution/atomic/ConcurrentAtomicSuite.scala +++ b/monix-execution/jvm/src/test/scala/monix/execution/atomic/ConcurrentAtomicSuite.scala @@ -38,8 +38,8 @@ abstract class ConcurrentAtomicSuite[A, R <: Atomic[A]]( test("should perform concurrent compareAndSet") { val r = Atomic(zero) - val futures = for (i <- 0 until 5) yield Future { - for (j <- 0 until 100) + val futures = for (_ <- 0 until 5) yield Future { + for (_ <- 0 until 100) r.transform(x => valueFromInt(valueToInt(x) + 1)) } @@ -50,7 +50,7 @@ abstract class ConcurrentAtomicSuite[A, R <: Atomic[A]]( test("should perform concurrent getAndSet") { val r = Atomic(zero) - val futures = for (i <- 0 until 5) yield Future { + val futures = for (_ <- 0 until 5) yield Future { for (j <- 0 until 100) r.getAndSet(valueFromInt(j)) } diff --git a/monix-execution/shared/src/main/scala/monix/execution/Ack.scala b/monix-execution/shared/src/main/scala/monix/execution/Ack.scala index d4a401d4d..ed477a79f 100644 --- a/monix-execution/shared/src/main/scala/monix/execution/Ack.scala +++ b/monix-execution/shared/src/main/scala/monix/execution/Ack.scala @@ -213,11 +213,11 @@ object Ack { */ def syncOnContinueFollow[A](p: Promise[A], value: A): Self = { if (source eq Continue) - p.trySuccess(value) + p.trySuccess(value): Unit else if (source ne Stop) source.onComplete { r => if (r.isSuccess && (r.get eq Continue)) - p.trySuccess(value) + p.trySuccess(value): Unit }(immediate) source } @@ -227,11 +227,11 @@ object Ack { */ def syncOnStopFollow[A](p: Promise[A], value: A): Self = { if (source eq Stop) - p.trySuccess(value) + p.trySuccess(value): Unit else if (source ne Continue) source.onComplete { r => if (r.isSuccess && (r.get eq Stop)) - p.trySuccess(value) + p.trySuccess(value): Unit }(immediate) source } diff --git a/monix-execution/shared/src/main/scala/monix/execution/CancelableFuture.scala b/monix-execution/shared/src/main/scala/monix/execution/CancelableFuture.scala index 0c08a360c..e06a1f5cc 100644 --- a/monix-execution/shared/src/main/scala/monix/execution/CancelableFuture.scala +++ b/monix-execution/shared/src/main/scala/monix/execution/CancelableFuture.scala @@ -128,7 +128,7 @@ sealed abstract class CancelableFuture[+A] extends Future[A] with Cancelable { s override final def andThen[U](pf: PartialFunction[Try[A], U])(implicit executor: ExecutionContext): CancelableFuture[A] = transformWith { r => - if (pf.isDefinedAt(r)) pf(r) + if (pf.isDefinedAt(r)) pf(r): Unit this } diff --git a/monix-execution/shared/src/main/scala/monix/execution/CancelablePromise.scala b/monix-execution/shared/src/main/scala/monix/execution/CancelablePromise.scala index fc00e7895..f60512961 100644 --- a/monix-execution/shared/src/main/scala/monix/execution/CancelablePromise.scala +++ b/monix-execution/shared/src/main/scala/monix/execution/CancelablePromise.scala @@ -242,7 +242,7 @@ object CancelablePromise { } if (errors ne null) { // Throws all errors as a composite - val x :: xs = errors.toList + val x :: xs = errors.toList: @unchecked throw Platform.composeErrors(x, xs: _*) } true diff --git a/monix-execution/shared/src/test/scala/monix/execution/CancelableSuite.scala b/monix-execution/shared/src/test/scala/monix/execution/CancelableSuite.scala index 7a390a0a2..36acad52b 100644 --- a/monix-execution/shared/src/test/scala/monix/execution/CancelableSuite.scala +++ b/monix-execution/shared/src/test/scala/monix/execution/CancelableSuite.scala @@ -79,7 +79,7 @@ object CancelableSuite extends SimpleTestSuite { assertEquals(e, dummy1) assertEquals(e.getSuppressed.toList, List(dummy2)) } else { - val CompositeException(errors) = e + val CompositeException(errors) = e: @unchecked assertEquals(errors.toList, List(dummy1, dummy2)) } } @@ -121,7 +121,7 @@ object CancelableSuite extends SimpleTestSuite { assertEquals(e, dummy1) assertEquals(e.getSuppressed.toList, List(dummy2)) } else { - val CompositeException(errors) = sc.state.lastReportedError + val CompositeException(errors) = sc.state.lastReportedError: @unchecked assertEquals(errors.toList, List(dummy1, dummy2)) } } diff --git a/monix-execution/shared/src/test/scala/monix/execution/cancelables/OrderedCancelableSuite.scala b/monix-execution/shared/src/test/scala/monix/execution/cancelables/OrderedCancelableSuite.scala index 623a164c4..f6bab7d11 100644 --- a/monix-execution/shared/src/test/scala/monix/execution/cancelables/OrderedCancelableSuite.scala +++ b/monix-execution/shared/src/test/scala/monix/execution/cancelables/OrderedCancelableSuite.scala @@ -107,11 +107,11 @@ object OrderedCancelableSuite extends SimpleTestSuite { val c2 = Cancelable { () => effect = 2 } - mc.orderedUpdate(c2, Long.MaxValue + 1) + mc.orderedUpdate(c2, Long.MinValue) val c3 = Cancelable { () => effect = 3 } - mc.orderedUpdate(c3, Long.MaxValue + 2) + mc.orderedUpdate(c3, Long.MinValue + 1) val c4 = Cancelable { () => effect = 4 } diff --git a/monix-execution/shared/src/test/scala/monix/execution/schedulers/ExecutionModelSuite.scala b/monix-execution/shared/src/test/scala/monix/execution/schedulers/ExecutionModelSuite.scala index 786069d17..3c9476e5c 100644 --- a/monix-execution/shared/src/test/scala/monix/execution/schedulers/ExecutionModelSuite.scala +++ b/monix-execution/shared/src/test/scala/monix/execution/schedulers/ExecutionModelSuite.scala @@ -59,7 +59,7 @@ object ExecutionModelSuite extends SimpleTestSuite { assert(em.recommendedBatchSize >= i) var index = 1 - for (j <- 1 until em.recommendedBatchSize * 3) { + for (_ <- 1 until em.recommendedBatchSize * 3) { index = em.nextFrameIndex(index) assert(index >= 0 && index < em.recommendedBatchSize) } diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/BufferIntrospectiveSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/BufferIntrospectiveSuite.scala index dd680a221..7810ed175 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/BufferIntrospectiveSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/BufferIntrospectiveSuite.scala @@ -72,7 +72,7 @@ object BufferIntrospectiveSuite extends TestSuite[TestScheduler] { s.tick() assertEquals(sum, 6) - for (i <- 0 until 10) subject.onNext(1) + for (_ <- 0 until 10) subject.onNext(1) s.tick() assertEquals(sum, 6) diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/MonixSubscriberAsReactiveSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/MonixSubscriberAsReactiveSuite.scala index 4badfdff6..2e70d4ae3 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/MonixSubscriberAsReactiveSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/MonixSubscriberAsReactiveSuite.scala @@ -273,7 +273,7 @@ object MonixSubscriberAsReactiveSuite extends TestSuite[TestScheduler] { } test("should cancel precisely with requests of size 1") { implicit s => - for (i <- 0 until 100) { + for (_ <- 0 until 100) { var completed = 0 var sum = 0L diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/subjects/BehaviorSubjectSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/subjects/BehaviorSubjectSuite.scala index 0b05bc2e9..14287d0f6 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/subjects/BehaviorSubjectSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/subjects/BehaviorSubjectSuite.scala @@ -41,7 +41,7 @@ object BehaviorSubjectSuite extends BaseSubjectSuite { var received = 0 var wasCompleted = 0 - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int): Future[Ack] = { received += elem @@ -67,7 +67,7 @@ object BehaviorSubjectSuite extends BaseSubjectSuite { var received = 0 var wasCompleted = 0 - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int) = Future { received += elem diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/subjects/ProfunctorSubjectSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/subjects/ProfunctorSubjectSuite.scala index b70ac332b..9a0136061 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/subjects/ProfunctorSubjectSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/subjects/ProfunctorSubjectSuite.scala @@ -44,7 +44,7 @@ object ProfunctorSubjectSuite extends BaseSubjectSuite { var wasCompleted = 0 var errorThrown: Throwable = null - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int): Future[Ack] = { received += elem @@ -71,7 +71,7 @@ object ProfunctorSubjectSuite extends BaseSubjectSuite { var wasCompleted = 0 var errorThrown: Throwable = null - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int): Future[Ack] = { received += elem @@ -98,7 +98,7 @@ object ProfunctorSubjectSuite extends BaseSubjectSuite { var received = 0 var wasCompleted = 0 - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int): Future[Ack] = { received += elem @@ -124,7 +124,7 @@ object ProfunctorSubjectSuite extends BaseSubjectSuite { var received = 0 var wasCompleted = 0 - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int) = Future { received += elem diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/subjects/PublishSubjectSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/subjects/PublishSubjectSuite.scala index 67f8810fa..411cc488f 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/subjects/PublishSubjectSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/subjects/PublishSubjectSuite.scala @@ -94,7 +94,7 @@ object PublishSubjectSuite extends BaseSubjectSuite { var received = 0 var wasCompleted = 0 - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int): Future[Ack] = { received += elem @@ -119,7 +119,7 @@ object PublishSubjectSuite extends BaseSubjectSuite { var received = 0 var wasCompleted = 0 - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int) = Future { received += elem diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/subjects/ReplaySubjectSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/subjects/ReplaySubjectSuite.scala index 8a4bda2f6..401d49c2f 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/subjects/ReplaySubjectSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/subjects/ReplaySubjectSuite.scala @@ -77,7 +77,7 @@ object ReplaySubjectSuite extends BaseSubjectSuite { var received = 0 var wasCompleted = 0 - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int): Future[Ack] = { received += elem @@ -104,7 +104,7 @@ object ReplaySubjectSuite extends BaseSubjectSuite { var received = 0 var wasCompleted = 0 - for (i <- 0 until 10) + for (_ <- 0 until 10) subject.unsafeSubscribeFn(new Observer[Int] { def onNext(elem: Int) = Future { received += elem diff --git a/monix-tail/shared/src/main/scala/monix/tail/internal/IterantCompleteL.scala b/monix-tail/shared/src/main/scala/monix/tail/internal/IterantCompleteL.scala index 9cd64a870..de043c4a7 100644 --- a/monix-tail/shared/src/main/scala/monix/tail/internal/IterantCompleteL.scala +++ b/monix-tail/shared/src/main/scala/monix/tail/internal/IterantCompleteL.scala @@ -90,7 +90,7 @@ private[tail] object IterantCompleteL { F.raiseError(e) private def processCursor(cursor: BatchCursor[A], rest: F[Iterant[F, A]]) = { - while (cursor.hasNext()) cursor.next() + while (cursor.hasNext()) cursor.next(): Unit rest.flatMap(this) } } diff --git a/monix-tail/shared/src/main/scala/monix/tail/internal/IterantTakeLast.scala b/monix-tail/shared/src/main/scala/monix/tail/internal/IterantTakeLast.scala index f53f7d75d..ae9fa9f89 100644 --- a/monix-tail/shared/src/main/scala/monix/tail/internal/IterantTakeLast.scala +++ b/monix-tail/shared/src/main/scala/monix/tail/internal/IterantTakeLast.scala @@ -57,13 +57,13 @@ private[tail] object IterantTakeLast { def visit(ref: NextBatch[F, A]): Iterant[F, A] = { val cursor = ref.batch.cursor() - while (cursor.hasNext()) buffer.offer(cursor.next()) + while (cursor.hasNext()) buffer.offer(cursor.next()): Unit Suspend(ref.rest.map(loop)) } def visit(ref: NextCursor[F, A]): Iterant[F, A] = { val cursor = ref.cursor - while (cursor.hasNext()) buffer.offer(cursor.next()) + while (cursor.hasNext()) buffer.offer(cursor.next()): Unit Suspend(ref.rest.map(loop)) } From fe43c8f434fb94c759e5fe4d2d6db55a00a6f4f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Fri, 27 Mar 2026 14:21:51 +0100 Subject: [PATCH 02/15] fix: add explicit `Unit` type annotations to ensure consistent type inference across observables and operators --- .../internal/builders/IntervalFixedDelayObservable.scala | 2 +- .../reactive/internal/operators/BufferTimedObservable.scala | 2 +- .../monix/reactive/internal/operators/DebounceObservable.scala | 2 +- .../reactive/internal/operators/DelayByTimespanObservable.scala | 2 +- .../reactive/internal/operators/IntersperseObservable.scala | 2 +- .../monix/reactive/internal/operators/ReduceOperator.scala | 2 +- .../reactive/internal/operators/TakeByPredicateOperator.scala | 2 +- .../reactive/internal/operators/ThrottleLatestObservable.scala | 2 +- .../scala/monix/reactive/observables/CachedObservable.scala | 2 +- .../scala/monix/reactive/observables/RefCountObservable.scala | 2 +- .../scala/monix/reactive/observers/ConnectableSubscriber.scala | 2 +- .../src/main/scala/monix/reactive/subjects/PublishSubject.scala | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/internal/builders/IntervalFixedDelayObservable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/internal/builders/IntervalFixedDelayObservable.scala index 767bdee76..af286fb28 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/internal/builders/IntervalFixedDelayObservable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/internal/builders/IntervalFixedDelayObservable.scala @@ -48,7 +48,7 @@ private[reactive] final class IntervalFixedDelayObservable(initialDelay: FiniteD def asyncScheduleNext(r: Future[Ack]): Unit = r.onComplete { case Success(ack) => - if (ack == Continue) scheduleNext() + if (ack == Continue) scheduleNext(): Unit case Failure(ex) => s.reportFailure(ex) } diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/BufferTimedObservable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/BufferTimedObservable.scala index e2bee124a..944a29a45 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/BufferTimedObservable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/BufferTimedObservable.scala @@ -69,7 +69,7 @@ private[reactive] final class BufferTimedObservable[+A](source: Observable[A], t sendNextAndReset(now).syncOnContinue( // Schedule the next tick, but only after we are done // sending the bundle - run()) + run()): Unit } () } diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/DebounceObservable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/DebounceObservable.scala index eade4dfc0..e07eb0a3e 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/DebounceObservable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/DebounceObservable.scala @@ -87,7 +87,7 @@ private[reactive] final class DebounceObservable[A](source: Observable[A], timeo mainTask.cancel() } Stop - } + }: Unit } else { val remainingTime = timeoutMillis - sinceLastOnNext scheduleNext(remainingTime) diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/DelayByTimespanObservable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/DelayByTimespanObservable.scala index 69cf76a89..72c960d8c 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/DelayByTimespanObservable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/DelayByTimespanObservable.scala @@ -73,7 +73,7 @@ private[reactive] final class DelayByTimespanObservable[A](source: Observable[A] hasError = true try out.onError(ex) finally { - if (ack != null) ack.trySuccess(Stop) + if (ack != null) ack.trySuccess(Stop): Unit task.cancel() } } diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/IntersperseObservable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/IntersperseObservable.scala index 516623633..0ace9a497 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/IntersperseObservable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/IntersperseObservable.scala @@ -61,7 +61,7 @@ private[reactive] final class IntersperseObservable[+A]( def onComplete() = { downstreamAck.syncOnContinue { - if (atLeastOne && end.nonEmpty) out.onNext(end.get) + if (atLeastOne && end.nonEmpty) out.onNext(end.get): Unit out.onComplete() } () diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/ReduceOperator.scala b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/ReduceOperator.scala index 6aecb6bbf..70454d113 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/ReduceOperator.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/ReduceOperator.scala @@ -56,7 +56,7 @@ private[reactive] final class ReduceOperator[A](op: (A, A) => A) extends Operato def onComplete(): Unit = if (!isDone) { isDone = true - if (!isFirst) out.onNext(state) + if (!isFirst) out.onNext(state): Unit out.onComplete() } diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/TakeByPredicateOperator.scala b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/TakeByPredicateOperator.scala index dd8247fa9..828a5bdac 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/TakeByPredicateOperator.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/TakeByPredicateOperator.scala @@ -47,7 +47,7 @@ private[reactive] final class TakeByPredicateOperator[A](p: A => Boolean, inclus } else { isActive = false if (inclusive) { - out.onNext(elem) + out.onNext(elem): Unit } out.onComplete() Stop diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/ThrottleLatestObservable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/ThrottleLatestObservable.scala index 7607be001..89ad69e3c 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/ThrottleLatestObservable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/internal/operators/ThrottleLatestObservable.scala @@ -114,7 +114,7 @@ private[reactive] final class ThrottleLatestObservable[A]( override def onComplete(): Unit = self.synchronized { if (!isDone) { val lastAck = if(ack == null) Continue else ack - lastAck.syncTryFlatten.syncOnContinue{signalOnComplete()} + lastAck.syncTryFlatten.syncOnContinue{signalOnComplete()}: Unit } () } diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/observables/CachedObservable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/observables/CachedObservable.scala index 9a548c9ba..b359f619a 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/observables/CachedObservable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/observables/CachedObservable.scala @@ -46,7 +46,7 @@ final class CachedObservable[+A] private (source: Observable[A], maxCapacity: In def unsafeSubscribeFn(subscriber: Subscriber[A]): Cancelable = { import subscriber.scheduler if (isStarted.compareAndSet(expect = false, update = true)) - source.unsafeSubscribeFn(Subscriber(subject, scheduler)) + source.unsafeSubscribeFn(Subscriber(subject, scheduler)): Unit subject.unsafeSubscribeFn(subscriber) } } diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/observables/RefCountObservable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/observables/RefCountObservable.scala index 206b40140..fba246617 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/observables/RefCountObservable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/observables/RefCountObservable.scala @@ -58,7 +58,7 @@ final class RefCountObservable[+A] private (source: ConnectableObservable[A]) ex val countdown = Cancelable(() => countDownToConnectionCancel()) // Subscribing and triggering connect() if this is the first subscription val ret = source.unsafeSubscribeFn(wrap(subscriber, countdown)) - if (current == -1) connection // triggers connect() + if (current == -1) connection: Unit // triggers connect() // A composite that both cancels this subscription and does the countdown Cancelable { () => try ret.cancel() diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/observers/ConnectableSubscriber.scala b/monix-reactive/shared/src/main/scala/monix/reactive/observers/ConnectableSubscriber.scala index 27eff2718..e61943f26 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/observers/ConnectableSubscriber.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/observers/ConnectableSubscriber.scala @@ -169,7 +169,7 @@ final class ConnectableSubscriber[-A] private (underlying: Subscriber[A]) extend def onComplete(): Unit = { if (!scheduledDone) { - ack.syncOnContinue { bufferWasDrained.trySuccess(Continue); () } + ack.syncOnContinue { bufferWasDrained.trySuccess(Continue); () }: Unit } else if (scheduledError ne null) { if (bufferWasDrained.trySuccess(Stop)) underlying.onError(scheduledError) diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/subjects/PublishSubject.scala b/monix-reactive/shared/src/main/scala/monix/reactive/subjects/PublishSubject.scala index ed372134f..edc45f23b 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/subjects/PublishSubject.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/subjects/PublishSubject.scala @@ -126,7 +126,7 @@ final class PublishSubject[A] private () extends Subject[A, A] { self => if (ack.isCompleted) { // subscriber canceled or triggered an error? Then remove! if (ack != Continue && ack.value.get != Continue.AsSuccess) - unsubscribe(subscriber) + unsubscribe(subscriber): Unit } else { // going async, so we've got to count active futures for final Ack // the counter starts from 1 because zero implies isCompleted From 6665e0125e664a157d00bcb013474d0b2bd8835a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Fri, 27 Mar 2026 14:35:07 +0100 Subject: [PATCH 03/15] refactor: add missing type annotations and mark unused variable in TaskFlatMapSuite --- .../shared/src/test/scala/monix/eval/TaskFlatMapSuite.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/monix-eval/shared/src/test/scala/monix/eval/TaskFlatMapSuite.scala b/monix-eval/shared/src/test/scala/monix/eval/TaskFlatMapSuite.scala index 111c79817..2bc43ab92 100644 --- a/monix-eval/shared/src/test/scala/monix/eval/TaskFlatMapSuite.scala +++ b/monix-eval/shared/src/test/scala/monix/eval/TaskFlatMapSuite.scala @@ -23,11 +23,13 @@ import monix.execution.Callback import monix.execution.atomic.{Atomic, AtomicInt} import monix.execution.exceptions.DummyException import monix.execution.internal.Platform + +import scala.annotation.unused import scala.util.{Failure, Random, Success, Try} object TaskFlatMapSuite extends BaseTestSuite { test("runAsync flatMap loop is not cancelable if autoCancelableRunLoops=false") { implicit s => - implicit val opts = Task.defaultOptions.disableAutoCancelableRunLoops + implicit val opts: Task.Options = Task.defaultOptions.disableAutoCancelableRunLoops val maxCount = Platform.recommendedBatchSize * 4 def loop(count: AtomicInt): Task[Unit] = @@ -77,7 +79,7 @@ object TaskFlatMapSuite extends BaseTestSuite { Task.unit.flatMap(_ => loop(count)) val atomic = Atomic(0) - var result = Option.empty[Try[Unit]] + @unused var result = Option.empty[Try[Unit]] val c = loop(atomic) .executeWithOptions(_.enableAutoCancelableRunLoops) From 044af8de7259d8be698ae1e80b5de7cc2c41bfc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Fri, 27 Mar 2026 15:05:13 +0100 Subject: [PATCH 04/15] refactor: add `@unused` annotation to unused variables and enforce explicit type annotations in test suites --- .../scala/monix/execution/FutureUtilsJVMSuite.scala | 8 ++++++-- .../consumers/ForeachAsyncConsumerSuite.scala | 3 ++- .../reactive/consumers/ForeachConsumerSuite.scala | 4 +++- .../builders/InputStreamObservableSuite.scala | 5 +++-- .../builders/LinesReaderObservableSuite.scala | 5 +++-- .../reactive/internal/operators/GroupBySuite.scala | 4 +++- .../internal/operators/MapParallelOrderedSuite.scala | 11 ++++++----- .../operators/MapParallelUnorderedSuite.scala | 8 ++++---- .../WhileBusyDropEventsAndSignalOverflowSuite.scala | 4 +++- .../internal/operators/WhileBusyDropEventsSuite.scala | 4 +++- .../rstreams/MonixSubscriberAsReactiveSuite.scala | 9 +++++---- .../rstreams/ObservableIsPublisherSuite.scala | 3 ++- .../monix/reactive/observers/ObserverFeedSuite.scala | 4 +++- .../reactive/observers/SubscriberFeedSuite.scala | 3 ++- 14 files changed, 48 insertions(+), 27 deletions(-) diff --git a/monix-execution/jvm/src/test/scala/monix/execution/FutureUtilsJVMSuite.scala b/monix-execution/jvm/src/test/scala/monix/execution/FutureUtilsJVMSuite.scala index 49835893f..d40b700ae 100644 --- a/monix-execution/jvm/src/test/scala/monix/execution/FutureUtilsJVMSuite.scala +++ b/monix-execution/jvm/src/test/scala/monix/execution/FutureUtilsJVMSuite.scala @@ -19,13 +19,13 @@ package monix.execution import java.util.concurrent.Executors import java.util.concurrent.atomic.AtomicLong - import minitest.TestSuite import monix.execution.FutureUtils.extensions._ import monix.execution.schedulers.TestScheduler import scala.concurrent.Future import scala.concurrent.duration._ +import scala.reflect.ClassTag object FutureUtilsJVMSuite extends TestSuite[TestScheduler] { @@ -40,6 +40,10 @@ object FutureUtilsJVMSuite extends TestSuite[TestScheduler] { case class TestException() extends RuntimeException + object TestException { + val ct: ClassTag[TestException] = implicitly[ClassTag[TestException]] + } + val total = new AtomicLong(0) val sideEffect = new AtomicLong(0) val error = new AtomicLong(0) @@ -64,7 +68,7 @@ object FutureUtilsJVMSuite extends TestSuite[TestScheduler] { success.incrementAndGet() () }.recover { - case _: TestException => + case TestException.ct(_) => error.incrementAndGet() () } diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/consumers/ForeachAsyncConsumerSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/consumers/ForeachAsyncConsumerSuite.scala index 4ce4f098a..e310b6b5c 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/consumers/ForeachAsyncConsumerSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/consumers/ForeachAsyncConsumerSuite.scala @@ -24,6 +24,7 @@ import monix.execution.exceptions.DummyException import monix.execution.schedulers.TestScheduler import monix.reactive.{Consumer, Observable} +import scala.annotation.unused import scala.concurrent.Future import scala.util.{Failure, Success} @@ -66,7 +67,7 @@ object ForeachAsyncConsumerSuite extends TestSuite[TestScheduler] { test("should interrupt with error") { implicit s => val ex = DummyException("dummy") val obs = Observable.range(0, 10000).endWithError(ex) - var sum = 0L + @unused var sum = 0L val f = obs .consumeWith( Consumer diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/consumers/ForeachConsumerSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/consumers/ForeachConsumerSuite.scala index d58ea687f..a613c15b8 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/consumers/ForeachConsumerSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/consumers/ForeachConsumerSuite.scala @@ -21,6 +21,8 @@ import minitest.TestSuite import monix.execution.exceptions.DummyException import monix.execution.schedulers.TestScheduler import monix.reactive.{Consumer, Observable} + +import scala.annotation.unused import scala.util.{Failure, Success} object ForeachConsumerSuite extends TestSuite[TestScheduler] { @@ -43,7 +45,7 @@ object ForeachConsumerSuite extends TestSuite[TestScheduler] { test("should interrupt with error") { implicit s => val ex = DummyException("dummy") val obs = Observable.range(0, 10000).endWithError(ex) - var sum = 0L + @unused var sum = 0L val f = obs.consumeWith(Consumer.foreach(x => sum += x)).runToFuture s.tick() diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/builders/InputStreamObservableSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/builders/InputStreamObservableSuite.scala index 51ad68643..2acef1e00 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/builders/InputStreamObservableSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/builders/InputStreamObservableSuite.scala @@ -30,6 +30,7 @@ import monix.reactive.Observable import monix.reactive.observers.Subscriber import org.scalacheck.{Gen, Prop} +import scala.annotation.unused import scala.collection.mutable.ListBuffer import scala.util.{Failure, Random, Success} @@ -109,9 +110,9 @@ object InputStreamObservableSuite extends SimpleTestSuite with Checkers { } test("fromInputStreamUnsafe works for SynchronousExecution") { - implicit val s = TestScheduler(SynchronousExecution) + implicit val s: TestScheduler = TestScheduler(SynchronousExecution) - var wasCompleted = 0 + @unused var wasCompleted = 0 val received = ListBuffer.empty[Byte] val array = randomByteArray() val in = new ByteArrayInputStream(array) diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/builders/LinesReaderObservableSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/builders/LinesReaderObservableSuite.scala index f7bb0db40..5e19fd92b 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/builders/LinesReaderObservableSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/builders/LinesReaderObservableSuite.scala @@ -29,6 +29,7 @@ import monix.reactive.Observable import monix.execution.exceptions.DummyException import monix.reactive.observers.Subscriber +import scala.annotation.unused import scala.util.{Failure, Random, Success} object LinesReaderObservableSuite extends SimpleTestSuite { @@ -87,9 +88,9 @@ object LinesReaderObservableSuite extends SimpleTestSuite { } test("fromLinesReaderUnsafe works for SynchronousExecution") { - implicit val s = TestScheduler(SynchronousExecution) + implicit val s: TestScheduler = TestScheduler(SynchronousExecution) - var wasCompleted = 0 + @unused var wasCompleted = 0 var received = "" val string = randomString() val in = new BufferedReader(new StringReader(string)) diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/GroupBySuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/GroupBySuite.scala index 5dcb76d63..acffa81da 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/GroupBySuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/GroupBySuite.scala @@ -22,6 +22,8 @@ import monix.execution.Ack import monix.execution.Ack.{Continue, Stop} import monix.reactive.subjects.PublishSubject import monix.reactive.{Observable, Observer} + +import scala.annotation.unused import scala.concurrent.Future import scala.concurrent.duration.Duration.Zero import scala.concurrent.duration._ @@ -59,7 +61,7 @@ object GroupBySuite extends BaseOperatorSuite { test("on complete the key should get recycled") { implicit s => var received = 0 - var wasCompleted = 0 + @unused var wasCompleted = 0 var fallbackTick = 0 var nextShouldCancel = false diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/MapParallelOrderedSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/MapParallelOrderedSuite.scala index 81557d88c..45d4de2c9 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/MapParallelOrderedSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/MapParallelOrderedSuite.scala @@ -26,6 +26,7 @@ import monix.execution.exceptions.DummyException import monix.execution.internal.Platform import monix.reactive.{Observable, Observer, OverflowStrategy} +import scala.annotation.unused import scala.concurrent.{Future, Promise} import scala.concurrent.duration._ import scala.util.{Failure, Random} @@ -198,7 +199,7 @@ object MapParallelOrderedSuite extends BaseOperatorSuite { val dummy = DummyException("dummy") var isComplete = false var wasThrown: Throwable = null - var received = 0L + @unused var received = 0L val task1 = Task(1L) val task2 = Task.raiseError[Long](dummy) @@ -234,8 +235,8 @@ object MapParallelOrderedSuite extends BaseOperatorSuite { test("should interrupt the streaming on error, test #2") { implicit s => val dummy = DummyException("dummy") var isComplete = false - var wasThrown: Throwable = null - var received = 0L + @unused var wasThrown: Throwable = null + @unused var received = 0L val task1 = Task(1L) val tasks = List.fill(8)(task1) @@ -270,8 +271,8 @@ object MapParallelOrderedSuite extends BaseOperatorSuite { test("should protect against user error") { implicit s => val dummy = DummyException("dummy") var isComplete = false - var wasThrown: Throwable = null - var received = 0L + @unused var wasThrown: Throwable = null + @unused var received = 0L Observable .range(0, 100) diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/MapParallelUnorderedSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/MapParallelUnorderedSuite.scala index 77e64e38c..112ab71d2 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/MapParallelUnorderedSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/MapParallelUnorderedSuite.scala @@ -19,13 +19,13 @@ package monix.reactive.internal.operators import cats.laws._ import cats.laws.discipline._ - import monix.eval.Task import monix.execution.Ack.Continue import monix.execution.internal.Platform import monix.execution.exceptions.DummyException import monix.reactive.{Observable, Observer, OverflowStrategy} +import scala.annotation.unused import scala.concurrent.Promise import scala.concurrent.duration._ import scala.util.{Failure, Random} @@ -155,7 +155,7 @@ object MapParallelUnorderedSuite extends BaseOperatorSuite { val dummy = DummyException("dummy") var isComplete = false var wasThrown: Throwable = null - var received = 0L + @unused var received = 0L val task1 = Task.evalAsync(1L) val task2 = Task.raiseError[Long](dummy) @@ -192,7 +192,7 @@ object MapParallelUnorderedSuite extends BaseOperatorSuite { val dummy = DummyException("dummy") var isComplete = false var wasThrown: Throwable = null - var received = 0L + @unused var received = 0L val task1 = Task.evalAsync(1L) val tasks = List.fill(8)(task1) @@ -228,7 +228,7 @@ object MapParallelUnorderedSuite extends BaseOperatorSuite { val dummy = DummyException("dummy") var isComplete = false var wasThrown: Throwable = null - var received = 0L + @unused var received = 0L Observable .range(0, 100) diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/WhileBusyDropEventsAndSignalOverflowSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/WhileBusyDropEventsAndSignalOverflowSuite.scala index d763abb22..77f974a88 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/WhileBusyDropEventsAndSignalOverflowSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/WhileBusyDropEventsAndSignalOverflowSuite.scala @@ -22,6 +22,8 @@ import monix.execution.Ack.Continue import monix.execution.schedulers.TestScheduler import monix.reactive.subjects.PublishSubject import monix.reactive.{Observable, Observer} + +import scala.annotation.unused import scala.concurrent.Promise import scala.util.Success @@ -47,7 +49,7 @@ object WhileBusyDropEventsAndSignalOverflowSuite extends TestSuite[TestScheduler val source = PublishSubject[Long]() val p = Promise[Continue.type]() var received = 0L - var wasCompleted = false + @unused var wasCompleted = false source .whileBusyDropEventsAndSignal(x => x) diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/WhileBusyDropEventsSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/WhileBusyDropEventsSuite.scala index 96e542f4f..a2e2c877f 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/WhileBusyDropEventsSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/operators/WhileBusyDropEventsSuite.scala @@ -23,6 +23,8 @@ import monix.execution.schedulers.TestScheduler import monix.execution.exceptions.DummyException import monix.reactive.subjects.PublishSubject import monix.reactive.{Observable, Observer} + +import scala.annotation.unused import scala.concurrent.Promise import scala.util.Success @@ -43,7 +45,7 @@ object WhileBusyDropEventsSuite extends TestSuite[TestScheduler] { val source = PublishSubject[Long]() val p = Promise[Continue.type]() var received = 0L - var wasCompleted = false + @unused var wasCompleted = false source.whileBusyDropEvents.unsafeSubscribeFn(new Observer[Long] { def onNext(elem: Long) = { diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/MonixSubscriberAsReactiveSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/MonixSubscriberAsReactiveSuite.scala index 2e70d4ae3..7ff1b1d5d 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/MonixSubscriberAsReactiveSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/MonixSubscriberAsReactiveSuite.scala @@ -22,6 +22,7 @@ import monix.execution.Ack.{Continue, Stop} import monix.execution.schedulers.TestScheduler import monix.reactive.{Observable, Observer} +import scala.annotation.unused import scala.concurrent.Future object MonixSubscriberAsReactiveSuite extends TestSuite[TestScheduler] { @@ -37,7 +38,7 @@ object MonixSubscriberAsReactiveSuite extends TestSuite[TestScheduler] { test("should work with synchronous batched requests") { implicit scheduler => var sum = 0L - var completed = false + @unused var completed = false val observer = new Observer[Long] { def onNext(elem: Long) = { @@ -145,7 +146,7 @@ object MonixSubscriberAsReactiveSuite extends TestSuite[TestScheduler] { } test("should work synchronously and with requests of size 1") { implicit s => - var completed = false + @unused var completed = false var sum = 0L val observer = new Observer[Long] { @@ -174,7 +175,7 @@ object MonixSubscriberAsReactiveSuite extends TestSuite[TestScheduler] { } test("should work with asynchronous boundaries and batched requests") { implicit s => - var completed = false + @unused var completed = false var sum = 0L val observer = new Observer[Long] { @@ -203,7 +204,7 @@ object MonixSubscriberAsReactiveSuite extends TestSuite[TestScheduler] { } test("should work with asynchronous boundaries and requests of size 1") { implicit scheduler => - var completed = false + @unused var completed = false var sum = 0L val observer = new Observer[Long] { diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/ObservableIsPublisherSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/ObservableIsPublisherSuite.scala index b49704589..e614b2f21 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/ObservableIsPublisherSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/internal/rstreams/ObservableIsPublisherSuite.scala @@ -26,6 +26,7 @@ import monix.reactive.Observable import monix.reactive.subjects.PublishSubject import org.reactivestreams.{Subscriber, Subscription} +import scala.annotation.unused import scala.util.Success object ObservableIsPublisherSuite extends TestSuite[TestScheduler] { @@ -40,7 +41,7 @@ object ObservableIsPublisherSuite extends TestSuite[TestScheduler] { } test("should work with stop-and-wait back-pressure, test 1") { implicit scheduler => - var wasCompleted = false + @unused var wasCompleted = false var sum = 0L Observable diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/observers/ObserverFeedSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/observers/ObserverFeedSuite.scala index 7933f22f1..f0ef12dca 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/observers/ObserverFeedSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/observers/ObserverFeedSuite.scala @@ -20,6 +20,8 @@ package monix.reactive.observers import monix.execution.Ack.{Continue, Stop} import monix.execution.cancelables.BooleanCancelable import monix.reactive.{BaseTestSuite, Observer} + +import scala.annotation.unused import scala.concurrent.Future import scala.util.Success @@ -98,7 +100,7 @@ object ObserverFeedSuite extends BaseTestSuite { test("should be cancelable") { implicit s => check1 { (xs: List[Int]) => - var sum = 0 + @unused var sum = 0 val downstream = new Observer[Int] { def onError(ex: Throwable): Unit = () def onComplete(): Unit = sum += 100 diff --git a/monix-reactive/shared/src/test/scala/monix/reactive/observers/SubscriberFeedSuite.scala b/monix-reactive/shared/src/test/scala/monix/reactive/observers/SubscriberFeedSuite.scala index 7759f1f5d..998b525b2 100644 --- a/monix-reactive/shared/src/test/scala/monix/reactive/observers/SubscriberFeedSuite.scala +++ b/monix-reactive/shared/src/test/scala/monix/reactive/observers/SubscriberFeedSuite.scala @@ -23,6 +23,7 @@ import monix.execution.cancelables.BooleanCancelable import monix.execution.compat.internal.toIterator import monix.reactive.BaseTestSuite +import scala.annotation.unused import scala.concurrent.Future object SubscriberFeedSuite extends BaseTestSuite { @@ -144,7 +145,7 @@ object SubscriberFeedSuite extends BaseTestSuite { test("should be cancelable") { s => check1 { (xs: List[Int]) => - var sum = 0 + @unused var sum = 0 val downstream = new Subscriber[Int] { implicit val scheduler: Scheduler = s def onError(ex: Throwable): Unit = () From 576ebf23c9788ede956caef1ad4fe211de767d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Fri, 27 Mar 2026 15:58:29 +0100 Subject: [PATCH 05/15] refactor: add `@unused` annotation to unused variables in CircuitBreaker docs --- .../src/main/scala/monix/catnap/CircuitBreaker.scala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/CircuitBreaker.scala b/monix-catnap/shared/src/main/scala/monix/catnap/CircuitBreaker.scala index e4135d17f..02d6dea8b 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/CircuitBreaker.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/CircuitBreaker.scala @@ -118,7 +118,7 @@ import scala.concurrent.duration._ * throw new RuntimeException("dummy") * } * - * val task = circuitBreaker.protect(problematic) + * @annotation.unused val task = circuitBreaker.protect(problematic) * }}} * * When attempting to close the circuit breaker and resume normal @@ -126,7 +126,7 @@ import scala.concurrent.duration._ * failed attempts, like so: * * {{{ - * val exponential = CircuitBreaker[IO].of( + * @annotation.unused val exponential = CircuitBreaker[IO].of( * maxFailures = 5, * resetTimeout = 10.seconds, * exponentialBackoffFactor = 2, @@ -159,7 +159,7 @@ import scala.concurrent.duration._ * import cats.effect._ * import monix.execution.exceptions.ExecutionRejectedException * - * def protectWithRetry[F[_], A](task: F[A], cb: CircuitBreaker[F], delay: FiniteDuration) + * @annotation.unused def protectWithRetry[F[_], A](task: F[A], cb: CircuitBreaker[F], delay: FiniteDuration) * (implicit F: Async[F], timer: Timer[F]): F[A] = { * * cb.protect(task).recoverWith { @@ -175,7 +175,7 @@ import scala.concurrent.duration._ * [[CircuitBreaker!.awaitClose awaitClose]] method: * * {{{ - * def protectWithRetry2[F[_], A](task: F[A], cb: CircuitBreaker[F]) + * @annotation.unused def protectWithRetry2[F[_], A](task: F[A], cb: CircuitBreaker[F]) * (implicit F: Async[F]): F[A] = { * * cb.protect(task).recoverWith { @@ -596,7 +596,7 @@ object CircuitBreaker extends CircuitBreakerDocs { * import cats.effect.{IO, Clock} * implicit val clock: Clock[IO] = Clock.create[IO] * - * val cb = CircuitBreaker[IO].of( + * @annotation.unused val cb = CircuitBreaker[IO].of( * maxFailures = 10, * resetTimeout = 3.second, * exponentialBackoffFactor = 2 From 094a99e00210cfa35edf734bea9089651816b79f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 12:36:40 +0200 Subject: [PATCH 06/15] refactor: add `@unused` annotation to unused variables and enforce explicit `Unit` type annotations in docs --- .../src/main/scala/monix/catnap/ConcurrentChannel.scala | 6 +++--- .../src/main/scala/monix/catnap/ConcurrentQueue.scala | 4 ++-- .../shared/src/main/scala/monix/catnap/ConsumerF.scala | 4 ++-- .../shared/src/main/scala/monix/catnap/FutureLift.scala | 8 ++++---- .../shared/src/main/scala/monix/catnap/ProducerF.scala | 4 ++-- .../shared/src/main/scala/monix/catnap/Semaphore.scala | 2 +- monix-eval/shared/src/main/scala/monix/eval/Task.scala | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala index 13a82091c..7b8d5e065 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala @@ -53,7 +53,7 @@ import scala.collection.mutable.ArrayBuffer * // For being able to do IO.start * implicit val cs: ContextShift[IO] = SchedulerEffect.contextShift[IO](global)(IO.ioEffect) * // We need a `Timer` for this to work - * implicit val timer: Timer[IO] = SchedulerEffect.timer[IO](global) + * @annotation.unused implicit val timer: Timer[IO] = SchedulerEffect.timer[IO](global) * * // Completion event * sealed trait Complete @@ -269,7 +269,7 @@ final class ConcurrentChannel[F[_], E, A] private ( * sealed trait Complete * object Complete extends Complete * - * def range[F[_]](from: Int, until: Int, increment: Int = 1) + * @annotation.unused def range[F[_]](from: Int, until: Int, increment: Int = 1) * (channel: ConcurrentChannel[F, Complete, Int]) * (implicit F: Sync[F]): F[Unit] = { * @@ -321,7 +321,7 @@ final class ConcurrentChannel[F[_], E, A] private ( * sealed trait Complete * object Complete extends Complete * - * def range[F[_]](from: Int, until: Int, increment: Int = 1) + * @annotation.unused def range[F[_]](from: Int, until: Int, increment: Int = 1) * (channel: ConcurrentChannel[F, Complete, Int]) * (implicit F: Sync[F]): F[Unit] = { * diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentQueue.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentQueue.scala index 2feb5054e..8700b3e53 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentQueue.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentQueue.scala @@ -46,7 +46,7 @@ import scala.collection.mutable.ArrayBuffer * // For being able to do IO.start * implicit val cs: ContextShift[IO] = SchedulerEffect.contextShift[IO](global)(IO.ioEffect) * // We need a `Timer` for this to work - * implicit val timer: Timer[IO] = SchedulerEffect.timer[IO](global) + * @annotation.unused implicit val timer: Timer[IO] = SchedulerEffect.timer[IO](global) * * def consumer(queue: ConcurrentQueue[IO, Int], index: Int): IO[Unit] = * queue.poll.flatMap { a => @@ -108,7 +108,7 @@ import scala.collection.mutable.ArrayBuffer * import monix.execution.ChannelType.MPSC * import monix.execution.BufferCapacity.Bounded * - * val queue = ConcurrentQueue[IO].withConfig[Int]( + * @annotation.unused val queue = ConcurrentQueue[IO].withConfig[Int]( * capacity = Bounded(128), * channelType = MPSC * ) diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala index b0e6021fe..ac1c77df3 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala @@ -38,7 +38,7 @@ trait ConsumerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long = 0) + * @annotation.unused def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long = 0) * (implicit F: Async[F]): F[Long] = { * * channel.pull.flatMap { @@ -62,7 +62,7 @@ trait ConsumerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long = 0) + * @annotation.unused def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long = 0) * (implicit F: Async[F]): F[Long] = { * * channel.pullMany(1, 16).flatMap { diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/FutureLift.scala b/monix-catnap/shared/src/main/scala/monix/catnap/FutureLift.scala index 8fdfa8357..2027668be 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/FutureLift.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/FutureLift.scala @@ -37,7 +37,7 @@ import scala.concurrent.{Future => ScalaFuture} * // Can use any data type implementing Async or Concurrent * import cats.effect.IO * - * val io = IO(Future(1 + 1)).futureLift + * @annotation.unused val io = IO(Future(1 + 1)).futureLift * }}} * * `IO` provides its own `IO.fromFuture` of course, however @@ -57,7 +57,7 @@ import scala.concurrent.{Future => ScalaFuture} * } * * // The result will be cancelable: - * val sum: IO[Int] = IO(delayed(1 + 1)).futureLift + * @annotation.unused val sum: IO[Int] = IO(delayed(1 + 1)).futureLift * }}} */ trait FutureLift[F[_], Future[_]] extends (FutureLift.Lambda[F, Future, *] ~> F) { @@ -76,7 +76,7 @@ object FutureLift extends internal.FutureLiftForPlatform { * * val F = FutureLift[IO, Future] * - * val task: IO[Int] = F.apply(IO(Future(1 + 1))) + * @annotation.unused val task: IO[Int] = F.apply(IO(Future(1 + 1))) * }}} */ def apply[F[_], Future[_]](implicit F: FutureLift[F, Future]): FutureLift[F, Future] = F @@ -89,7 +89,7 @@ object FutureLift extends internal.FutureLiftForPlatform { * import scala.concurrent.Future * import scala.concurrent.ExecutionContext.Implicits.global * - * val ioa = FutureLift.from(IO(Future(1 + 1))) + * @annotation.unused val ioa = FutureLift.from(IO(Future(1 + 1))) * }}} */ def from[F[_], Future[_], A](fa: F[Future[A]])(implicit F: FutureLift[F, Future]): F[A] = diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ProducerF.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ProducerF.scala index c6a0cb759..7e8c6e20d 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ProducerF.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ProducerF.scala @@ -59,7 +59,7 @@ trait ProducerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * def range[F[_]](channel: ProducerF[F, Int, Int], from: Int, until: Int) + * @annotation.unused def range[F[_]](channel: ProducerF[F, Int, Int], from: Int, until: Int) * (implicit F: Async[F]): F[Unit] = { * * if (from < until) { @@ -110,7 +110,7 @@ trait ProducerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * def range[F[_]](channel: ProducerF[F, Int, Int], from: Int, until: Int) + * @annotation.unused def range[F[_]](channel: ProducerF[F, Int, Int], from: Int, until: Int) * (implicit F: Async[F]): F[Unit] = { * * if (from < until) { diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala b/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala index 1ec2ac721..b8e4cfc89 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala @@ -43,7 +43,7 @@ import scala.concurrent.Promise * * // Dummies for didactic purposes * case class HttpRequest() - * case class HttpResponse() + * @annotation.unused case class HttpResponse() * def makeRequest(r: HttpRequest): IO[HttpResponse] = IO(???) * * for { diff --git a/monix-eval/shared/src/main/scala/monix/eval/Task.scala b/monix-eval/shared/src/main/scala/monix/eval/Task.scala index 4965f5111..6bf25be0d 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/Task.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/Task.scala @@ -1603,7 +1603,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * var line: String = "" * while (line != null) { * line = in.readLine() - * if (line != null) buffer.append(line) + * if (line != null) buffer.append(line): Unit * } * * buffer.toString From da45486b601cd4d429e8685bb3caff112914c288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 14:42:28 +0200 Subject: [PATCH 07/15] refactor: add `@unused` annotation to unused variables and enforce explicit `Unit` type annotations in docs --- .../monix/catnap/ConcurrentChannel.scala | 4 +- .../main/scala/monix/catnap/ConsumerF.scala | 4 +- .../src/main/scala/monix/eval/Coeval.scala | 18 ++-- .../main/scala/monix/eval/CoevalLike.scala | 4 +- .../src/main/scala/monix/eval/Fiber.scala | 2 +- .../src/main/scala/monix/eval/Task.scala | 86 +++++++++---------- .../src/main/scala/monix/eval/TaskLike.scala | 6 +- .../src/main/scala/monix/eval/TaskLocal.scala | 10 +-- .../eval/internal/CoevalDeprecated.scala | 6 +- 9 files changed, 70 insertions(+), 70 deletions(-) diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala index 7b8d5e065..f17700e22 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala @@ -269,7 +269,7 @@ final class ConcurrentChannel[F[_], E, A] private ( * sealed trait Complete * object Complete extends Complete * - * @annotation.unused def range[F[_]](from: Int, until: Int, increment: Int = 1) + * @annotation.unused def range[F[_]](from: Int, until: Int, increment: Int) * (channel: ConcurrentChannel[F, Complete, Int]) * (implicit F: Sync[F]): F[Unit] = { * @@ -321,7 +321,7 @@ final class ConcurrentChannel[F[_], E, A] private ( * sealed trait Complete * object Complete extends Complete * - * @annotation.unused def range[F[_]](from: Int, until: Int, increment: Int = 1) + * @annotation.unused def range[F[_]](from: Int, until: Int, increment: Int) * (channel: ConcurrentChannel[F, Complete, Int]) * (implicit F: Sync[F]): F[Unit] = { * diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala index ac1c77df3..3c486dc48 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala @@ -38,7 +38,7 @@ trait ConsumerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * @annotation.unused def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long = 0) + * @annotation.unused def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long) * (implicit F: Async[F]): F[Long] = { * * channel.pull.flatMap { @@ -62,7 +62,7 @@ trait ConsumerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * @annotation.unused def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long = 0) + * @annotation.unused def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long) * (implicit F: Async[F]): F[Long] = { * * channel.pullMany(1, 16).flatMap { diff --git a/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala b/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala index 123b919e1..4a812c6d4 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala @@ -189,7 +189,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * * Example: * {{{ - * val combined = Coeval{println("first"); "first"} >> Coeval{println("second"); "second"} + * @annotation.unused val combined = Coeval{println("first"); "first"} >> Coeval{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "second" * }}} @@ -202,7 +202,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * * Example: * {{{ - * val combined = Coeval{println("first"); "first"} *> Coeval{println("second"); "second"} + * @annotation.unused val combined = Coeval{println("first"); "first"} *> Coeval{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "second" * }}} @@ -215,7 +215,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * * Example: * {{{ - * val combined = Coeval{println("first"); "first"} <* Coeval{println("second"); "second"} + * @annotation.unused val combined = Coeval{println("first"); "first"} <* Coeval{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "first" * }}} @@ -425,7 +425,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * {{{ * import java.io._ * - * def readFile(file: File): Coeval[String] = { + * @annotation.unused def readFile(file: File): Coeval[String] = { * // Opening a file handle for reading text * val acquire = Coeval.eval(new BufferedReader( * new InputStreamReader(new FileInputStream(file), "utf-8") @@ -628,7 +628,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * import scala.util.Random * * val random = Coeval(Random.nextInt()) - * val loop = random.flatMapLoop(Vector.empty[Int]) { (a, list, continue) => + * @annotation.unused val loop = random.flatMapLoop(Vector.empty[Int]) { (a, list, continue) => * val newList = list :+ a * if (newList.length < 5) * continue(newList) @@ -737,9 +737,9 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * * val source = Coeval { 1 + 1 } * - * val asIO: IO[Int] = source.to[IO] - * val asEval: Eval[Int] = source.to[Eval] - * val asTask: Task[Int] = source.to[Task] + * @annotation.unused val asIO: IO[Int] = source.to[IO] + * @annotation.unused val asEval: Eval[Int] = source.to[Eval] + * @annotation.unused val asTask: Task[Int] = source.to[Task] * }}} */ final def to[F[_]](implicit F: CoevalLift[F]): F[A @uV] = @@ -1465,7 +1465,7 @@ object Coeval extends CoevalInstancesLevel0 { * }) * * // Lifting to a Resource of Coeval - * val res: Resource[Coeval, InputStream] = + * @annotation.unused val res: Resource[Coeval, InputStream] = * open(new File("sample")).mapK(Coeval.liftFrom[SyncIO]) * }}} * diff --git a/monix-eval/shared/src/main/scala/monix/eval/CoevalLike.scala b/monix-eval/shared/src/main/scala/monix/eval/CoevalLike.scala index 9a809592b..fceafc607 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/CoevalLike.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/CoevalLike.scala @@ -29,13 +29,13 @@ import scala.util.Try * import cats.Eval * * val source0 = Eval.always(1 + 1) - * val task0 = CoevalLike[Eval].apply(source0) + * @annotation.unused val task0 = CoevalLike[Eval].apply(source0) * * // Conversion from SyncIO * import cats.effect.SyncIO * * val source1 = SyncIO(1 + 1) - * val task1 = CoevalLike[SyncIO].apply(source1) + * @annotation.unused val task1 = CoevalLike[SyncIO].apply(source1) * }}} * * This is an alternative to usage of `cats.effect.Effect` diff --git a/monix-eval/shared/src/main/scala/monix/eval/Fiber.scala b/monix-eval/shared/src/main/scala/monix/eval/Fiber.scala index f1d18ca07..b12b1a801 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/Fiber.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/Fiber.scala @@ -30,7 +30,7 @@ import cats.effect.CancelToken * {{{ * val task = Task.evalAsync(println("Hello!")) * - * val forked: Task[Fiber[Unit]] = task.start + * @annotation.unused val forked: Task[Fiber[Unit]] = task.start * }}} * * Usage example: diff --git a/monix-eval/shared/src/main/scala/monix/eval/Task.scala b/monix-eval/shared/src/main/scala/monix/eval/Task.scala index 6bf25be0d..c89361741 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/Task.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/Task.scala @@ -67,8 +67,8 @@ import scala.util.{Failure, Success, Try} * [[monix.eval.Task.evalAsync Task.evalAsync]]: * * {{{ - * val hello = Task("Hello ") - * val world = Task.evalAsync("World!") + * @annotation.unused val hello = Task("Hello ") + * @annotation.unused val world = Task.evalAsync("World!") * }}} * * Nothing gets executed yet, as `Task` is lazy, nothing executes @@ -80,7 +80,7 @@ import scala.util.{Failure, Success, Try} * it's in a very real sense because of the laziness involved: * * {{{ - * val sayHello = hello + * @annotation.unused val sayHello = hello * .flatMap(h => world.map(w => h + w)) * .map(println) * }}} @@ -92,7 +92,7 @@ import scala.util.{Failure, Success, Try} * import monix.execution.CancelableFuture * import monix.execution.Scheduler.Implicits.global * - * val f: CancelableFuture[Unit] = sayHello.runToFuture + * @annotation.unused val f: CancelableFuture[Unit] = sayHello.runToFuture * // => Hello World! * }}} * @@ -191,7 +191,7 @@ import scala.util.{Failure, Success, Try} * val allBatches = Task.sequence(batchedTasks) * * // Flatten the result, within the context of Task - * val all: Task[Seq[Int]] = allBatches.map(_.flatten) + * @annotation.unused val all: Task[Seq[Int]] = allBatches.map(_.flatten) * }}} * * Note that the built `Task` reference is just a specification at @@ -215,7 +215,7 @@ import scala.util.{Failure, Success, Try} * import scala.concurrent.duration._ * import scala.util._ * - * val delayedHello = Task.cancelable0[Unit] { (scheduler, callback) => + * @annotation.unused val delayedHello = Task.cancelable0[Unit] { (scheduler, callback) => * val task = scheduler.scheduleOnce(1.second) { * println("Delayed Hello!") * // Signaling successful completion @@ -509,20 +509,20 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * import scala.concurrent.Await * * // ANTI-PATTERN 1: Unnecessary side effects - * def increment1(sample: Task[Int]): CancelableFuture[Int] = { + * @annotation.unused def increment1(sample: Task[Int]): CancelableFuture[Int] = { * // No reason to trigger `runAsync` for this operation * sample.runToFuture.map(_ + 1) * } * * // ANTI-PATTERN 2: blocking threads makes it worse than (1) - * def increment2(sample: Task[Int]): Int = { + * @annotation.unused def increment2(sample: Task[Int]): Int = { * // Blocking threads is totally unnecessary * val x = Await.result(sample.runToFuture, 5.seconds) * x + 1 * } * * // ANTI-PATTERN 3: this is even WORSE than (2)! - * def increment3(sample: Task[Int]): Task[Int] = { + * @annotation.unused def increment3(sample: Task[Int]): Task[Int] = { * // Triggering side-effects, but misleading users/readers * // into thinking this function is pure via the return type * Task.fromFuture(sample.runToFuture.map(_ + 1)) @@ -725,7 +725,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * {{{ * import scala.concurrent.duration._ * - * val task = Task("Hello!").bracketCase { str => + * @annotation.unused val task = Task("Hello!").bracketCase { str => * Task(println(str)) * } { (_, exitCode) => * // Finalization @@ -1118,10 +1118,10 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * // Option 1: trigger error on cancellation * val err = new CancellationException - * val cached1 = source.onCancelRaiseError(err).memoize + * @annotation.unused val cached1 = source.onCancelRaiseError(err).memoize * * // Option 2: make it uninterruptible - * val cached2 = source.uncancelable.memoize + * @annotation.unused val cached2 = source.uncancelable.memoize * }}} * * When using [[onCancelRaiseError]] like in the example above, the @@ -1157,10 +1157,10 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * // Option 1: trigger error on cancellation * val err = new CancellationException - * val cached1 = source.onCancelRaiseError(err).memoizeOnSuccess + * @annotation.unused val cached1 = source.onCancelRaiseError(err).memoizeOnSuccess * * // Option 2: make it uninterruptible - * val cached2 = source.uncancelable.memoizeOnSuccess + * @annotation.unused val cached2 = source.uncancelable.memoizeOnSuccess * }}} * * When using [[onCancelRaiseError]] like in the example above, the @@ -1189,7 +1189,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * Example: * {{{ - * val combined = Task{println("first"); "first"} >> Task{println("second"); "second"} + * @annotation.unused val combined = Task{println("first"); "first"} >> Task{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "second" * }}} @@ -1202,7 +1202,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * Example: * {{{ - * val combined = Task{println("first"); "first"} *> Task{println("second"); "second"} + * @annotation.unused val combined = Task{println("first"); "first"} *> Task{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "second" * }}} @@ -1218,7 +1218,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * Example: * {{{ - * val combined = Task{println("first"); "first"} <* Task{println("second"); "second"} + * @annotation.unused val combined = Task{println("first"); "first"} <* Task{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "first" * }}} @@ -1240,7 +1240,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * import monix.execution.ExecutionModel.SynchronousExecution * import monix.execution.Scheduler * - * val s = Scheduler.singleThread("example-scheduler").withExecutionModel(SynchronousExecution) + * @annotation.unused val s = Scheduler.singleThread("example-scheduler").withExecutionModel(SynchronousExecution) * * val source1 = Task(println("task 1")).loopForever * val source2 = Task(println("task 2")).loopForever @@ -1290,7 +1290,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * implicit val s = Scheduler.global * val io = Scheduler.io() * - * val source = Task(1) // s + * @annotation.unused val source = Task(1) // s * .asyncBoundary(io) * .flatMap(_ => Task(2)) // io * .flatMap(_ => Task(3)) // io @@ -1328,7 +1328,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * {{{ * import java.io._ * - * def readFile(file: File): Task[String] = { + * @annotation.unused def readFile(file: File): Task[String] = { * // Opening a file handle for reading text * val acquire = Task.eval(new BufferedReader( * new InputStreamReader(new FileInputStream(file), "utf-8") @@ -1692,7 +1692,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * // Overriding the default `ec`! * sayHello(io11) * - * def sayHello3(ec: ExecutionContext): Unit = + * @annotation.unused def sayHello3(ec: ExecutionContext): Unit = * // Overriding the default no longer has the desired effect * // because sayHello2 is ignoring it! * sayHello2(io22) @@ -1807,7 +1807,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * import scala.util.Random * * val random = Task(Random.nextInt()) - * val loop = random.flatMapLoop(Vector.empty[Int]) { (a, list, continue) => + * @annotation.unused val loop = random.flatMapLoop(Vector.empty[Int]) { (a, list, continue) => * val newList = list :+ a * if (newList.length < 5) * continue(newList) @@ -2181,7 +2181,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * cancellation): * * {{{ - * def par2[A, B](ta: Task[A], tb: Task[B]): Task[(A, B)] = + * @annotation.unused def par2[A, B](ta: Task[A], tb: Task[B]): Task[(A, B)] = * for { * fa <- ta.start * fb <- tb.start @@ -2375,7 +2375,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * // expensive remote call * def call(): Unit = () * - * val remoteCall = Task(call()) + * @annotation.unused val remoteCall = Task(call()) * .timeoutL(actualTimeout) * .onErrorRestart(100) * .timeout(deadline.time) @@ -2409,7 +2409,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * // expensive remote call * def call(): Unit = () * - * val remoteCall = Task(call()) + * @annotation.unused val remoteCall = Task(call()) * .timeoutToL(actualTimeout, Task.unit) * .onErrorRestart(100) * .timeout(deadline.time) @@ -2669,7 +2669,7 @@ object Task extends TaskInstancesLevel1 { * {{{ * import scala.concurrent.duration.MILLISECONDS * - * def measureLatency[A](source: Task[A]): Task[(A, Long)] = + * @annotation.unused def measureLatency[A](source: Task[A]): Task[(A, Long)] = * Task.deferAction { implicit s => * // We have our Scheduler, which can inject time, we * // can use it for side-effectful operations @@ -2711,7 +2711,7 @@ object Task extends TaskInstancesLevel1 { * {{{ * import scala.concurrent.{ExecutionContext, Future} * - * def sumFuture(list: Seq[Int])(implicit ec: ExecutionContext): Future[Int] = + * @annotation.unused def sumFuture(list: Seq[Int])(implicit ec: ExecutionContext): Future[Int] = * Future(list.sum) * }}} * @@ -2721,7 +2721,7 @@ object Task extends TaskInstancesLevel1 { * function an `ExecutionContext` is needed: * * {{{ - * def sumTask(list: Seq[Int])(implicit ec: ExecutionContext): Task[Int] = + * @annotation.unused def sumTask(list: Seq[Int])(implicit ec: ExecutionContext): Task[Int] = * Task.deferFuture(sumFuture(list)) * }}} * @@ -2733,7 +2733,7 @@ object Task extends TaskInstancesLevel1 { * `Scheduler` in the passed callback: * * {{{ - * def sumTask2(list: Seq[Int]): Task[Int] = + * @annotation.unused def sumTask2(list: Seq[Int]): Task[Int] = * Task.deferFutureAction { implicit scheduler => * sumFuture(list) * } @@ -2846,7 +2846,7 @@ object Task extends TaskInstancesLevel1 { * val io = IO.sleep(5.seconds) *> IO(println("Hello!")) * * // Resulting task is cancelable - * val task: Task[Unit] = Task.fromEffect(io) + * @annotation.unused val task: Task[Unit] = Task.fromEffect(io) * }}} * * Cancellation / finalization behavior is carried over, so the @@ -2879,7 +2879,7 @@ object Task extends TaskInstancesLevel1 { * * val io = IO(println("Hello!")) * - * val task: Task[Unit] = Task.fromEffect(io) + * @annotation.unused val task: Task[Unit] = Task.fromEffect(io) * }}} * * WARNING: the resulting task might not carry the source's @@ -2986,7 +2986,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.{Future, ExecutionContext} * import scala.util._ * - * def deferFuture[A](f: => Future[A])(implicit ec: ExecutionContext): Task[A] = + * @annotation.unused def deferFuture[A](f: => Future[A])(implicit ec: ExecutionContext): Task[A] = * Task.async { cb => * // N.B. we could do `f.onComplete(cb)` directly ;-) * f.onComplete { @@ -3047,7 +3047,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.Future * import scala.util._ * - * def deferFuture[A](f: => Future[A]): Task[A] = + * @annotation.unused def deferFuture[A](f: => Future[A]): Task[A] = * Task.async0 { (scheduler, cb) => * // We are being given an ExecutionContext ;-) * implicit val ec = scheduler @@ -3149,7 +3149,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.duration._ * import scala.util.control.NonFatal * - * def delayed[A](sc: ScheduledExecutorService, timespan: FiniteDuration) + * @annotation.unused def delayed[A](sc: ScheduledExecutorService, timespan: FiniteDuration) * (thunk: => A) * (implicit ec: ExecutionContext): Task[A] = { * @@ -3231,7 +3231,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.duration._ * import scala.util.control.NonFatal * - * def delayed1[A](sc: ScheduledExecutorService, timespan: FiniteDuration) + * @annotation.unused def delayed1[A](sc: ScheduledExecutorService, timespan: FiniteDuration) * (thunk: => A): Task[A] = { * * Task.cancelable0 { (scheduler, cb) => @@ -3265,7 +3265,7 @@ object Task extends TaskInstancesLevel1 { * Java's standard library: * * {{{ - * def delayed2[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * @annotation.unused def delayed2[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.cancelable0 { (scheduler, cb) => * // N.B. this already returns the Cancelable that we need! * val cancelable = scheduler.scheduleOnce(timespan) { @@ -3363,7 +3363,7 @@ object Task extends TaskInstancesLevel1 { * {{{ * import scala.concurrent.Future * - * def deferFuture[A](f: => Future[A]): Task[A] = + * @annotation.unused def deferFuture[A](f: => Future[A]): Task[A] = * Task.create { (scheduler, cb) => * f.onComplete(cb(_))(scheduler) * } @@ -3377,7 +3377,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.duration.FiniteDuration * import scala.util.Try * - * def delayResult1[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * @annotation.unused def delayResult1[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.create { (scheduler, cb) => * val c = scheduler.scheduleOnce(timespan)(cb(Try(thunk))) * // We can simply return `c`, but doing this for didactic purposes! @@ -3391,7 +3391,7 @@ object Task extends TaskInstancesLevel1 { * {{{ * import cats.effect.IO * - * def delayResult2[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * @annotation.unused def delayResult2[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.create { (scheduler, cb) => * val c = scheduler.scheduleOnce(timespan)(cb(Try(thunk))) * // We can simply return `c`, but doing this for didactic purposes! @@ -3406,7 +3406,7 @@ object Task extends TaskInstancesLevel1 { * `Task.cancelable(f) <-> Task.create(f)` * * {{{ - * def delayResult3[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * @annotation.unused def delayResult3[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.create { (scheduler, cb) => * val c = scheduler.scheduleOnce(timespan)(cb(Try(thunk))) * // We can simply return `c`, but doing this for didactic purposes! @@ -3418,7 +3418,7 @@ object Task extends TaskInstancesLevel1 { * describes a cancelation action: * * {{{ - * def delayResult4[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * @annotation.unused def delayResult4[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.create { (scheduler, cb) => * val c = scheduler.scheduleOnce(timespan)(cb(Try(thunk))) * // We can simply return `c`, but doing this for didactic purposes! @@ -3505,7 +3505,7 @@ object Task extends TaskInstancesLevel1 { * val list: List[Task[Int]] = * List(1, 2, 3).map(i => Task.sleep(i.seconds).map(_ => i)) * - * val winner: Task[Int] = Task.raceMany(list) + * @annotation.unused val winner: Task[Int] = Task.raceMany(list) * }}} * * $parallelismNote @@ -4329,7 +4329,7 @@ object Task extends TaskInstancesLevel1 { * }) * * // Lifting to a Resource of Task - * val res: Resource[Task, InputStream] = + * @annotation.unused val res: Resource[Task, InputStream] = * open(new File("sample")).mapK(Task.liftFrom[IO]) * }}} */ diff --git a/monix-eval/shared/src/main/scala/monix/eval/TaskLike.scala b/monix-eval/shared/src/main/scala/monix/eval/TaskLike.scala index 79c19669f..dfddecc1b 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/TaskLike.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/TaskLike.scala @@ -34,19 +34,19 @@ import scala.util.Try * import cats.Eval * * val source0 = Eval.always(1 + 1) - * val task0 = TaskLike[Eval].apply(source0) + * @annotation.unused val task0 = TaskLike[Eval].apply(source0) * * // Conversion from Future * import scala.concurrent.Future * * val source1 = Future.successful(1 + 1) - * val task1 = TaskLike[Future].apply(source1) + * @annotation.unused val task1 = TaskLike[Future].apply(source1) * * // Conversion from IO * import cats.effect.IO * * val source2 = IO(1 + 1) - * val task2 = TaskLike[IO].apply(source2) + * @annotation.unused val task2 = TaskLike[IO].apply(source2) * }}} * * This is an alternative to usage of `cats.effect.Effect` diff --git a/monix-eval/shared/src/main/scala/monix/eval/TaskLocal.scala b/monix-eval/shared/src/main/scala/monix/eval/TaskLocal.scala index 5ce4c8a96..3a535f84f 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/TaskLocal.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/TaskLocal.scala @@ -60,7 +60,7 @@ import monix.execution.misc.Local * * val t = Task(42) * // Options passed implicitly - * val f = t.runToFutureOpt + * @annotation.unused val f = t.runToFutureOpt * } * }}} * @@ -96,7 +96,7 @@ import monix.execution.misc.Local * * // Triggering actual execution, * // runToFutureOpt is not needed if `TracingScheduler` is used - * val result = task.runToFuture + * @annotation.unused val result = task.runToFuture * }}} */ final class TaskLocal[A] private (ref: Local[A]) { @@ -129,7 +129,7 @@ final class TaskLocal[A] private (ref: Local[A]) { * {{{ * // Should yield 200 on execution, regardless of what value * // we have in `local` at the time of evaluation - * val task: Task[Int] = + * @annotation.unused val task: Task[Int] = * for { * local <- TaskLocal(0) * value <- local.bind(100)(local.read.map(_ * 2)) @@ -156,7 +156,7 @@ final class TaskLocal[A] private (ref: Local[A]) { * {{{ * // Should yield 200 on execution, regardless of what value * // we have in `local` at the time of evaluation - * val task: Task[Int] = + * @annotation.unused val task: Task[Int] = * for { * local <- TaskLocal(0) * value <- local.bindL(Task.eval(100))(local.read.map(_ * 2)) @@ -188,7 +188,7 @@ final class TaskLocal[A] private (ref: Local[A]) { * {{{ * // Should yield 0 on execution, regardless of what value * // we have in `local` at the time of evaluation - * val task: Task[Int] = + * @annotation.unused val task: Task[Int] = * for { * local <- TaskLocal(0) * value <- local.bindClear(local.read.map(_ * 2)) diff --git a/monix-eval/shared/src/main/scala/monix/eval/internal/CoevalDeprecated.scala b/monix-eval/shared/src/main/scala/monix/eval/internal/CoevalDeprecated.scala index e49301976..cee1f129d 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/internal/CoevalDeprecated.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/internal/CoevalDeprecated.scala @@ -37,7 +37,7 @@ private[eval] trait CoevalDeprecatedExtensions[+A] extends Any { * * val value = Coeval { 1 + 1 } * - * val result: IO[Int] = value.to[IO] + * @annotation.unused val result: IO[Int] = value.to[IO] * }}} */ @deprecated("Use value.to[IO]", "3.0.0") @@ -57,7 +57,7 @@ private[eval] trait CoevalDeprecatedExtensions[+A] extends Any { * * val value = Coeval { 1 + 1 } * - * val result: Eval[Int] = value.to[Eval] + * @annotation.unused val result: Eval[Int] = value.to[Eval] * }}} */ @deprecated("Use value.to[Eval]", "3.0.0") @@ -76,7 +76,7 @@ private[eval] trait CoevalDeprecatedExtensions[+A] extends Any { * * val value = Coeval { 1 + 1 } * - * val result: Task[Int] = value.to[Task] + * @annotation.unused val result: Task[Int] = value.to[Task] * }}} */ @deprecated("Use value.to[Task]", "3.0.0") From 4aeadd5e51d7441c9ca88c1412571aaf14ab7711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 15:20:32 +0200 Subject: [PATCH 08/15] refactor: add `@unused` annotation to unused variables and enforce explicit `Unit` type annotations in Task, Coeval, and Semaphore docs --- .../shared/src/main/scala/monix/catnap/Semaphore.scala | 2 +- monix-eval/shared/src/main/scala/monix/eval/Coeval.scala | 2 +- monix-eval/shared/src/main/scala/monix/eval/Task.scala | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala b/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala index b8e4cfc89..4959d50d9 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala @@ -43,7 +43,7 @@ import scala.concurrent.Promise * * // Dummies for didactic purposes * case class HttpRequest() - * @annotation.unused case class HttpResponse() + * type HttpResponse = Unit * def makeRequest(r: HttpRequest): IO[HttpResponse] = IO(???) * * for { diff --git a/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala b/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala index 4a812c6d4..2f1f0502b 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala @@ -599,7 +599,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * {{{ * import scala.util.Random * - * def randomEven: Coeval[Int] = + * @annotation.unused def randomEven: Coeval[Int] = * Coeval(Random.nextInt()).flatMap { x => * if (x < 0 || x % 2 == 1) * randomEven // retry diff --git a/monix-eval/shared/src/main/scala/monix/eval/Task.scala b/monix-eval/shared/src/main/scala/monix/eval/Task.scala index c89361741..369d0fcd5 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/Task.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/Task.scala @@ -111,7 +111,7 @@ import scala.util.{Failure, Success, Try} * {{{ * import scala.concurrent.duration._ * - * def retryOnFailure[A](times: Int, source: Task[A]): Task[A] = + * @annotation.unused def retryOnFailure[A](times: Int, source: Task[A]): Task[A] = * source.onErrorHandleWith { err => * // No more retries left? Re-throw error: * if (times <= 0) Task.raiseError(err) else { @@ -1287,7 +1287,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * {{{ * import monix.execution.Scheduler * - * implicit val s = Scheduler.global + * @annotation.unused implicit val s = Scheduler.global * val io = Scheduler.io() * * @annotation.unused val source = Task(1) // s @@ -3324,7 +3324,7 @@ object Task extends TaskInstancesLevel1 { * * import cats.syntax.all._ * - * def fib(n: Int, a: Long, b: Long): Task[Long] = + * @annotation.unused def fib(n: Int, a: Long, b: Long): Task[Long] = * Task.suspend { * if (n <= 0) Task.pure(a) else { * val next = fib(n - 1, b, a + b) From b5b960be63eee7c8188fe2f0cfa29ef713772163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 16:01:13 +0200 Subject: [PATCH 09/15] refactor: add `@unused` annotations to unused variables in Observable, Iterant, and BatchCursor docs Co-Authored-By: Claude Opus 4.6 (1M context) --- .../scala/monix/reactive/Observable.scala | 78 +++++++++---------- .../scala/monix/reactive/ObservableLike.scala | 6 +- .../src/main/scala/monix/tail/Iterant.scala | 24 +++--- .../monix/tail/batches/BatchCursor.scala | 2 +- 4 files changed, 55 insertions(+), 55 deletions(-) diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala index f5c3c92fc..3c6fafa72 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala @@ -212,7 +212,7 @@ import scala.util.{Failure, Success, Try} * {{{ * import cats.Order * - * case class Person(name: String, age: Int) + * class Person(val name: String, val age: Int) * * // Starting from a Scala Ordering * implicit val scalaOrderingForPerson: Ordering[Person] = @@ -233,7 +233,7 @@ import scala.util.{Failure, Success, Try} * (due to Cats also exposing laws and tests for free) and build a * Scala `Ordering` when needed: * {{{ - * val scalaOrdering = catsOrderForPerson.toOrdering + * @annotation.unused val scalaOrdering = catsOrderForPerson.toOrdering * }}} * * @define catsEqInterop ==Cats Eq and Scala Interop== @@ -258,9 +258,9 @@ import scala.util.{Failure, Success, Try} * {{{ * import cats.Eq * - * case class Address(host: String, port: Int) + * type Address = (String, Int) * - * implicit val eqForAddress: Eq[Address] = + * @annotation.unused implicit val eqForAddress: Eq[Address] = * Eq.fromUniversalEquals * }}} */ @@ -1038,7 +1038,7 @@ abstract class Observable[+A] extends Serializable { self => * {{{ * import scala.concurrent.duration._ * - * def debounce[A](stream: Observable[A], d: FiniteDuration): Observable[A] = + * @annotation.unused def debounce[A](stream: Observable[A], d: FiniteDuration): Observable[A] = * stream.switchMap { x => * Observable.now(x).delayExecution(d) * } @@ -1163,7 +1163,7 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 1, 2, 1, 3, 2, 4 - * val stream = Observable(1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 2, 2, 4, 4, 4) + * @annotation.unused val stream = Observable(1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 2, 2, 4, 4, 4) * .distinctUntilChanged * }}} * @@ -1190,7 +1190,7 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 1, 2, 3, 4 - * val stream = Observable(1, 3, 2, 4, 2, 3, 5, 7, 4) + * @annotation.unused val stream = Observable(1, 3, 2, 4, 2, 3, 5, 7, 4) * .distinctUntilChangedByKey(_ % 2) * }}} * @@ -1222,7 +1222,7 @@ abstract class Observable[+A] extends Serializable { self => * {{{ * import monix.eval.Task * - * val stream = Observable.range(0, Int.MaxValue) + * @annotation.unused val stream = Observable.range(0, Int.MaxValue) * .doOnEarlyStop(Task(println("Stopped early!"))) * .take(100) * }}} @@ -1249,7 +1249,7 @@ abstract class Observable[+A] extends Serializable { self => * {{{ * import cats.effect.IO * - * val stream = Observable.range(0, Int.MaxValue) + * @annotation.unused val stream = Observable.range(0, Int.MaxValue) * .doOnEarlyStopF(IO(println("Stopped early!"))) * .take(100) * }}} @@ -1955,7 +1955,7 @@ abstract class Observable[+A] extends Serializable { self => * Observable(2, 3) * ) * - * val concatenated = + * @annotation.unused val concatenated = * stream.concatDelayErrors * }}} * @@ -2109,7 +2109,7 @@ abstract class Observable[+A] extends Serializable { self => * import cats.effect.ExitCase * import monix.eval.Task * - * val stream = Observable.suspend(???).guaranteeCase(err => Task { + * @annotation.unused val stream = Observable.suspend(???).guaranteeCase(err => Task { * err match { * case ExitCase.Completed => * println("Completed successfully!") @@ -2520,7 +2520,7 @@ abstract class Observable[+A] extends Serializable { self => * {{{ * import monix.execution.ExecutionModel.AlwaysAsyncExecution * - * val stream = Observable(1, 2, 3) + * @annotation.unused val stream = Observable(1, 2, 3) * .executeWithModel(AlwaysAsyncExecution) * }}} * @@ -2993,7 +2993,7 @@ abstract class Observable[+A] extends Serializable { self => * case class Current[A](current: Option[A], count: Int) * extends State[A] * - * case class Person(id: Int, name: String) + * type Person = (Int, String) * * // TODO: to implement! * def requestPersonDetails(id: Int): IO[Option[Person]] = @@ -3017,7 +3017,7 @@ abstract class Observable[+A] extends Serializable { self => * } * } * - * val filtered = scanned + * @annotation.unused val filtered = scanned * .takeWhile(_.count < 10) * .collect { case Current(a, _) => a } * }}} @@ -3074,7 +3074,7 @@ abstract class Observable[+A] extends Serializable { self => * case class Current[A](current: Option[A], count: Int) * extends State[A] * - * case class Person(id: Int, name: String) + * type Person = (Int, String) * * // TODO: to implement! * def requestPersonDetails(id: Int): Task[Option[Person]] = @@ -3098,7 +3098,7 @@ abstract class Observable[+A] extends Serializable { self => * } * } * - * val filtered = scanned + * @annotation.unused val filtered = scanned * .takeWhile(_.count < 10) * .collect { case Current(a, _) => a } * }}} @@ -3145,7 +3145,7 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 2, 6, 12, 20, 30, 42 - * val stream = Observable(1, 2, 3, 4, 5, 6).scanMap(x => x * 2) + * @annotation.unused val stream = Observable(1, 2, 3, 4, 5, 6).scanMap(x => x * 2) * }}} * * @param f is the mapping function applied to every incoming element of this `Observable` @@ -4054,10 +4054,10 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 10 - * val stream1 = Observable(1, 2, 3, 4).fold + * @annotation.unused val stream1 = Observable(1, 2, 3, 4).fold * * // Yields "1234" - * val stream2 = Observable("1", "2", "3", "4").fold + * @annotation.unused val stream2 = Observable("1", "2", "3", "4").fold * }}} * * Note, in case you don't have a `Monoid` instance in scope, @@ -4092,10 +4092,10 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 10 - * val stream1 = Observable(1, 2, 3, 4).foldL + * @annotation.unused val stream1 = Observable(1, 2, 3, 4).foldL * * // Yields "1234" - * val stream2 = Observable("1", "2", "3", "4").foldL + * @annotation.unused val stream2 = Observable("1", "2", "3", "4").foldL * }}} * * @see [[fold]] for the version that returns an observable @@ -4121,20 +4121,20 @@ abstract class Observable[+A] extends Serializable { self => * * Example: {{{ * // Sums first 10 items - * val stream1 = Observable.range(0, 1000).foldWhileLeft((0L, 0)) { + * @annotation.unused val stream1 = Observable.range(0, 1000).foldWhileLeft((0L, 0)) { * case ((sum, count), e) => * val next = (sum + e, count + 1) * if (count + 1 < 10) Left(next) else Right(next) * } * * // Implements exists(predicate) - * val stream2 = Observable(1, 2, 3, 4, 5).foldWhileLeft(false) { + * @annotation.unused val stream2 = Observable(1, 2, 3, 4, 5).foldWhileLeft(false) { * (default, e) => * if (e == 3) Right(true) else Left(default) * } * * // Implements forall(predicate) - * val stream3 = Observable(1, 2, 3, 4, 5).foldWhileLeft(true) { + * @annotation.unused val stream3 = Observable(1, 2, 3, 4, 5).foldWhileLeft(true) { * (default, e) => * if (e != 3) Right(false) else Left(default) * } @@ -4170,20 +4170,20 @@ abstract class Observable[+A] extends Serializable { self => * * Example: {{{ * // Sums first 10 items - * val stream1 = Observable.range(0, 1000).foldWhileLeftL((0L, 0)) { + * @annotation.unused val stream1 = Observable.range(0, 1000).foldWhileLeftL((0L, 0)) { * case ((sum, count), e) => * val next = (sum + e, count + 1) * if (count + 1 < 10) Left(next) else Right(next) * } * * // Implements exists(predicate) - * val stream2 = Observable(1, 2, 3, 4, 5).foldWhileLeftL(false) { + * @annotation.unused val stream2 = Observable(1, 2, 3, 4, 5).foldWhileLeftL(false) { * (default, e) => * if (e == 3) Right(true) else Left(default) * } * * // Implements forall(predicate) - * val stream3 = Observable(1, 2, 3, 4, 5).foldWhileLeftL(true) { + * @annotation.unused val stream3 = Observable(1, 2, 3, 4, 5).foldWhileLeftL(true) { * (default, e) => * if (e != 3) Right(false) else Left(default) * } @@ -4452,10 +4452,10 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields Some(20) - * val stream1 = Observable(10, 7, 6, 8, 20, 3, 5).maxL + * @annotation.unused val stream1 = Observable(10, 7, 6, 8, 20, 3, 5).maxL * * // Yields Observable.empty - * val stream2 = Observable.empty[Int].maxL + * @annotation.unused val stream2 = Observable.empty[Int].maxL * }}} * * $catsOrderInterop @@ -4482,10 +4482,10 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields Observable(20) - * val stream1 = Observable(10, 7, 6, 8, 20, 3, 5).max + * @annotation.unused val stream1 = Observable(10, 7, 6, 8, 20, 3, 5).max * * // Yields Observable.empty - * val stream2 = Observable.empty[Int].max + * @annotation.unused val stream2 = Observable.empty[Int].max * }}} * * $catsOrderInterop @@ -4593,11 +4593,11 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields Some(3) - * val stream1 = + * @annotation.unused val stream1 = * Observable(10, 7, 6, 8, 20, 3, 5).minL * * // Yields None - * val stream2 = + * @annotation.unused val stream2 = * Observable.empty[Int].minL * }}} * @@ -4625,11 +4625,11 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields Observable(3) - * val stream1 = + * @annotation.unused val stream1 = * Observable(10, 7, 6, 8, 20, 3, 5).min * * // Yields Observable.empty - * val stream2 = + * @annotation.unused val stream2 = * Observable.empty[Int].min * }}} * @@ -4691,7 +4691,7 @@ abstract class Observable[+A] extends Serializable { self => * case class Person(name: String, age: Int) * * // Yields Observable(Person("Alice", 27)) - * val stream = Observable(Person("Alex", 34), Person("Alice", 27)) + * @annotation.unused val stream = Observable(Person("Alex", 34), Person("Alice", 27)) * .minBy(_.age) * }}} * @@ -4893,7 +4893,7 @@ object Observable extends ObservableDeprecatedBuilders { * {{{ * // Don't do this kind of recursion, because `flatMap` can throw * // stack overflow errors: - * def tailRecM[A, B](a: A)(f: (A) => Observable[Either[A, B]]): Observable[B] = + * @annotation.unused def tailRecM[A, B](a: A)(f: (A) => Observable[Either[A, B]]): Observable[B] = * f(a).flatMap { * case Right(b) => Observable.pure(b) * case Left(nextA) => tailRecM(nextA)(f) @@ -5141,7 +5141,7 @@ object Observable extends ObservableDeprecatedBuilders { * This example would be equivalent with usage of [[Observable.resource]]: * * {{{ - * def openFileAsResource2(file: File): Observable[FileInputStream] = { + * @annotation.unused def openFileAsResource2(file: File): Observable[FileInputStream] = { * Observable.resource(Task(new FileInputStream(file)))(h => Task(h.close())) * } * }}} @@ -5149,7 +5149,7 @@ object Observable extends ObservableDeprecatedBuilders { * This means that `flatMap` is safe to use: * * {{{ - * def readBytes(file: File): Observable[Array[Byte]] = + * @annotation.unused def readBytes(file: File): Observable[Array[Byte]] = * openFileAsStream(file).flatMap { in => * Observable.fromInputStreamUnsafe(in) * } diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/ObservableLike.scala b/monix-reactive/shared/src/main/scala/monix/reactive/ObservableLike.scala index 65d84bb0a..d4afc6167 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/ObservableLike.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/ObservableLike.scala @@ -35,19 +35,19 @@ import scala.util.Try * import cats.Eval * * val source0 = Eval.always(1 + 1) - * val task0 = ObservableLike[Eval].apply(source0) + * @annotation.unused val task0 = ObservableLike[Eval].apply(source0) * * // Conversion from Future * import scala.concurrent.Future * * val source1 = Future.successful(1 + 1) - * val task1 = ObservableLike[Future].apply(source1) + * @annotation.unused val task1 = ObservableLike[Future].apply(source1) * * // Conversion from IO * import cats.effect.IO * * val source2 = IO(1 + 1) - * val task2 = ObservableLike[IO].apply(source2) + * @annotation.unused val task2 = ObservableLike[IO].apply(source2) * }}} * * See [[Observable.from]] diff --git a/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala b/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala index 8f11f7c2f..57de24ca6 100644 --- a/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala +++ b/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala @@ -165,7 +165,7 @@ import scala.concurrent.duration.{Duration, FiniteDuration} * {{{ * import cats.Order * - * case class Person(name: String, age: Int) + * class Person(val name: String, val age: Int) * * // Starting from a Scala Ordering * implicit val scalaOrderingForPerson: Ordering[Person] = @@ -186,7 +186,7 @@ import scala.concurrent.duration.{Duration, FiniteDuration} * (due to Cats also exposing laws and tests for free) and build a * Scala `Ordering` when needed: * {{{ - * val scalaOrdering = catsOrderForPerson.toOrdering + * @annotation.unused val scalaOrdering = catsOrderForPerson.toOrdering * }}} * * @define catsEqInterop ==Cats Eq and Scala Interop== @@ -211,9 +211,9 @@ import scala.concurrent.duration.{Duration, FiniteDuration} * {{{ * import cats.Eq * - * case class Address(host: String, port: Int) + * type Address = (String, Int) * - * implicit val eqForAddress: Eq[Address] = + * @annotation.unused implicit val eqForAddress: Eq[Address] = * Eq.fromUniversalEquals * }}} */ @@ -1158,7 +1158,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * import cats.implicits._ * import cats.effect.Sync * - * def exists[F[_], A](fa: Iterant[F, A], p: A => Boolean) + * @annotation.unused def exists[F[_], A](fa: Iterant[F, A], p: A => Boolean) * (implicit F: Sync[F]): F[Boolean] = { * * fa.foldRightL(F.pure(false)) { (a, next) => @@ -1166,7 +1166,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * } * } * - * def forall[F[_], A](fa: Iterant[F, A], p: A => Boolean) + * @annotation.unused def forall[F[_], A](fa: Iterant[F, A], p: A => Boolean) * (implicit F: Sync[F]): F[Boolean] = { * * fa.foldRightL(F.pure(true)) { (a, next) => @@ -1174,7 +1174,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * } * } * - * def concat[F[_], A](lh: Iterant[F, A], rh: Iterant[F, A]) + * @annotation.unused def concat[F[_], A](lh: Iterant[F, A], rh: Iterant[F, A]) * (implicit F: Sync[F]): Iterant[F, A] = { * * Iterant.suspend[F, A] { @@ -2022,7 +2022,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * extends State[A] * * // Dummies - * case class Person(id: Int, name: String, age: Int) + * type Person = (Int, String, Int) * def requestPersonDetails(id: Int): Task[Option[Person]] = Task.delay(???) * * // Whatever @@ -2150,7 +2150,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * {{{ * import cats._, cats.implicits._, cats.effect._ * - * def unconsFold[F[_]: Sync, A: Monoid](iterant: Iterant[F, A]): F[A] = { + * @annotation.unused def unconsFold[F[_]: Sync, A: Monoid](iterant: Iterant[F, A]): F[A] = { * def go(iterant: Iterant[F, A], acc: A): Iterant[F, A] = * iterant.uncons.flatMap { * case (None, _) => Iterant.pure(acc) @@ -2779,7 +2779,7 @@ object Iterant extends IterantInstances { * This example would be equivalent with usage of [[Iterant.resource]]: * * {{{ - * def openFileAsResource2(file: File): Iterant[IO, FileInputStream] = { + * @annotation.unused def openFileAsResource2(file: File): Iterant[IO, FileInputStream] = { * Iterant.resource(IO(new FileInputStream(file)))(h => IO(h.close())) * } * }}} @@ -2787,7 +2787,7 @@ object Iterant extends IterantInstances { * This means that `flatMap` is safe to use: * * {{{ - * def readLines(file: File): Iterant[IO, String] = + * @annotation.unused def readLines(file: File): Iterant[IO, String] = * openFileAsStream(file).flatMap { in => * val buf = new BufferedReader(new InputStreamReader(in, "utf-8")) * Iterant[IO].repeatEval(buf.readLine()) @@ -2896,7 +2896,7 @@ object Iterant extends IterantInstances { * import monix.eval.Coeval * import scala.util.Random * - * val randomInts = Iterant[Coeval].repeatEval(Random.nextInt()) + * @annotation.unused val randomInts = Iterant[Coeval].repeatEval(Random.nextInt()) * }}} * */ diff --git a/monix-tail/shared/src/main/scala/monix/tail/batches/BatchCursor.scala b/monix-tail/shared/src/main/scala/monix/tail/batches/BatchCursor.scala index 0bfb5d9f5..c0cc15ee8 100644 --- a/monix-tail/shared/src/main/scala/monix/tail/batches/BatchCursor.scala +++ b/monix-tail/shared/src/main/scala/monix/tail/batches/BatchCursor.scala @@ -38,7 +38,7 @@ import scala.reflect.ClassTag * * Sample: * {{{ - * def sum(cursor: BatchCursor[Int]): Long = { + * @annotation.unused def sum(cursor: BatchCursor[Int]): Long = { * var sum = 0L * * while (cursor.hasNext()) { From 8b66920c4b07f9df83bac6ec5134501ac6735e94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 16:13:24 +0200 Subject: [PATCH 10/15] fix: avoid `@` annotations inside `@define` Scaladoc macros Use `_` prefix instead of `@annotation.unused` for vals inside `@define` macros, as `@` terminates the macro prematurely and causes "unclosed code block" errors in Scala 2.13 Scaladoc. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../shared/src/main/scala/monix/reactive/Observable.scala | 4 ++-- monix-tail/shared/src/main/scala/monix/tail/Iterant.scala | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala index 3c6fafa72..9d922bd20 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala @@ -233,7 +233,7 @@ import scala.util.{Failure, Success, Try} * (due to Cats also exposing laws and tests for free) and build a * Scala `Ordering` when needed: * {{{ - * @annotation.unused val scalaOrdering = catsOrderForPerson.toOrdering + * val _scalaOrdering = catsOrderForPerson.toOrdering * }}} * * @define catsEqInterop ==Cats Eq and Scala Interop== @@ -260,7 +260,7 @@ import scala.util.{Failure, Success, Try} * * type Address = (String, Int) * - * @annotation.unused implicit val eqForAddress: Eq[Address] = + * implicit val _eqForAddress: Eq[Address] = * Eq.fromUniversalEquals * }}} */ diff --git a/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala b/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala index 57de24ca6..bbff14f9b 100644 --- a/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala +++ b/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala @@ -186,7 +186,7 @@ import scala.concurrent.duration.{Duration, FiniteDuration} * (due to Cats also exposing laws and tests for free) and build a * Scala `Ordering` when needed: * {{{ - * @annotation.unused val scalaOrdering = catsOrderForPerson.toOrdering + * val _scalaOrdering = catsOrderForPerson.toOrdering * }}} * * @define catsEqInterop ==Cats Eq and Scala Interop== @@ -213,7 +213,7 @@ import scala.concurrent.duration.{Duration, FiniteDuration} * * type Address = (String, Int) * - * @annotation.unused implicit val eqForAddress: Eq[Address] = + * implicit val _eqForAddress: Eq[Address] = * Eq.fromUniversalEquals * }}} */ From 0b32ecc1b826bba4642709e04f559725820ddb3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 17:52:24 +0200 Subject: [PATCH 11/15] refactor: suppress warnings in generated doctest files via -Wconf instead of annotations Revert all `@annotation.unused` additions to Scaladoc examples and instead add `-Wconf:src=.*src_managed.*:s` for Scala 3, mirroring the silencer plugin path filter already used for Scala 2. Also fix deprecated `Thread.getId` -> `Thread.threadId()` and add `: Unit` to discarded `buffer.append(line)` in Task doc example. Co-Authored-By: Claude Opus 4.6 (1M context) --- build.sbt | 2 +- .../scala/monix/catnap/CircuitBreaker.scala | 10 +- .../monix/catnap/ConcurrentChannel.scala | 6 +- .../scala/monix/catnap/ConcurrentQueue.scala | 4 +- .../main/scala/monix/catnap/ConsumerF.scala | 4 +- .../main/scala/monix/catnap/FutureLift.scala | 8 +- .../main/scala/monix/catnap/ProducerF.scala | 4 +- .../main/scala/monix/catnap/Semaphore.scala | 2 +- .../src/main/scala/monix/eval/Coeval.scala | 20 ++-- .../main/scala/monix/eval/CoevalLike.scala | 4 +- .../src/main/scala/monix/eval/Fiber.scala | 2 +- .../src/main/scala/monix/eval/Task.scala | 92 +++++++++---------- .../src/main/scala/monix/eval/TaskLike.scala | 6 +- .../src/main/scala/monix/eval/TaskLocal.scala | 10 +- .../eval/internal/CoevalDeprecated.scala | 6 +- .../monix/execution/internal/Platform.scala | 2 +- .../forkJoin/DynamicWorkerThreadFactory.scala | 2 +- .../StandardWorkerThreadFactory.scala | 2 +- .../schedulers/ThreadFactoryBuilder.scala | 2 +- .../scala/monix/reactive/Observable.scala | 78 ++++++++-------- .../scala/monix/reactive/ObservableLike.scala | 6 +- .../src/main/scala/monix/tail/Iterant.scala | 24 ++--- .../monix/tail/batches/BatchCursor.scala | 2 +- 23 files changed, 149 insertions(+), 149 deletions(-) diff --git a/build.sbt b/build.sbt index 19b5b7334..b47266496 100644 --- a/build.sbt +++ b/build.sbt @@ -198,7 +198,7 @@ lazy val sharedSettings = pgpSettings ++ Seq( // Silence everything in auto-generated files scalacOptions ++= { if (isDotty.value) - Seq.empty + Seq("-Wconf:src=.*src_managed.*:s") else Seq("-P:silencer:pathFilters=.*[/]src_managed[/].*") }, diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/CircuitBreaker.scala b/monix-catnap/shared/src/main/scala/monix/catnap/CircuitBreaker.scala index 02d6dea8b..e4135d17f 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/CircuitBreaker.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/CircuitBreaker.scala @@ -118,7 +118,7 @@ import scala.concurrent.duration._ * throw new RuntimeException("dummy") * } * - * @annotation.unused val task = circuitBreaker.protect(problematic) + * val task = circuitBreaker.protect(problematic) * }}} * * When attempting to close the circuit breaker and resume normal @@ -126,7 +126,7 @@ import scala.concurrent.duration._ * failed attempts, like so: * * {{{ - * @annotation.unused val exponential = CircuitBreaker[IO].of( + * val exponential = CircuitBreaker[IO].of( * maxFailures = 5, * resetTimeout = 10.seconds, * exponentialBackoffFactor = 2, @@ -159,7 +159,7 @@ import scala.concurrent.duration._ * import cats.effect._ * import monix.execution.exceptions.ExecutionRejectedException * - * @annotation.unused def protectWithRetry[F[_], A](task: F[A], cb: CircuitBreaker[F], delay: FiniteDuration) + * def protectWithRetry[F[_], A](task: F[A], cb: CircuitBreaker[F], delay: FiniteDuration) * (implicit F: Async[F], timer: Timer[F]): F[A] = { * * cb.protect(task).recoverWith { @@ -175,7 +175,7 @@ import scala.concurrent.duration._ * [[CircuitBreaker!.awaitClose awaitClose]] method: * * {{{ - * @annotation.unused def protectWithRetry2[F[_], A](task: F[A], cb: CircuitBreaker[F]) + * def protectWithRetry2[F[_], A](task: F[A], cb: CircuitBreaker[F]) * (implicit F: Async[F]): F[A] = { * * cb.protect(task).recoverWith { @@ -596,7 +596,7 @@ object CircuitBreaker extends CircuitBreakerDocs { * import cats.effect.{IO, Clock} * implicit val clock: Clock[IO] = Clock.create[IO] * - * @annotation.unused val cb = CircuitBreaker[IO].of( + * val cb = CircuitBreaker[IO].of( * maxFailures = 10, * resetTimeout = 3.second, * exponentialBackoffFactor = 2 diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala index f17700e22..13a82091c 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentChannel.scala @@ -53,7 +53,7 @@ import scala.collection.mutable.ArrayBuffer * // For being able to do IO.start * implicit val cs: ContextShift[IO] = SchedulerEffect.contextShift[IO](global)(IO.ioEffect) * // We need a `Timer` for this to work - * @annotation.unused implicit val timer: Timer[IO] = SchedulerEffect.timer[IO](global) + * implicit val timer: Timer[IO] = SchedulerEffect.timer[IO](global) * * // Completion event * sealed trait Complete @@ -269,7 +269,7 @@ final class ConcurrentChannel[F[_], E, A] private ( * sealed trait Complete * object Complete extends Complete * - * @annotation.unused def range[F[_]](from: Int, until: Int, increment: Int) + * def range[F[_]](from: Int, until: Int, increment: Int = 1) * (channel: ConcurrentChannel[F, Complete, Int]) * (implicit F: Sync[F]): F[Unit] = { * @@ -321,7 +321,7 @@ final class ConcurrentChannel[F[_], E, A] private ( * sealed trait Complete * object Complete extends Complete * - * @annotation.unused def range[F[_]](from: Int, until: Int, increment: Int) + * def range[F[_]](from: Int, until: Int, increment: Int = 1) * (channel: ConcurrentChannel[F, Complete, Int]) * (implicit F: Sync[F]): F[Unit] = { * diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentQueue.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentQueue.scala index 8700b3e53..2feb5054e 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentQueue.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ConcurrentQueue.scala @@ -46,7 +46,7 @@ import scala.collection.mutable.ArrayBuffer * // For being able to do IO.start * implicit val cs: ContextShift[IO] = SchedulerEffect.contextShift[IO](global)(IO.ioEffect) * // We need a `Timer` for this to work - * @annotation.unused implicit val timer: Timer[IO] = SchedulerEffect.timer[IO](global) + * implicit val timer: Timer[IO] = SchedulerEffect.timer[IO](global) * * def consumer(queue: ConcurrentQueue[IO, Int], index: Int): IO[Unit] = * queue.poll.flatMap { a => @@ -108,7 +108,7 @@ import scala.collection.mutable.ArrayBuffer * import monix.execution.ChannelType.MPSC * import monix.execution.BufferCapacity.Bounded * - * @annotation.unused val queue = ConcurrentQueue[IO].withConfig[Int]( + * val queue = ConcurrentQueue[IO].withConfig[Int]( * capacity = Bounded(128), * channelType = MPSC * ) diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala index 3c486dc48..b0e6021fe 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ConsumerF.scala @@ -38,7 +38,7 @@ trait ConsumerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * @annotation.unused def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long) + * def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long = 0) * (implicit F: Async[F]): F[Long] = { * * channel.pull.flatMap { @@ -62,7 +62,7 @@ trait ConsumerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * @annotation.unused def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long) + * def sum[F[_]](channel: ConsumerF[F, Int, Int], acc: Long = 0) * (implicit F: Async[F]): F[Long] = { * * channel.pullMany(1, 16).flatMap { diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/FutureLift.scala b/monix-catnap/shared/src/main/scala/monix/catnap/FutureLift.scala index 2027668be..8fdfa8357 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/FutureLift.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/FutureLift.scala @@ -37,7 +37,7 @@ import scala.concurrent.{Future => ScalaFuture} * // Can use any data type implementing Async or Concurrent * import cats.effect.IO * - * @annotation.unused val io = IO(Future(1 + 1)).futureLift + * val io = IO(Future(1 + 1)).futureLift * }}} * * `IO` provides its own `IO.fromFuture` of course, however @@ -57,7 +57,7 @@ import scala.concurrent.{Future => ScalaFuture} * } * * // The result will be cancelable: - * @annotation.unused val sum: IO[Int] = IO(delayed(1 + 1)).futureLift + * val sum: IO[Int] = IO(delayed(1 + 1)).futureLift * }}} */ trait FutureLift[F[_], Future[_]] extends (FutureLift.Lambda[F, Future, *] ~> F) { @@ -76,7 +76,7 @@ object FutureLift extends internal.FutureLiftForPlatform { * * val F = FutureLift[IO, Future] * - * @annotation.unused val task: IO[Int] = F.apply(IO(Future(1 + 1))) + * val task: IO[Int] = F.apply(IO(Future(1 + 1))) * }}} */ def apply[F[_], Future[_]](implicit F: FutureLift[F, Future]): FutureLift[F, Future] = F @@ -89,7 +89,7 @@ object FutureLift extends internal.FutureLiftForPlatform { * import scala.concurrent.Future * import scala.concurrent.ExecutionContext.Implicits.global * - * @annotation.unused val ioa = FutureLift.from(IO(Future(1 + 1))) + * val ioa = FutureLift.from(IO(Future(1 + 1))) * }}} */ def from[F[_], Future[_], A](fa: F[Future[A]])(implicit F: FutureLift[F, Future]): F[A] = diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/ProducerF.scala b/monix-catnap/shared/src/main/scala/monix/catnap/ProducerF.scala index 7e8c6e20d..c6a0cb759 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/ProducerF.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/ProducerF.scala @@ -59,7 +59,7 @@ trait ProducerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * @annotation.unused def range[F[_]](channel: ProducerF[F, Int, Int], from: Int, until: Int) + * def range[F[_]](channel: ProducerF[F, Int, Int], from: Int, until: Int) * (implicit F: Async[F]): F[Unit] = { * * if (from < until) { @@ -110,7 +110,7 @@ trait ProducerF[F[_], E, A] extends Serializable { * import cats.implicits._ * import cats.effect.Async * - * @annotation.unused def range[F[_]](channel: ProducerF[F, Int, Int], from: Int, until: Int) + * def range[F[_]](channel: ProducerF[F, Int, Int], from: Int, until: Int) * (implicit F: Async[F]): F[Unit] = { * * if (from < until) { diff --git a/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala b/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala index 4959d50d9..1ec2ac721 100644 --- a/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala +++ b/monix-catnap/shared/src/main/scala/monix/catnap/Semaphore.scala @@ -43,7 +43,7 @@ import scala.concurrent.Promise * * // Dummies for didactic purposes * case class HttpRequest() - * type HttpResponse = Unit + * case class HttpResponse() * def makeRequest(r: HttpRequest): IO[HttpResponse] = IO(???) * * for { diff --git a/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala b/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala index 2f1f0502b..123b919e1 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/Coeval.scala @@ -189,7 +189,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * * Example: * {{{ - * @annotation.unused val combined = Coeval{println("first"); "first"} >> Coeval{println("second"); "second"} + * val combined = Coeval{println("first"); "first"} >> Coeval{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "second" * }}} @@ -202,7 +202,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * * Example: * {{{ - * @annotation.unused val combined = Coeval{println("first"); "first"} *> Coeval{println("second"); "second"} + * val combined = Coeval{println("first"); "first"} *> Coeval{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "second" * }}} @@ -215,7 +215,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * * Example: * {{{ - * @annotation.unused val combined = Coeval{println("first"); "first"} <* Coeval{println("second"); "second"} + * val combined = Coeval{println("first"); "first"} <* Coeval{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "first" * }}} @@ -425,7 +425,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * {{{ * import java.io._ * - * @annotation.unused def readFile(file: File): Coeval[String] = { + * def readFile(file: File): Coeval[String] = { * // Opening a file handle for reading text * val acquire = Coeval.eval(new BufferedReader( * new InputStreamReader(new FileInputStream(file), "utf-8") @@ -599,7 +599,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * {{{ * import scala.util.Random * - * @annotation.unused def randomEven: Coeval[Int] = + * def randomEven: Coeval[Int] = * Coeval(Random.nextInt()).flatMap { x => * if (x < 0 || x % 2 == 1) * randomEven // retry @@ -628,7 +628,7 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * import scala.util.Random * * val random = Coeval(Random.nextInt()) - * @annotation.unused val loop = random.flatMapLoop(Vector.empty[Int]) { (a, list, continue) => + * val loop = random.flatMapLoop(Vector.empty[Int]) { (a, list, continue) => * val newList = list :+ a * if (newList.length < 5) * continue(newList) @@ -737,9 +737,9 @@ sealed abstract class Coeval[+A] extends (() => A) with Serializable { self => * * val source = Coeval { 1 + 1 } * - * @annotation.unused val asIO: IO[Int] = source.to[IO] - * @annotation.unused val asEval: Eval[Int] = source.to[Eval] - * @annotation.unused val asTask: Task[Int] = source.to[Task] + * val asIO: IO[Int] = source.to[IO] + * val asEval: Eval[Int] = source.to[Eval] + * val asTask: Task[Int] = source.to[Task] * }}} */ final def to[F[_]](implicit F: CoevalLift[F]): F[A @uV] = @@ -1465,7 +1465,7 @@ object Coeval extends CoevalInstancesLevel0 { * }) * * // Lifting to a Resource of Coeval - * @annotation.unused val res: Resource[Coeval, InputStream] = + * val res: Resource[Coeval, InputStream] = * open(new File("sample")).mapK(Coeval.liftFrom[SyncIO]) * }}} * diff --git a/monix-eval/shared/src/main/scala/monix/eval/CoevalLike.scala b/monix-eval/shared/src/main/scala/monix/eval/CoevalLike.scala index fceafc607..9a809592b 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/CoevalLike.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/CoevalLike.scala @@ -29,13 +29,13 @@ import scala.util.Try * import cats.Eval * * val source0 = Eval.always(1 + 1) - * @annotation.unused val task0 = CoevalLike[Eval].apply(source0) + * val task0 = CoevalLike[Eval].apply(source0) * * // Conversion from SyncIO * import cats.effect.SyncIO * * val source1 = SyncIO(1 + 1) - * @annotation.unused val task1 = CoevalLike[SyncIO].apply(source1) + * val task1 = CoevalLike[SyncIO].apply(source1) * }}} * * This is an alternative to usage of `cats.effect.Effect` diff --git a/monix-eval/shared/src/main/scala/monix/eval/Fiber.scala b/monix-eval/shared/src/main/scala/monix/eval/Fiber.scala index b12b1a801..f1d18ca07 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/Fiber.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/Fiber.scala @@ -30,7 +30,7 @@ import cats.effect.CancelToken * {{{ * val task = Task.evalAsync(println("Hello!")) * - * @annotation.unused val forked: Task[Fiber[Unit]] = task.start + * val forked: Task[Fiber[Unit]] = task.start * }}} * * Usage example: diff --git a/monix-eval/shared/src/main/scala/monix/eval/Task.scala b/monix-eval/shared/src/main/scala/monix/eval/Task.scala index 369d0fcd5..6bf25be0d 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/Task.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/Task.scala @@ -67,8 +67,8 @@ import scala.util.{Failure, Success, Try} * [[monix.eval.Task.evalAsync Task.evalAsync]]: * * {{{ - * @annotation.unused val hello = Task("Hello ") - * @annotation.unused val world = Task.evalAsync("World!") + * val hello = Task("Hello ") + * val world = Task.evalAsync("World!") * }}} * * Nothing gets executed yet, as `Task` is lazy, nothing executes @@ -80,7 +80,7 @@ import scala.util.{Failure, Success, Try} * it's in a very real sense because of the laziness involved: * * {{{ - * @annotation.unused val sayHello = hello + * val sayHello = hello * .flatMap(h => world.map(w => h + w)) * .map(println) * }}} @@ -92,7 +92,7 @@ import scala.util.{Failure, Success, Try} * import monix.execution.CancelableFuture * import monix.execution.Scheduler.Implicits.global * - * @annotation.unused val f: CancelableFuture[Unit] = sayHello.runToFuture + * val f: CancelableFuture[Unit] = sayHello.runToFuture * // => Hello World! * }}} * @@ -111,7 +111,7 @@ import scala.util.{Failure, Success, Try} * {{{ * import scala.concurrent.duration._ * - * @annotation.unused def retryOnFailure[A](times: Int, source: Task[A]): Task[A] = + * def retryOnFailure[A](times: Int, source: Task[A]): Task[A] = * source.onErrorHandleWith { err => * // No more retries left? Re-throw error: * if (times <= 0) Task.raiseError(err) else { @@ -191,7 +191,7 @@ import scala.util.{Failure, Success, Try} * val allBatches = Task.sequence(batchedTasks) * * // Flatten the result, within the context of Task - * @annotation.unused val all: Task[Seq[Int]] = allBatches.map(_.flatten) + * val all: Task[Seq[Int]] = allBatches.map(_.flatten) * }}} * * Note that the built `Task` reference is just a specification at @@ -215,7 +215,7 @@ import scala.util.{Failure, Success, Try} * import scala.concurrent.duration._ * import scala.util._ * - * @annotation.unused val delayedHello = Task.cancelable0[Unit] { (scheduler, callback) => + * val delayedHello = Task.cancelable0[Unit] { (scheduler, callback) => * val task = scheduler.scheduleOnce(1.second) { * println("Delayed Hello!") * // Signaling successful completion @@ -509,20 +509,20 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * import scala.concurrent.Await * * // ANTI-PATTERN 1: Unnecessary side effects - * @annotation.unused def increment1(sample: Task[Int]): CancelableFuture[Int] = { + * def increment1(sample: Task[Int]): CancelableFuture[Int] = { * // No reason to trigger `runAsync` for this operation * sample.runToFuture.map(_ + 1) * } * * // ANTI-PATTERN 2: blocking threads makes it worse than (1) - * @annotation.unused def increment2(sample: Task[Int]): Int = { + * def increment2(sample: Task[Int]): Int = { * // Blocking threads is totally unnecessary * val x = Await.result(sample.runToFuture, 5.seconds) * x + 1 * } * * // ANTI-PATTERN 3: this is even WORSE than (2)! - * @annotation.unused def increment3(sample: Task[Int]): Task[Int] = { + * def increment3(sample: Task[Int]): Task[Int] = { * // Triggering side-effects, but misleading users/readers * // into thinking this function is pure via the return type * Task.fromFuture(sample.runToFuture.map(_ + 1)) @@ -725,7 +725,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * {{{ * import scala.concurrent.duration._ * - * @annotation.unused val task = Task("Hello!").bracketCase { str => + * val task = Task("Hello!").bracketCase { str => * Task(println(str)) * } { (_, exitCode) => * // Finalization @@ -1118,10 +1118,10 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * // Option 1: trigger error on cancellation * val err = new CancellationException - * @annotation.unused val cached1 = source.onCancelRaiseError(err).memoize + * val cached1 = source.onCancelRaiseError(err).memoize * * // Option 2: make it uninterruptible - * @annotation.unused val cached2 = source.uncancelable.memoize + * val cached2 = source.uncancelable.memoize * }}} * * When using [[onCancelRaiseError]] like in the example above, the @@ -1157,10 +1157,10 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * // Option 1: trigger error on cancellation * val err = new CancellationException - * @annotation.unused val cached1 = source.onCancelRaiseError(err).memoizeOnSuccess + * val cached1 = source.onCancelRaiseError(err).memoizeOnSuccess * * // Option 2: make it uninterruptible - * @annotation.unused val cached2 = source.uncancelable.memoizeOnSuccess + * val cached2 = source.uncancelable.memoizeOnSuccess * }}} * * When using [[onCancelRaiseError]] like in the example above, the @@ -1189,7 +1189,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * Example: * {{{ - * @annotation.unused val combined = Task{println("first"); "first"} >> Task{println("second"); "second"} + * val combined = Task{println("first"); "first"} >> Task{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "second" * }}} @@ -1202,7 +1202,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * Example: * {{{ - * @annotation.unused val combined = Task{println("first"); "first"} *> Task{println("second"); "second"} + * val combined = Task{println("first"); "first"} *> Task{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "second" * }}} @@ -1218,7 +1218,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * * Example: * {{{ - * @annotation.unused val combined = Task{println("first"); "first"} <* Task{println("second"); "second"} + * val combined = Task{println("first"); "first"} <* Task{println("second"); "second"} * // Prints "first" and then "second" * // Result value will be "first" * }}} @@ -1240,7 +1240,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * import monix.execution.ExecutionModel.SynchronousExecution * import monix.execution.Scheduler * - * @annotation.unused val s = Scheduler.singleThread("example-scheduler").withExecutionModel(SynchronousExecution) + * val s = Scheduler.singleThread("example-scheduler").withExecutionModel(SynchronousExecution) * * val source1 = Task(println("task 1")).loopForever * val source2 = Task(println("task 2")).loopForever @@ -1287,10 +1287,10 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * {{{ * import monix.execution.Scheduler * - * @annotation.unused implicit val s = Scheduler.global + * implicit val s = Scheduler.global * val io = Scheduler.io() * - * @annotation.unused val source = Task(1) // s + * val source = Task(1) // s * .asyncBoundary(io) * .flatMap(_ => Task(2)) // io * .flatMap(_ => Task(3)) // io @@ -1328,7 +1328,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * {{{ * import java.io._ * - * @annotation.unused def readFile(file: File): Task[String] = { + * def readFile(file: File): Task[String] = { * // Opening a file handle for reading text * val acquire = Task.eval(new BufferedReader( * new InputStreamReader(new FileInputStream(file), "utf-8") @@ -1692,7 +1692,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * // Overriding the default `ec`! * sayHello(io11) * - * @annotation.unused def sayHello3(ec: ExecutionContext): Unit = + * def sayHello3(ec: ExecutionContext): Unit = * // Overriding the default no longer has the desired effect * // because sayHello2 is ignoring it! * sayHello2(io22) @@ -1807,7 +1807,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * import scala.util.Random * * val random = Task(Random.nextInt()) - * @annotation.unused val loop = random.flatMapLoop(Vector.empty[Int]) { (a, list, continue) => + * val loop = random.flatMapLoop(Vector.empty[Int]) { (a, list, continue) => * val newList = list :+ a * if (newList.length < 5) * continue(newList) @@ -2181,7 +2181,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * cancellation): * * {{{ - * @annotation.unused def par2[A, B](ta: Task[A], tb: Task[B]): Task[(A, B)] = + * def par2[A, B](ta: Task[A], tb: Task[B]): Task[(A, B)] = * for { * fa <- ta.start * fb <- tb.start @@ -2375,7 +2375,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * // expensive remote call * def call(): Unit = () * - * @annotation.unused val remoteCall = Task(call()) + * val remoteCall = Task(call()) * .timeoutL(actualTimeout) * .onErrorRestart(100) * .timeout(deadline.time) @@ -2409,7 +2409,7 @@ sealed abstract class Task[+A] extends Serializable with TaskDeprecated.BinCompa * // expensive remote call * def call(): Unit = () * - * @annotation.unused val remoteCall = Task(call()) + * val remoteCall = Task(call()) * .timeoutToL(actualTimeout, Task.unit) * .onErrorRestart(100) * .timeout(deadline.time) @@ -2669,7 +2669,7 @@ object Task extends TaskInstancesLevel1 { * {{{ * import scala.concurrent.duration.MILLISECONDS * - * @annotation.unused def measureLatency[A](source: Task[A]): Task[(A, Long)] = + * def measureLatency[A](source: Task[A]): Task[(A, Long)] = * Task.deferAction { implicit s => * // We have our Scheduler, which can inject time, we * // can use it for side-effectful operations @@ -2711,7 +2711,7 @@ object Task extends TaskInstancesLevel1 { * {{{ * import scala.concurrent.{ExecutionContext, Future} * - * @annotation.unused def sumFuture(list: Seq[Int])(implicit ec: ExecutionContext): Future[Int] = + * def sumFuture(list: Seq[Int])(implicit ec: ExecutionContext): Future[Int] = * Future(list.sum) * }}} * @@ -2721,7 +2721,7 @@ object Task extends TaskInstancesLevel1 { * function an `ExecutionContext` is needed: * * {{{ - * @annotation.unused def sumTask(list: Seq[Int])(implicit ec: ExecutionContext): Task[Int] = + * def sumTask(list: Seq[Int])(implicit ec: ExecutionContext): Task[Int] = * Task.deferFuture(sumFuture(list)) * }}} * @@ -2733,7 +2733,7 @@ object Task extends TaskInstancesLevel1 { * `Scheduler` in the passed callback: * * {{{ - * @annotation.unused def sumTask2(list: Seq[Int]): Task[Int] = + * def sumTask2(list: Seq[Int]): Task[Int] = * Task.deferFutureAction { implicit scheduler => * sumFuture(list) * } @@ -2846,7 +2846,7 @@ object Task extends TaskInstancesLevel1 { * val io = IO.sleep(5.seconds) *> IO(println("Hello!")) * * // Resulting task is cancelable - * @annotation.unused val task: Task[Unit] = Task.fromEffect(io) + * val task: Task[Unit] = Task.fromEffect(io) * }}} * * Cancellation / finalization behavior is carried over, so the @@ -2879,7 +2879,7 @@ object Task extends TaskInstancesLevel1 { * * val io = IO(println("Hello!")) * - * @annotation.unused val task: Task[Unit] = Task.fromEffect(io) + * val task: Task[Unit] = Task.fromEffect(io) * }}} * * WARNING: the resulting task might not carry the source's @@ -2986,7 +2986,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.{Future, ExecutionContext} * import scala.util._ * - * @annotation.unused def deferFuture[A](f: => Future[A])(implicit ec: ExecutionContext): Task[A] = + * def deferFuture[A](f: => Future[A])(implicit ec: ExecutionContext): Task[A] = * Task.async { cb => * // N.B. we could do `f.onComplete(cb)` directly ;-) * f.onComplete { @@ -3047,7 +3047,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.Future * import scala.util._ * - * @annotation.unused def deferFuture[A](f: => Future[A]): Task[A] = + * def deferFuture[A](f: => Future[A]): Task[A] = * Task.async0 { (scheduler, cb) => * // We are being given an ExecutionContext ;-) * implicit val ec = scheduler @@ -3149,7 +3149,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.duration._ * import scala.util.control.NonFatal * - * @annotation.unused def delayed[A](sc: ScheduledExecutorService, timespan: FiniteDuration) + * def delayed[A](sc: ScheduledExecutorService, timespan: FiniteDuration) * (thunk: => A) * (implicit ec: ExecutionContext): Task[A] = { * @@ -3231,7 +3231,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.duration._ * import scala.util.control.NonFatal * - * @annotation.unused def delayed1[A](sc: ScheduledExecutorService, timespan: FiniteDuration) + * def delayed1[A](sc: ScheduledExecutorService, timespan: FiniteDuration) * (thunk: => A): Task[A] = { * * Task.cancelable0 { (scheduler, cb) => @@ -3265,7 +3265,7 @@ object Task extends TaskInstancesLevel1 { * Java's standard library: * * {{{ - * @annotation.unused def delayed2[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * def delayed2[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.cancelable0 { (scheduler, cb) => * // N.B. this already returns the Cancelable that we need! * val cancelable = scheduler.scheduleOnce(timespan) { @@ -3324,7 +3324,7 @@ object Task extends TaskInstancesLevel1 { * * import cats.syntax.all._ * - * @annotation.unused def fib(n: Int, a: Long, b: Long): Task[Long] = + * def fib(n: Int, a: Long, b: Long): Task[Long] = * Task.suspend { * if (n <= 0) Task.pure(a) else { * val next = fib(n - 1, b, a + b) @@ -3363,7 +3363,7 @@ object Task extends TaskInstancesLevel1 { * {{{ * import scala.concurrent.Future * - * @annotation.unused def deferFuture[A](f: => Future[A]): Task[A] = + * def deferFuture[A](f: => Future[A]): Task[A] = * Task.create { (scheduler, cb) => * f.onComplete(cb(_))(scheduler) * } @@ -3377,7 +3377,7 @@ object Task extends TaskInstancesLevel1 { * import scala.concurrent.duration.FiniteDuration * import scala.util.Try * - * @annotation.unused def delayResult1[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * def delayResult1[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.create { (scheduler, cb) => * val c = scheduler.scheduleOnce(timespan)(cb(Try(thunk))) * // We can simply return `c`, but doing this for didactic purposes! @@ -3391,7 +3391,7 @@ object Task extends TaskInstancesLevel1 { * {{{ * import cats.effect.IO * - * @annotation.unused def delayResult2[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * def delayResult2[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.create { (scheduler, cb) => * val c = scheduler.scheduleOnce(timespan)(cb(Try(thunk))) * // We can simply return `c`, but doing this for didactic purposes! @@ -3406,7 +3406,7 @@ object Task extends TaskInstancesLevel1 { * `Task.cancelable(f) <-> Task.create(f)` * * {{{ - * @annotation.unused def delayResult3[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * def delayResult3[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.create { (scheduler, cb) => * val c = scheduler.scheduleOnce(timespan)(cb(Try(thunk))) * // We can simply return `c`, but doing this for didactic purposes! @@ -3418,7 +3418,7 @@ object Task extends TaskInstancesLevel1 { * describes a cancelation action: * * {{{ - * @annotation.unused def delayResult4[A](timespan: FiniteDuration)(thunk: => A): Task[A] = + * def delayResult4[A](timespan: FiniteDuration)(thunk: => A): Task[A] = * Task.create { (scheduler, cb) => * val c = scheduler.scheduleOnce(timespan)(cb(Try(thunk))) * // We can simply return `c`, but doing this for didactic purposes! @@ -3505,7 +3505,7 @@ object Task extends TaskInstancesLevel1 { * val list: List[Task[Int]] = * List(1, 2, 3).map(i => Task.sleep(i.seconds).map(_ => i)) * - * @annotation.unused val winner: Task[Int] = Task.raceMany(list) + * val winner: Task[Int] = Task.raceMany(list) * }}} * * $parallelismNote @@ -4329,7 +4329,7 @@ object Task extends TaskInstancesLevel1 { * }) * * // Lifting to a Resource of Task - * @annotation.unused val res: Resource[Task, InputStream] = + * val res: Resource[Task, InputStream] = * open(new File("sample")).mapK(Task.liftFrom[IO]) * }}} */ diff --git a/monix-eval/shared/src/main/scala/monix/eval/TaskLike.scala b/monix-eval/shared/src/main/scala/monix/eval/TaskLike.scala index dfddecc1b..79c19669f 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/TaskLike.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/TaskLike.scala @@ -34,19 +34,19 @@ import scala.util.Try * import cats.Eval * * val source0 = Eval.always(1 + 1) - * @annotation.unused val task0 = TaskLike[Eval].apply(source0) + * val task0 = TaskLike[Eval].apply(source0) * * // Conversion from Future * import scala.concurrent.Future * * val source1 = Future.successful(1 + 1) - * @annotation.unused val task1 = TaskLike[Future].apply(source1) + * val task1 = TaskLike[Future].apply(source1) * * // Conversion from IO * import cats.effect.IO * * val source2 = IO(1 + 1) - * @annotation.unused val task2 = TaskLike[IO].apply(source2) + * val task2 = TaskLike[IO].apply(source2) * }}} * * This is an alternative to usage of `cats.effect.Effect` diff --git a/monix-eval/shared/src/main/scala/monix/eval/TaskLocal.scala b/monix-eval/shared/src/main/scala/monix/eval/TaskLocal.scala index 3a535f84f..5ce4c8a96 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/TaskLocal.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/TaskLocal.scala @@ -60,7 +60,7 @@ import monix.execution.misc.Local * * val t = Task(42) * // Options passed implicitly - * @annotation.unused val f = t.runToFutureOpt + * val f = t.runToFutureOpt * } * }}} * @@ -96,7 +96,7 @@ import monix.execution.misc.Local * * // Triggering actual execution, * // runToFutureOpt is not needed if `TracingScheduler` is used - * @annotation.unused val result = task.runToFuture + * val result = task.runToFuture * }}} */ final class TaskLocal[A] private (ref: Local[A]) { @@ -129,7 +129,7 @@ final class TaskLocal[A] private (ref: Local[A]) { * {{{ * // Should yield 200 on execution, regardless of what value * // we have in `local` at the time of evaluation - * @annotation.unused val task: Task[Int] = + * val task: Task[Int] = * for { * local <- TaskLocal(0) * value <- local.bind(100)(local.read.map(_ * 2)) @@ -156,7 +156,7 @@ final class TaskLocal[A] private (ref: Local[A]) { * {{{ * // Should yield 200 on execution, regardless of what value * // we have in `local` at the time of evaluation - * @annotation.unused val task: Task[Int] = + * val task: Task[Int] = * for { * local <- TaskLocal(0) * value <- local.bindL(Task.eval(100))(local.read.map(_ * 2)) @@ -188,7 +188,7 @@ final class TaskLocal[A] private (ref: Local[A]) { * {{{ * // Should yield 0 on execution, regardless of what value * // we have in `local` at the time of evaluation - * @annotation.unused val task: Task[Int] = + * val task: Task[Int] = * for { * local <- TaskLocal(0) * value <- local.bindClear(local.read.map(_ * 2)) diff --git a/monix-eval/shared/src/main/scala/monix/eval/internal/CoevalDeprecated.scala b/monix-eval/shared/src/main/scala/monix/eval/internal/CoevalDeprecated.scala index cee1f129d..e49301976 100644 --- a/monix-eval/shared/src/main/scala/monix/eval/internal/CoevalDeprecated.scala +++ b/monix-eval/shared/src/main/scala/monix/eval/internal/CoevalDeprecated.scala @@ -37,7 +37,7 @@ private[eval] trait CoevalDeprecatedExtensions[+A] extends Any { * * val value = Coeval { 1 + 1 } * - * @annotation.unused val result: IO[Int] = value.to[IO] + * val result: IO[Int] = value.to[IO] * }}} */ @deprecated("Use value.to[IO]", "3.0.0") @@ -57,7 +57,7 @@ private[eval] trait CoevalDeprecatedExtensions[+A] extends Any { * * val value = Coeval { 1 + 1 } * - * @annotation.unused val result: Eval[Int] = value.to[Eval] + * val result: Eval[Int] = value.to[Eval] * }}} */ @deprecated("Use value.to[Eval]", "3.0.0") @@ -76,7 +76,7 @@ private[eval] trait CoevalDeprecatedExtensions[+A] extends Any { * * val value = Coeval { 1 + 1 } * - * @annotation.unused val result: Task[Int] = value.to[Task] + * val result: Task[Int] = value.to[Task] * }}} */ @deprecated("Use value.to[Task]", "3.0.0") diff --git a/monix-execution/jvm/src/main/scala/monix/execution/internal/Platform.scala b/monix-execution/jvm/src/main/scala/monix/execution/internal/Platform.scala index a008f28cb..428cfc87e 100644 --- a/monix-execution/jvm/src/main/scala/monix/execution/internal/Platform.scala +++ b/monix-execution/jvm/src/main/scala/monix/execution/internal/Platform.scala @@ -176,7 +176,7 @@ private[monix] object Platform { * in JavaScript this always returns the same value. */ def currentThreadId(): Long = { - Thread.currentThread().getId + Thread.currentThread().threadId() } /** diff --git a/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/DynamicWorkerThreadFactory.scala b/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/DynamicWorkerThreadFactory.scala index 584183fce..f86a0526b 100644 --- a/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/DynamicWorkerThreadFactory.scala +++ b/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/DynamicWorkerThreadFactory.scala @@ -36,7 +36,7 @@ private[monix] final class DynamicWorkerThreadFactory( def wire[T <: Thread](thread: T): T = { thread.setDaemon(daemonic) thread.setUncaughtExceptionHandler(uncaught) - thread.setName(prefix + "-" + thread.getId) + thread.setName(prefix + "-" + thread.threadId()) thread } diff --git a/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/StandardWorkerThreadFactory.scala b/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/StandardWorkerThreadFactory.scala index 7d6d885e2..99b404a12 100644 --- a/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/StandardWorkerThreadFactory.scala +++ b/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/StandardWorkerThreadFactory.scala @@ -29,7 +29,7 @@ private[monix] final class StandardWorkerThreadFactory( def wire[T <: Thread](thread: T): T = { thread.setDaemon(daemonic) thread.setUncaughtExceptionHandler(uncaught) - thread.setName(prefix + "-" + thread.getId) + thread.setName(prefix + "-" + thread.threadId()) thread } diff --git a/monix-execution/jvm/src/main/scala/monix/execution/schedulers/ThreadFactoryBuilder.scala b/monix-execution/jvm/src/main/scala/monix/execution/schedulers/ThreadFactoryBuilder.scala index d22978783..39d74cd5b 100644 --- a/monix-execution/jvm/src/main/scala/monix/execution/schedulers/ThreadFactoryBuilder.scala +++ b/monix-execution/jvm/src/main/scala/monix/execution/schedulers/ThreadFactoryBuilder.scala @@ -32,7 +32,7 @@ private[schedulers] object ThreadFactoryBuilder { new ThreadFactory { def newThread(r: Runnable) = { val thread = new Thread(r) - thread.setName(name + "-" + thread.getId) + thread.setName(name + "-" + thread.threadId()) thread.setDaemon(daemonic) thread.setUncaughtExceptionHandler(reporter.asJava) thread diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala b/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala index 9d922bd20..f5c3c92fc 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/Observable.scala @@ -212,7 +212,7 @@ import scala.util.{Failure, Success, Try} * {{{ * import cats.Order * - * class Person(val name: String, val age: Int) + * case class Person(name: String, age: Int) * * // Starting from a Scala Ordering * implicit val scalaOrderingForPerson: Ordering[Person] = @@ -233,7 +233,7 @@ import scala.util.{Failure, Success, Try} * (due to Cats also exposing laws and tests for free) and build a * Scala `Ordering` when needed: * {{{ - * val _scalaOrdering = catsOrderForPerson.toOrdering + * val scalaOrdering = catsOrderForPerson.toOrdering * }}} * * @define catsEqInterop ==Cats Eq and Scala Interop== @@ -258,9 +258,9 @@ import scala.util.{Failure, Success, Try} * {{{ * import cats.Eq * - * type Address = (String, Int) + * case class Address(host: String, port: Int) * - * implicit val _eqForAddress: Eq[Address] = + * implicit val eqForAddress: Eq[Address] = * Eq.fromUniversalEquals * }}} */ @@ -1038,7 +1038,7 @@ abstract class Observable[+A] extends Serializable { self => * {{{ * import scala.concurrent.duration._ * - * @annotation.unused def debounce[A](stream: Observable[A], d: FiniteDuration): Observable[A] = + * def debounce[A](stream: Observable[A], d: FiniteDuration): Observable[A] = * stream.switchMap { x => * Observable.now(x).delayExecution(d) * } @@ -1163,7 +1163,7 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 1, 2, 1, 3, 2, 4 - * @annotation.unused val stream = Observable(1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 2, 2, 4, 4, 4) + * val stream = Observable(1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 2, 2, 4, 4, 4) * .distinctUntilChanged * }}} * @@ -1190,7 +1190,7 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 1, 2, 3, 4 - * @annotation.unused val stream = Observable(1, 3, 2, 4, 2, 3, 5, 7, 4) + * val stream = Observable(1, 3, 2, 4, 2, 3, 5, 7, 4) * .distinctUntilChangedByKey(_ % 2) * }}} * @@ -1222,7 +1222,7 @@ abstract class Observable[+A] extends Serializable { self => * {{{ * import monix.eval.Task * - * @annotation.unused val stream = Observable.range(0, Int.MaxValue) + * val stream = Observable.range(0, Int.MaxValue) * .doOnEarlyStop(Task(println("Stopped early!"))) * .take(100) * }}} @@ -1249,7 +1249,7 @@ abstract class Observable[+A] extends Serializable { self => * {{{ * import cats.effect.IO * - * @annotation.unused val stream = Observable.range(0, Int.MaxValue) + * val stream = Observable.range(0, Int.MaxValue) * .doOnEarlyStopF(IO(println("Stopped early!"))) * .take(100) * }}} @@ -1955,7 +1955,7 @@ abstract class Observable[+A] extends Serializable { self => * Observable(2, 3) * ) * - * @annotation.unused val concatenated = + * val concatenated = * stream.concatDelayErrors * }}} * @@ -2109,7 +2109,7 @@ abstract class Observable[+A] extends Serializable { self => * import cats.effect.ExitCase * import monix.eval.Task * - * @annotation.unused val stream = Observable.suspend(???).guaranteeCase(err => Task { + * val stream = Observable.suspend(???).guaranteeCase(err => Task { * err match { * case ExitCase.Completed => * println("Completed successfully!") @@ -2520,7 +2520,7 @@ abstract class Observable[+A] extends Serializable { self => * {{{ * import monix.execution.ExecutionModel.AlwaysAsyncExecution * - * @annotation.unused val stream = Observable(1, 2, 3) + * val stream = Observable(1, 2, 3) * .executeWithModel(AlwaysAsyncExecution) * }}} * @@ -2993,7 +2993,7 @@ abstract class Observable[+A] extends Serializable { self => * case class Current[A](current: Option[A], count: Int) * extends State[A] * - * type Person = (Int, String) + * case class Person(id: Int, name: String) * * // TODO: to implement! * def requestPersonDetails(id: Int): IO[Option[Person]] = @@ -3017,7 +3017,7 @@ abstract class Observable[+A] extends Serializable { self => * } * } * - * @annotation.unused val filtered = scanned + * val filtered = scanned * .takeWhile(_.count < 10) * .collect { case Current(a, _) => a } * }}} @@ -3074,7 +3074,7 @@ abstract class Observable[+A] extends Serializable { self => * case class Current[A](current: Option[A], count: Int) * extends State[A] * - * type Person = (Int, String) + * case class Person(id: Int, name: String) * * // TODO: to implement! * def requestPersonDetails(id: Int): Task[Option[Person]] = @@ -3098,7 +3098,7 @@ abstract class Observable[+A] extends Serializable { self => * } * } * - * @annotation.unused val filtered = scanned + * val filtered = scanned * .takeWhile(_.count < 10) * .collect { case Current(a, _) => a } * }}} @@ -3145,7 +3145,7 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 2, 6, 12, 20, 30, 42 - * @annotation.unused val stream = Observable(1, 2, 3, 4, 5, 6).scanMap(x => x * 2) + * val stream = Observable(1, 2, 3, 4, 5, 6).scanMap(x => x * 2) * }}} * * @param f is the mapping function applied to every incoming element of this `Observable` @@ -4054,10 +4054,10 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 10 - * @annotation.unused val stream1 = Observable(1, 2, 3, 4).fold + * val stream1 = Observable(1, 2, 3, 4).fold * * // Yields "1234" - * @annotation.unused val stream2 = Observable("1", "2", "3", "4").fold + * val stream2 = Observable("1", "2", "3", "4").fold * }}} * * Note, in case you don't have a `Monoid` instance in scope, @@ -4092,10 +4092,10 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields 10 - * @annotation.unused val stream1 = Observable(1, 2, 3, 4).foldL + * val stream1 = Observable(1, 2, 3, 4).foldL * * // Yields "1234" - * @annotation.unused val stream2 = Observable("1", "2", "3", "4").foldL + * val stream2 = Observable("1", "2", "3", "4").foldL * }}} * * @see [[fold]] for the version that returns an observable @@ -4121,20 +4121,20 @@ abstract class Observable[+A] extends Serializable { self => * * Example: {{{ * // Sums first 10 items - * @annotation.unused val stream1 = Observable.range(0, 1000).foldWhileLeft((0L, 0)) { + * val stream1 = Observable.range(0, 1000).foldWhileLeft((0L, 0)) { * case ((sum, count), e) => * val next = (sum + e, count + 1) * if (count + 1 < 10) Left(next) else Right(next) * } * * // Implements exists(predicate) - * @annotation.unused val stream2 = Observable(1, 2, 3, 4, 5).foldWhileLeft(false) { + * val stream2 = Observable(1, 2, 3, 4, 5).foldWhileLeft(false) { * (default, e) => * if (e == 3) Right(true) else Left(default) * } * * // Implements forall(predicate) - * @annotation.unused val stream3 = Observable(1, 2, 3, 4, 5).foldWhileLeft(true) { + * val stream3 = Observable(1, 2, 3, 4, 5).foldWhileLeft(true) { * (default, e) => * if (e != 3) Right(false) else Left(default) * } @@ -4170,20 +4170,20 @@ abstract class Observable[+A] extends Serializable { self => * * Example: {{{ * // Sums first 10 items - * @annotation.unused val stream1 = Observable.range(0, 1000).foldWhileLeftL((0L, 0)) { + * val stream1 = Observable.range(0, 1000).foldWhileLeftL((0L, 0)) { * case ((sum, count), e) => * val next = (sum + e, count + 1) * if (count + 1 < 10) Left(next) else Right(next) * } * * // Implements exists(predicate) - * @annotation.unused val stream2 = Observable(1, 2, 3, 4, 5).foldWhileLeftL(false) { + * val stream2 = Observable(1, 2, 3, 4, 5).foldWhileLeftL(false) { * (default, e) => * if (e == 3) Right(true) else Left(default) * } * * // Implements forall(predicate) - * @annotation.unused val stream3 = Observable(1, 2, 3, 4, 5).foldWhileLeftL(true) { + * val stream3 = Observable(1, 2, 3, 4, 5).foldWhileLeftL(true) { * (default, e) => * if (e != 3) Right(false) else Left(default) * } @@ -4452,10 +4452,10 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields Some(20) - * @annotation.unused val stream1 = Observable(10, 7, 6, 8, 20, 3, 5).maxL + * val stream1 = Observable(10, 7, 6, 8, 20, 3, 5).maxL * * // Yields Observable.empty - * @annotation.unused val stream2 = Observable.empty[Int].maxL + * val stream2 = Observable.empty[Int].maxL * }}} * * $catsOrderInterop @@ -4482,10 +4482,10 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields Observable(20) - * @annotation.unused val stream1 = Observable(10, 7, 6, 8, 20, 3, 5).max + * val stream1 = Observable(10, 7, 6, 8, 20, 3, 5).max * * // Yields Observable.empty - * @annotation.unused val stream2 = Observable.empty[Int].max + * val stream2 = Observable.empty[Int].max * }}} * * $catsOrderInterop @@ -4593,11 +4593,11 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields Some(3) - * @annotation.unused val stream1 = + * val stream1 = * Observable(10, 7, 6, 8, 20, 3, 5).minL * * // Yields None - * @annotation.unused val stream2 = + * val stream2 = * Observable.empty[Int].minL * }}} * @@ -4625,11 +4625,11 @@ abstract class Observable[+A] extends Serializable { self => * import cats.implicits._ * * // Yields Observable(3) - * @annotation.unused val stream1 = + * val stream1 = * Observable(10, 7, 6, 8, 20, 3, 5).min * * // Yields Observable.empty - * @annotation.unused val stream2 = + * val stream2 = * Observable.empty[Int].min * }}} * @@ -4691,7 +4691,7 @@ abstract class Observable[+A] extends Serializable { self => * case class Person(name: String, age: Int) * * // Yields Observable(Person("Alice", 27)) - * @annotation.unused val stream = Observable(Person("Alex", 34), Person("Alice", 27)) + * val stream = Observable(Person("Alex", 34), Person("Alice", 27)) * .minBy(_.age) * }}} * @@ -4893,7 +4893,7 @@ object Observable extends ObservableDeprecatedBuilders { * {{{ * // Don't do this kind of recursion, because `flatMap` can throw * // stack overflow errors: - * @annotation.unused def tailRecM[A, B](a: A)(f: (A) => Observable[Either[A, B]]): Observable[B] = + * def tailRecM[A, B](a: A)(f: (A) => Observable[Either[A, B]]): Observable[B] = * f(a).flatMap { * case Right(b) => Observable.pure(b) * case Left(nextA) => tailRecM(nextA)(f) @@ -5141,7 +5141,7 @@ object Observable extends ObservableDeprecatedBuilders { * This example would be equivalent with usage of [[Observable.resource]]: * * {{{ - * @annotation.unused def openFileAsResource2(file: File): Observable[FileInputStream] = { + * def openFileAsResource2(file: File): Observable[FileInputStream] = { * Observable.resource(Task(new FileInputStream(file)))(h => Task(h.close())) * } * }}} @@ -5149,7 +5149,7 @@ object Observable extends ObservableDeprecatedBuilders { * This means that `flatMap` is safe to use: * * {{{ - * @annotation.unused def readBytes(file: File): Observable[Array[Byte]] = + * def readBytes(file: File): Observable[Array[Byte]] = * openFileAsStream(file).flatMap { in => * Observable.fromInputStreamUnsafe(in) * } diff --git a/monix-reactive/shared/src/main/scala/monix/reactive/ObservableLike.scala b/monix-reactive/shared/src/main/scala/monix/reactive/ObservableLike.scala index d4afc6167..65d84bb0a 100644 --- a/monix-reactive/shared/src/main/scala/monix/reactive/ObservableLike.scala +++ b/monix-reactive/shared/src/main/scala/monix/reactive/ObservableLike.scala @@ -35,19 +35,19 @@ import scala.util.Try * import cats.Eval * * val source0 = Eval.always(1 + 1) - * @annotation.unused val task0 = ObservableLike[Eval].apply(source0) + * val task0 = ObservableLike[Eval].apply(source0) * * // Conversion from Future * import scala.concurrent.Future * * val source1 = Future.successful(1 + 1) - * @annotation.unused val task1 = ObservableLike[Future].apply(source1) + * val task1 = ObservableLike[Future].apply(source1) * * // Conversion from IO * import cats.effect.IO * * val source2 = IO(1 + 1) - * @annotation.unused val task2 = ObservableLike[IO].apply(source2) + * val task2 = ObservableLike[IO].apply(source2) * }}} * * See [[Observable.from]] diff --git a/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala b/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala index bbff14f9b..8f11f7c2f 100644 --- a/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala +++ b/monix-tail/shared/src/main/scala/monix/tail/Iterant.scala @@ -165,7 +165,7 @@ import scala.concurrent.duration.{Duration, FiniteDuration} * {{{ * import cats.Order * - * class Person(val name: String, val age: Int) + * case class Person(name: String, age: Int) * * // Starting from a Scala Ordering * implicit val scalaOrderingForPerson: Ordering[Person] = @@ -186,7 +186,7 @@ import scala.concurrent.duration.{Duration, FiniteDuration} * (due to Cats also exposing laws and tests for free) and build a * Scala `Ordering` when needed: * {{{ - * val _scalaOrdering = catsOrderForPerson.toOrdering + * val scalaOrdering = catsOrderForPerson.toOrdering * }}} * * @define catsEqInterop ==Cats Eq and Scala Interop== @@ -211,9 +211,9 @@ import scala.concurrent.duration.{Duration, FiniteDuration} * {{{ * import cats.Eq * - * type Address = (String, Int) + * case class Address(host: String, port: Int) * - * implicit val _eqForAddress: Eq[Address] = + * implicit val eqForAddress: Eq[Address] = * Eq.fromUniversalEquals * }}} */ @@ -1158,7 +1158,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * import cats.implicits._ * import cats.effect.Sync * - * @annotation.unused def exists[F[_], A](fa: Iterant[F, A], p: A => Boolean) + * def exists[F[_], A](fa: Iterant[F, A], p: A => Boolean) * (implicit F: Sync[F]): F[Boolean] = { * * fa.foldRightL(F.pure(false)) { (a, next) => @@ -1166,7 +1166,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * } * } * - * @annotation.unused def forall[F[_], A](fa: Iterant[F, A], p: A => Boolean) + * def forall[F[_], A](fa: Iterant[F, A], p: A => Boolean) * (implicit F: Sync[F]): F[Boolean] = { * * fa.foldRightL(F.pure(true)) { (a, next) => @@ -1174,7 +1174,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * } * } * - * @annotation.unused def concat[F[_], A](lh: Iterant[F, A], rh: Iterant[F, A]) + * def concat[F[_], A](lh: Iterant[F, A], rh: Iterant[F, A]) * (implicit F: Sync[F]): Iterant[F, A] = { * * Iterant.suspend[F, A] { @@ -2022,7 +2022,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * extends State[A] * * // Dummies - * type Person = (Int, String, Int) + * case class Person(id: Int, name: String, age: Int) * def requestPersonDetails(id: Int): Task[Option[Person]] = Task.delay(???) * * // Whatever @@ -2150,7 +2150,7 @@ sealed abstract class Iterant[F[_], A] extends Product with Serializable { * {{{ * import cats._, cats.implicits._, cats.effect._ * - * @annotation.unused def unconsFold[F[_]: Sync, A: Monoid](iterant: Iterant[F, A]): F[A] = { + * def unconsFold[F[_]: Sync, A: Monoid](iterant: Iterant[F, A]): F[A] = { * def go(iterant: Iterant[F, A], acc: A): Iterant[F, A] = * iterant.uncons.flatMap { * case (None, _) => Iterant.pure(acc) @@ -2779,7 +2779,7 @@ object Iterant extends IterantInstances { * This example would be equivalent with usage of [[Iterant.resource]]: * * {{{ - * @annotation.unused def openFileAsResource2(file: File): Iterant[IO, FileInputStream] = { + * def openFileAsResource2(file: File): Iterant[IO, FileInputStream] = { * Iterant.resource(IO(new FileInputStream(file)))(h => IO(h.close())) * } * }}} @@ -2787,7 +2787,7 @@ object Iterant extends IterantInstances { * This means that `flatMap` is safe to use: * * {{{ - * @annotation.unused def readLines(file: File): Iterant[IO, String] = + * def readLines(file: File): Iterant[IO, String] = * openFileAsStream(file).flatMap { in => * val buf = new BufferedReader(new InputStreamReader(in, "utf-8")) * Iterant[IO].repeatEval(buf.readLine()) @@ -2896,7 +2896,7 @@ object Iterant extends IterantInstances { * import monix.eval.Coeval * import scala.util.Random * - * @annotation.unused val randomInts = Iterant[Coeval].repeatEval(Random.nextInt()) + * val randomInts = Iterant[Coeval].repeatEval(Random.nextInt()) * }}} * */ diff --git a/monix-tail/shared/src/main/scala/monix/tail/batches/BatchCursor.scala b/monix-tail/shared/src/main/scala/monix/tail/batches/BatchCursor.scala index c0cc15ee8..0bfb5d9f5 100644 --- a/monix-tail/shared/src/main/scala/monix/tail/batches/BatchCursor.scala +++ b/monix-tail/shared/src/main/scala/monix/tail/batches/BatchCursor.scala @@ -38,7 +38,7 @@ import scala.reflect.ClassTag * * Sample: * {{{ - * @annotation.unused def sum(cursor: BatchCursor[Int]): Long = { + * def sum(cursor: BatchCursor[Int]): Long = { * var sum = 0L * * while (cursor.hasNext()) { From bfa11aa3a7976b5133e575263296335acdf418f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 18:19:17 +0200 Subject: [PATCH 12/15] revert: restore Thread.getId calls Co-Authored-By: Claude Opus 4.6 (1M context) --- .../jvm/src/main/scala/monix/execution/internal/Platform.scala | 2 +- .../internal/forkJoin/DynamicWorkerThreadFactory.scala | 2 +- .../internal/forkJoin/StandardWorkerThreadFactory.scala | 2 +- .../scala/monix/execution/schedulers/ThreadFactoryBuilder.scala | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/monix-execution/jvm/src/main/scala/monix/execution/internal/Platform.scala b/monix-execution/jvm/src/main/scala/monix/execution/internal/Platform.scala index 428cfc87e..a008f28cb 100644 --- a/monix-execution/jvm/src/main/scala/monix/execution/internal/Platform.scala +++ b/monix-execution/jvm/src/main/scala/monix/execution/internal/Platform.scala @@ -176,7 +176,7 @@ private[monix] object Platform { * in JavaScript this always returns the same value. */ def currentThreadId(): Long = { - Thread.currentThread().threadId() + Thread.currentThread().getId } /** diff --git a/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/DynamicWorkerThreadFactory.scala b/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/DynamicWorkerThreadFactory.scala index f86a0526b..584183fce 100644 --- a/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/DynamicWorkerThreadFactory.scala +++ b/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/DynamicWorkerThreadFactory.scala @@ -36,7 +36,7 @@ private[monix] final class DynamicWorkerThreadFactory( def wire[T <: Thread](thread: T): T = { thread.setDaemon(daemonic) thread.setUncaughtExceptionHandler(uncaught) - thread.setName(prefix + "-" + thread.threadId()) + thread.setName(prefix + "-" + thread.getId) thread } diff --git a/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/StandardWorkerThreadFactory.scala b/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/StandardWorkerThreadFactory.scala index 99b404a12..7d6d885e2 100644 --- a/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/StandardWorkerThreadFactory.scala +++ b/monix-execution/jvm/src/main/scala/monix/execution/internal/forkJoin/StandardWorkerThreadFactory.scala @@ -29,7 +29,7 @@ private[monix] final class StandardWorkerThreadFactory( def wire[T <: Thread](thread: T): T = { thread.setDaemon(daemonic) thread.setUncaughtExceptionHandler(uncaught) - thread.setName(prefix + "-" + thread.threadId()) + thread.setName(prefix + "-" + thread.getId) thread } diff --git a/monix-execution/jvm/src/main/scala/monix/execution/schedulers/ThreadFactoryBuilder.scala b/monix-execution/jvm/src/main/scala/monix/execution/schedulers/ThreadFactoryBuilder.scala index 39d74cd5b..d22978783 100644 --- a/monix-execution/jvm/src/main/scala/monix/execution/schedulers/ThreadFactoryBuilder.scala +++ b/monix-execution/jvm/src/main/scala/monix/execution/schedulers/ThreadFactoryBuilder.scala @@ -32,7 +32,7 @@ private[schedulers] object ThreadFactoryBuilder { new ThreadFactory { def newThread(r: Runnable) = { val thread = new Thread(r) - thread.setName(name + "-" + thread.threadId()) + thread.setName(name + "-" + thread.getId) thread.setDaemon(daemonic) thread.setUncaughtExceptionHandler(reporter.asJava) thread From b0fb80734e58431aa7d30006bc699dae84a7dd20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 18:28:36 +0200 Subject: [PATCH 13/15] fix: suppress deprecated Thread.getId warning via -Wconf Co-Authored-By: Claude Opus 4.6 (1M context) --- build.sbt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index b47266496..28cff85d0 100644 --- a/build.sbt +++ b/build.sbt @@ -198,7 +198,10 @@ lazy val sharedSettings = pgpSettings ++ Seq( // Silence everything in auto-generated files scalacOptions ++= { if (isDotty.value) - Seq("-Wconf:src=.*src_managed.*:s") + Seq( + "-Wconf:src=.*src_managed.*:s", + "-Wconf:msg=method getId in class Thread is deprecated:s" + ) else Seq("-P:silencer:pathFilters=.*[/]src_managed[/].*") }, From 5612a2cb55f7253f723c1f6b4afb4d333903b72d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 18:37:57 +0200 Subject: [PATCH 14/15] fix: use msg-based -Wconf filters instead of src-based The src= filter may not work in all Scala 3.3.x versions. Use msg= filters to suppress specific warnings by message text: - "unused local definition" in Test scope (generated doctests) - "discarded non-Unit value" in Test scope (generated doctests) - "method getId in class Thread is deprecated" globally Co-Authored-By: Claude Opus 4.6 (1M context) --- build.sbt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/build.sbt b/build.sbt index 28cff85d0..d029a8f4b 100644 --- a/build.sbt +++ b/build.sbt @@ -198,13 +198,17 @@ lazy val sharedSettings = pgpSettings ++ Seq( // Silence everything in auto-generated files scalacOptions ++= { if (isDotty.value) - Seq( - "-Wconf:src=.*src_managed.*:s", - "-Wconf:msg=method getId in class Thread is deprecated:s" - ) + Seq("-Wconf:msg=method getId in class Thread is deprecated:s") else Seq("-P:silencer:pathFilters=.*[/]src_managed[/].*") }, + // Disable unused locals check in Test for Scala 3 (generated doctest files trigger false positives) + Test / scalacOptions ++= { + if (isDotty.value) + Seq("-Wconf:msg=unused local definition:s", "-Wconf:msg=discarded non-Unit value:s") + else + Seq.empty + }, // Syntax improvements, linting, etc. libraryDependencies ++= { if (isDotty.value) From 242efac08b87ce471c6254b158e877e145991fbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 30 Mar 2026 18:38:43 +0200 Subject: [PATCH 15/15] fix: remove overly broad discarded non-Unit value suppression from Test scope Co-Authored-By: Claude Opus 4.6 (1M context) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index d029a8f4b..516fc9a43 100644 --- a/build.sbt +++ b/build.sbt @@ -205,7 +205,7 @@ lazy val sharedSettings = pgpSettings ++ Seq( // Disable unused locals check in Test for Scala 3 (generated doctest files trigger false positives) Test / scalacOptions ++= { if (isDotty.value) - Seq("-Wconf:msg=unused local definition:s", "-Wconf:msg=discarded non-Unit value:s") + Seq("-Wconf:msg=unused local definition:s") else Seq.empty },