diff --git a/.scalafmt.conf b/.scalafmt.conf index 900c070c..972e2d6c 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,3 +1,18 @@ -version = 3.7.17 +version = 3.8.1 runner.dialect = scala3 maxColumn = 120 + +rewrite { + rules = [ + Imports + ] + + imports { + expand = false + sort = ascii + groups = [ + ["gears\\..*"], + ["java.?\\..*", "scala\\..*"], + ] + } +} diff --git a/build.sbt b/build.sbt index 1771430e..abda98f8 100644 --- a/build.sbt +++ b/build.sbt @@ -1,4 +1,4 @@ -import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType} +import sbtcrossproject.CrossPlugin.autoImport.{CrossType, crossProject} import scalanative.build._ ThisBuild / scalaVersion := "3.3.3" diff --git a/jvm/src/main/scala/PosixLikeIO/PIO.scala b/jvm/src/main/scala/PosixLikeIO/PIO.scala index edca40d5..c61eca85 100644 --- a/jvm/src/main/scala/PosixLikeIO/PIO.scala +++ b/jvm/src/main/scala/PosixLikeIO/PIO.scala @@ -1,19 +1,20 @@ package PosixLikeIO -import gears.async.{Async, Future} +import gears.async.Scheduler import gears.async.default.given -import Future.Promise +import gears.async.{Async, Future} import java.net.{DatagramPacket, DatagramSocket, InetAddress, InetSocketAddress, ServerSocket, Socket} import java.nio.ByteBuffer import java.nio.channels.{AsynchronousFileChannel, CompletionHandler, SocketChannel} import java.nio.charset.{Charset, StandardCharsets} import java.nio.file.{Path, StandardOpenOption} +import java.util.concurrent.CancellationException import scala.Tuple.Union import scala.concurrent.ExecutionContext import scala.util.{Failure, Success, Try} -import gears.async.Scheduler -import java.util.concurrent.CancellationException + +import Future.Promise object File: extension (resolver: Future.Resolver[Int]) diff --git a/jvm/src/main/scala/PosixLikeIO/examples/clientAndServerUDP.scala b/jvm/src/main/scala/PosixLikeIO/examples/clientAndServerUDP.scala index 5d98f674..a1c30b41 100644 --- a/jvm/src/main/scala/PosixLikeIO/examples/clientAndServerUDP.scala +++ b/jvm/src/main/scala/PosixLikeIO/examples/clientAndServerUDP.scala @@ -1,15 +1,16 @@ package PosixLikeIO.examples +import gears.async.AsyncOperations.* import gears.async.default.given import gears.async.{Async, Future} -import gears.async.AsyncOperations.* -import PosixLikeIO.{PIOHelper, SocketUDP} import java.net.DatagramPacket import java.nio.ByteBuffer import java.nio.file.StandardOpenOption import scala.concurrent.ExecutionContext +import PosixLikeIO.{PIOHelper, SocketUDP} + @main def clientAndServerUDP(): Unit = given ExecutionContext = ExecutionContext.global Async.blocking: diff --git a/jvm/src/main/scala/PosixLikeIO/examples/readAndWriteFile.scala b/jvm/src/main/scala/PosixLikeIO/examples/readAndWriteFile.scala index f63b0e50..a2bf39a9 100644 --- a/jvm/src/main/scala/PosixLikeIO/examples/readAndWriteFile.scala +++ b/jvm/src/main/scala/PosixLikeIO/examples/readAndWriteFile.scala @@ -2,13 +2,14 @@ package PosixLikeIO.examples import gears.async.Async import gears.async.default.given -import PosixLikeIO.PIOHelper import java.nio.ByteBuffer import java.nio.charset.StandardCharsets import java.nio.file.StandardOpenOption import scala.concurrent.ExecutionContext +import PosixLikeIO.PIOHelper + @main def readAndWriteFile(): Unit = given ExecutionContext = ExecutionContext.global Async.blocking: diff --git a/jvm/src/main/scala/PosixLikeIO/examples/readWholeFile.scala b/jvm/src/main/scala/PosixLikeIO/examples/readWholeFile.scala index 3924114f..7811122c 100644 --- a/jvm/src/main/scala/PosixLikeIO/examples/readWholeFile.scala +++ b/jvm/src/main/scala/PosixLikeIO/examples/readWholeFile.scala @@ -2,13 +2,14 @@ package PosixLikeIO.examples import gears.async.Async import gears.async.default.given -import PosixLikeIO.PIOHelper import java.nio.ByteBuffer import java.nio.charset.StandardCharsets import java.nio.file.StandardOpenOption import scala.concurrent.ExecutionContext +import PosixLikeIO.PIOHelper + @main def readWholeFile(): Unit = given ExecutionContext = ExecutionContext.global Async.blocking: diff --git a/jvm/src/main/scala/async/VThreadSupport.scala b/jvm/src/main/scala/async/VThreadSupport.scala index 82442aaa..8b2dc371 100644 --- a/jvm/src/main/scala/async/VThreadSupport.scala +++ b/jvm/src/main/scala/async/VThreadSupport.scala @@ -1,9 +1,9 @@ package gears.async -import scala.annotation.unchecked.uncheckedVariance +import java.lang.invoke.{MethodHandles, VarHandle} import java.util.concurrent.locks.ReentrantLock +import scala.annotation.unchecked.uncheckedVariance import scala.concurrent.duration.FiniteDuration -import java.lang.invoke.{VarHandle, MethodHandles} object VThreadScheduler extends Scheduler: private val VTFactory = Thread diff --git a/jvm/src/main/scala/measurements/measureTimes.scala b/jvm/src/main/scala/measurements/measureTimes.scala index 4a5beb42..1b3c4e6f 100644 --- a/jvm/src/main/scala/measurements/measureTimes.scala +++ b/jvm/src/main/scala/measurements/measureTimes.scala @@ -1,17 +1,18 @@ package measurements -import PosixLikeIO.PIOHelper -import gears.async.{Async, BufferedChannel, ChannelMultiplexer, Future, SyncChannel} import gears.async.default.given +import gears.async.{Async, BufferedChannel, ChannelMultiplexer, Future, SyncChannel} import java.io.{FileReader, FileWriter} import java.nio.file.{Files, NoSuchFileException, Paths, StandardOpenOption} +import java.util.concurrent.atomic.AtomicInteger import scala.collection.mutable import scala.collection.mutable.{ArrayBuffer, HashMap} import scala.concurrent.ExecutionContext -import java.util.concurrent.atomic.AtomicInteger -import scala.util.Try import scala.util.CommandLineParser.FromString.given_FromString_Int +import scala.util.Try + +import PosixLikeIO.PIOHelper case class TimeMeasurementResult(millisecondsPerOperation: Double, standardDeviation: Double) diff --git a/jvm/src/test/scala/CancellationBehavior.scala b/jvm/src/test/scala/CancellationBehavior.scala index b0ec2663..7e214f0a 100644 --- a/jvm/src/test/scala/CancellationBehavior.scala +++ b/jvm/src/test/scala/CancellationBehavior.scala @@ -1,12 +1,14 @@ -import gears.async.{Async, Future, AsyncSupport, uninterruptible} import gears.async.AsyncOperations.* import gears.async.default.given -import scala.util.boundary -import boundary.break -import scala.concurrent.duration.{Duration, DurationInt} +import gears.async.{Async, AsyncSupport, Future, uninterruptible} + import java.util.concurrent.CancellationException -import scala.util.Success +import scala.concurrent.duration.{Duration, DurationInt} import scala.util.Properties +import scala.util.Success +import scala.util.boundary + +import boundary.break // JVM-only since `munitTimeout` is not available on scala native. // See (here)[https://scalameta.org/munit/docs/tests.html#customize-test-timeouts]. diff --git a/native/src/main/scala/async/ForkJoinSupport.scala b/native/src/main/scala/async/ForkJoinSupport.scala index bdd5f6e9..731c6d70 100644 --- a/native/src/main/scala/async/ForkJoinSupport.scala +++ b/native/src/main/scala/async/ForkJoinSupport.scala @@ -1,14 +1,15 @@ package gears.async.native +import gears.async.Future.Promise import gears.async._ -import scala.scalanative.runtime.{Continuations => nativeContinuations} + +import java.util.concurrent.CancellationException import java.util.concurrent.ForkJoinPool +import java.util.concurrent.atomic.AtomicBoolean import scala.concurrent.ExecutionContext import scala.concurrent.JavaConversions._ import scala.concurrent.duration._ -import java.util.concurrent.atomic.AtomicBoolean -import gears.async.Future.Promise -import java.util.concurrent.CancellationException +import scala.scalanative.runtime.{Continuations => nativeContinuations} class NativeContinuation[-T, +R] private[native] (val cont: T => R) extends Suspension[T, R]: def resume(arg: T): R = cont(arg) diff --git a/shared/src/main/scala/async/Async.scala b/shared/src/main/scala/async/Async.scala index 2e959e81..3e856baa 100644 --- a/shared/src/main/scala/async/Async.scala +++ b/shared/src/main/scala/async/Async.scala @@ -1,10 +1,12 @@ package gears.async + +import gears.async.Listener.NumberedLock +import gears.async.Listener.withLock + import java.util.concurrent.atomic.AtomicBoolean -import scala.collection.mutable -import java.util.concurrent.locks.ReentrantLock import java.util.concurrent.atomic.AtomicLong -import gears.async.Listener.withLock -import gears.async.Listener.NumberedLock +import java.util.concurrent.locks.ReentrantLock +import scala.collection.mutable import scala.util.boundary /** The async context: provides the capability to asynchronously [[Async.await await]] for [[Async.Source Source]]s, and diff --git a/shared/src/main/scala/async/AsyncOperations.scala b/shared/src/main/scala/async/AsyncOperations.scala index 0494ce0a..9b00cd86 100644 --- a/shared/src/main/scala/async/AsyncOperations.scala +++ b/shared/src/main/scala/async/AsyncOperations.scala @@ -1,9 +1,10 @@ package gears.async -import scala.concurrent.duration.FiniteDuration -import java.util.concurrent.TimeoutException import gears.async.AsyncOperations.sleep +import java.util.concurrent.TimeoutException +import scala.concurrent.duration.FiniteDuration + /** Defines fundamental operations that require the support of the scheduler. This is commonly provided alongside with * the given implementation of [[Scheduler]]. * @see diff --git a/shared/src/main/scala/async/CompletionGroup.scala b/shared/src/main/scala/async/CompletionGroup.scala index 22daafb6..0a10b877 100644 --- a/shared/src/main/scala/async/CompletionGroup.scala +++ b/shared/src/main/scala/async/CompletionGroup.scala @@ -1,8 +1,9 @@ package gears.async import scala.collection.mutable -import Future.Promise import scala.util.Success +import Future.Promise + /** A group of cancellable objects that are completed together. Cancelling the group means cancelling all its * uncompleted members. */ diff --git a/shared/src/main/scala/async/Listener.scala b/shared/src/main/scala/async/Listener.scala index 113d9792..8ab8d57c 100644 --- a/shared/src/main/scala/async/Listener.scala +++ b/shared/src/main/scala/async/Listener.scala @@ -1,8 +1,9 @@ package gears.async -import scala.annotation.tailrec import gears.async.Async.Source + import java.util.concurrent.locks.ReentrantLock +import scala.annotation.tailrec /** A listener, representing an one-time value receiver of an [[Async.Source]]. * diff --git a/shared/src/main/scala/async/ScalaConverters.scala b/shared/src/main/scala/async/ScalaConverters.scala index 2cc72029..e3d9a7dd 100644 --- a/shared/src/main/scala/async/ScalaConverters.scala +++ b/shared/src/main/scala/async/ScalaConverters.scala @@ -1,7 +1,7 @@ package gears.async -import scala.concurrent.{Future as StdFuture, Promise as StdPromise} import scala.concurrent.ExecutionContext +import scala.concurrent.{Future as StdFuture, Promise as StdPromise} import scala.util.Try /** Converters from Gears types to Scala API types and back. */ diff --git a/shared/src/main/scala/async/Timer.scala b/shared/src/main/scala/async/Timer.scala index 5a6fe874..fbce50c3 100644 --- a/shared/src/main/scala/async/Timer.scala +++ b/shared/src/main/scala/async/Timer.scala @@ -1,16 +1,17 @@ package gears.async -import Future.Promise -import AsyncOperations.sleep +import gears.async.Listener +import java.util.concurrent.CancellationException import java.util.concurrent.TimeoutException +import scala.annotation.tailrec import scala.collection.mutable import scala.concurrent.TimeoutException -import scala.util.{Failure, Success, Try} -import gears.async.Listener import scala.concurrent.duration._ -import scala.annotation.tailrec -import java.util.concurrent.CancellationException +import scala.util.{Failure, Success, Try} + +import AsyncOperations.sleep +import Future.Promise /** Timer exposes a steady [[Async.Source]] of ticks that happens every `tickDuration` milliseconds. Note that the timer * does not start ticking until `start` is called (which is a blocking operation, until the timer is cancelled). diff --git a/shared/src/main/scala/async/channels.scala b/shared/src/main/scala/async/channels.scala index 2d0cf083..15c9e98b 100644 --- a/shared/src/main/scala/async/channels.scala +++ b/shared/src/main/scala/async/channels.scala @@ -1,15 +1,14 @@ package gears.async -import scala.collection.mutable -import mutable.{ArrayBuffer, ListBuffer} - -import scala.util.{Failure, Success, Try} - -import scala.util.control.Breaks.{break, breakable} import gears.async.Async.Source -import gears.async.listeners.lockBoth import gears.async.Listener.acceptingListener +import gears.async.listeners.lockBoth + +import scala.collection.mutable +import scala.util.control.Breaks.{break, breakable} +import scala.util.{Failure, Success, Try} import Channel.{Closed, Res} +import mutable.{ArrayBuffer, ListBuffer} /** The part of a channel one can send values to. Blocking behavior depends on the implementation. */ diff --git a/shared/src/main/scala/async/futures.scala b/shared/src/main/scala/async/futures.scala index abc665e8..f5b839fd 100644 --- a/shared/src/main/scala/async/futures.scala +++ b/shared/src/main/scala/async/futures.scala @@ -1,14 +1,14 @@ package gears.async -import scala.collection.mutable -import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.CancellationException -import scala.compiletime.uninitialized -import scala.annotation.unchecked.uncheckedVariance +import java.util.concurrent.atomic.AtomicBoolean import scala.annotation.tailrec +import scala.annotation.unchecked.uncheckedVariance +import scala.collection.mutable +import scala.compiletime.uninitialized import scala.util -import scala.util.{Failure, Success, Try} import scala.util.control.NonFatal +import scala.util.{Failure, Success, Try} /** Futures are [[Async.Source Source]]s that has the following properties: * - They represent a single value: Once resolved, [[Async.await await]]-ing on a [[Future]] should always return the diff --git a/shared/src/main/scala/async/listeners/locking.scala b/shared/src/main/scala/async/listeners/locking.scala index d7902e2d..3d24d012 100644 --- a/shared/src/main/scala/async/listeners/locking.scala +++ b/shared/src/main/scala/async/listeners/locking.scala @@ -2,9 +2,11 @@ package gears.async.listeners import gears.async._ -import Listener.ListenerLock + import scala.annotation.tailrec +import Listener.ListenerLock + /** Two listeners being locked at the same time, while having the same [[Listener.ListenerLock.selfNumber lock number]]. */ case class ConflictingLocksException( diff --git a/shared/src/main/scala/async/retry.scala b/shared/src/main/scala/async/retry.scala index 29197c0a..ec1e3caf 100644 --- a/shared/src/main/scala/async/retry.scala +++ b/shared/src/main/scala/async/retry.scala @@ -1,15 +1,15 @@ package gears.async -import scala.util.Random -import scala.util.{Try, Success, Failure} -import scala.util.boundary -import scala.util.control.NonFatal -import scala.concurrent.duration._ - import gears.async.Async import gears.async.AsyncOperations.sleep import gears.async.Retry.Delay +import scala.concurrent.duration._ +import scala.util.Random +import scala.util.boundary +import scala.util.control.NonFatal +import scala.util.{Failure, Success, Try} + /** Utility class to perform asynchronous actions with retrying policies on exceptions. * * See [[Retry]] companion object for common policies as a starting point. diff --git a/shared/src/test/scala/CancellationBehavior.scala b/shared/src/test/scala/CancellationBehavior.scala index d9f6d233..448247c0 100644 --- a/shared/src/test/scala/CancellationBehavior.scala +++ b/shared/src/test/scala/CancellationBehavior.scala @@ -1,11 +1,13 @@ -import gears.async.{Async, Future, AsyncSupport, uninterruptible} import gears.async.AsyncOperations.* import gears.async.default.given -import scala.util.boundary -import boundary.break -import scala.concurrent.duration.{Duration, DurationInt} +import gears.async.{Async, AsyncSupport, Future, uninterruptible} + import java.util.concurrent.CancellationException +import scala.concurrent.duration.{Duration, DurationInt} import scala.util.Success +import scala.util.boundary + +import boundary.break class CancellationBehavior extends munit.FunSuite: enum State: diff --git a/shared/src/test/scala/ChannelBehavior.scala b/shared/src/test/scala/ChannelBehavior.scala index afbc340a..49c60e5b 100644 --- a/shared/src/test/scala/ChannelBehavior.scala +++ b/shared/src/test/scala/ChannelBehavior.scala @@ -1,3 +1,5 @@ +import gears.async.AsyncOperations.* +import gears.async.default.given import gears.async.{ Async, BufferedChannel, @@ -9,19 +11,18 @@ import gears.async.{ TaskSchedule, UnboundedChannel } -import gears.async.default.given -import gears.async.AsyncOperations.* -import Future.zip +import java.nio.ByteBuffer import java.util.concurrent.CancellationException +import java.util.concurrent.atomic.AtomicInteger +import scala.collection.Stepper.UnboxingFloatStepper import scala.collection.mutable +import scala.collection.mutable.{ArrayBuffer, Set} import scala.concurrent.ExecutionContext -import scala.util.{Failure, Success, Try} import scala.util.Random -import scala.collection.mutable.{ArrayBuffer, Set} -import java.util.concurrent.atomic.AtomicInteger -import java.nio.ByteBuffer -import scala.collection.Stepper.UnboxingFloatStepper +import scala.util.{Failure, Success, Try} + +import Future.zip class ChannelBehavior extends munit.FunSuite { diff --git a/shared/src/test/scala/FutureBehavior.scala b/shared/src/test/scala/FutureBehavior.scala index 9aa53d92..e596d672 100644 --- a/shared/src/test/scala/FutureBehavior.scala +++ b/shared/src/test/scala/FutureBehavior.scala @@ -1,16 +1,16 @@ -import gears.async.{Async, Future, Task, TaskSchedule, uninterruptible} -import gears.async.default.given -import gears.async.Future.{Promise, zip} import gears.async.AsyncOperations.* +import gears.async.Future.{Promise, zip} +import gears.async.Listener +import gears.async.default.given +import gears.async.{Async, Future, Task, TaskSchedule, uninterruptible} import java.util.concurrent.CancellationException +import java.util.concurrent.atomic.AtomicInteger import scala.collection.mutable +import scala.collection.mutable.Set import scala.concurrent.ExecutionContext -import scala.util.{Failure, Success, Try} import scala.util.Random -import scala.collection.mutable.Set -import java.util.concurrent.atomic.AtomicInteger -import gears.async.Listener +import scala.util.{Failure, Success, Try} class FutureBehavior extends munit.FunSuite { given ExecutionContext = ExecutionContext.global diff --git a/shared/src/test/scala/ListenerBehavior.scala b/shared/src/test/scala/ListenerBehavior.scala index 23f7dbfe..e7893665 100644 --- a/shared/src/test/scala/ListenerBehavior.scala +++ b/shared/src/test/scala/ListenerBehavior.scala @@ -1,16 +1,17 @@ +import gears.async.Async +import gears.async.Async.Source import gears.async.Async.race import gears.async.Future import gears.async.Future.Promise -import gears.async.Async import gears.async.Listener +import gears.async.Listener.ListenerLock import gears.async.default.given -import scala.util.Success -import java.util.concurrent.atomic.AtomicBoolean +import gears.async.listeners.ConflictingLocksException import gears.async.listeners.lockBoth -import gears.async.Listener.ListenerLock -import gears.async.Async.Source + +import java.util.concurrent.atomic.AtomicBoolean import scala.collection.mutable.Buffer -import gears.async.listeners.ConflictingLocksException +import scala.util.Success class ListenerBehavior extends munit.FunSuite: given munit.Assertions = this diff --git a/shared/src/test/scala/RetryBehavior.scala b/shared/src/test/scala/RetryBehavior.scala index 53a791b0..e0da12b8 100644 --- a/shared/src/test/scala/RetryBehavior.scala +++ b/shared/src/test/scala/RetryBehavior.scala @@ -1,13 +1,14 @@ -import gears.async.{Async, Future, Task, TaskSchedule, Retry} -import Retry.Delay -import scala.concurrent.duration.* -import FiniteDuration as Duration import gears.async.default.given -import Future.zip +import gears.async.{Async, Future, Retry, Task, TaskSchedule} import scala.concurrent.ExecutionContext -import scala.util.{Failure, Success, Try} +import scala.concurrent.duration.* import scala.util.Random +import scala.util.{Failure, Success, Try} + +import FiniteDuration as Duration +import Future.zip +import Retry.Delay class RetryBehavior extends munit.FunSuite { test("Exponential backoff(2) 50ms, 5 times total schedule"): diff --git a/shared/src/test/scala/SchedulerBehavior.scala b/shared/src/test/scala/SchedulerBehavior.scala index aa70cbba..942a70b9 100644 --- a/shared/src/test/scala/SchedulerBehavior.scala +++ b/shared/src/test/scala/SchedulerBehavior.scala @@ -1,10 +1,12 @@ -import gears.async.{Async, Future, Listener} import gears.async.AsyncOperations.* -import gears.async.default.given -import concurrent.duration.DurationInt import gears.async.Future.Promise +import gears.async.default.given +import gears.async.{Async, Future, Listener} + import scala.util.Success +import concurrent.duration.DurationInt + class SchedulerBehavior extends munit.FunSuite { test("schedule cancellation works") { Async.blocking: diff --git a/shared/src/test/scala/SourceBehavior.scala b/shared/src/test/scala/SourceBehavior.scala index 58405dd3..ad09b062 100644 --- a/shared/src/test/scala/SourceBehavior.scala +++ b/shared/src/test/scala/SourceBehavior.scala @@ -1,12 +1,13 @@ -import gears.async.{Async, Future, Listener} -import Async.either import gears.async.AsyncOperations.* import gears.async.default.given +import gears.async.{Async, Future, Listener} import java.util.concurrent.CancellationException import scala.concurrent.ExecutionContext -import scala.util.{Failure, Success, Try} import scala.util.Random +import scala.util.{Failure, Success, Try} + +import Async.either class SourceBehavior extends munit.FunSuite { given ExecutionContext = ExecutionContext.global diff --git a/shared/src/test/scala/Stress.scala b/shared/src/test/scala/Stress.scala index ddc71733..47b4dabb 100644 --- a/shared/src/test/scala/Stress.scala +++ b/shared/src/test/scala/Stress.scala @@ -1,9 +1,10 @@ -import gears.async.{Async, Future, AsyncSupport, uninterruptible} import gears.async.AsyncOperations.* -import gears.async.default.given import gears.async.Future.MutableCollector -import java.util.concurrent.atomic.AtomicInteger import gears.async.Timer +import gears.async.default.given +import gears.async.{Async, AsyncSupport, Future, uninterruptible} + +import java.util.concurrent.atomic.AtomicInteger import scala.concurrent.duration._ class StressTest extends munit.FunSuite: diff --git a/shared/src/test/scala/TaskScheduleBehavior.scala b/shared/src/test/scala/TaskScheduleBehavior.scala index 06e26253..67bb9ea2 100644 --- a/shared/src/test/scala/TaskScheduleBehavior.scala +++ b/shared/src/test/scala/TaskScheduleBehavior.scala @@ -1,10 +1,11 @@ -import gears.async.{Async, Future, Task, TaskSchedule} import gears.async.default.given -import Future.zip +import gears.async.{Async, Future, Task, TaskSchedule} import scala.concurrent.ExecutionContext -import scala.util.{Failure, Success, Try} import scala.util.Random +import scala.util.{Failure, Success, Try} + +import Future.zip class TaskScheduleBehavior extends munit.FunSuite { given ExecutionContext = ExecutionContext.global diff --git a/shared/src/test/scala/TimerBehavior.scala b/shared/src/test/scala/TimerBehavior.scala index 5a35ba35..a58937ec 100644 --- a/shared/src/test/scala/TimerBehavior.scala +++ b/shared/src/test/scala/TimerBehavior.scala @@ -1,10 +1,11 @@ -import gears.async._ import gears.async.AsyncOperations._ -import scala.concurrent.duration._ -import scala.util.{Success, Failure} -import java.util.concurrent.TimeoutException +import gears.async._ + import java.util.concurrent.CancellationException +import java.util.concurrent.TimeoutException +import scala.concurrent.duration._ import scala.util.Try +import scala.util.{Failure, Success} class TimerBehavior extends munit.FunSuite { import gears.async.default.given