diff --git a/README.md b/README.md index 362953d..3c7afee 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,76 @@ val Gstiming: ModuleID = "gs" %% "gs-timing-v0" % "$VERSION" ``` +### System Time + +```scala +import gs.timing.v0.* +import cats.effect.IO +import cats.effect.unsafe.IORuntime + +given IORuntime = IORuntime.global + +val timing = new Timing(MonotonicProvider.system[IO]) + +val nanoTime: Long = timing.monotonic().unsafeRunSync() +``` + +### Elapsed Time + +``` +import gs.timing.v0.* +import cats.effect.IO +import cats.effect.unsafe.IORuntime +import scala.concurrent.duration._ + +given IORuntime = IORuntime.global + +val timing = new Timing(MonotonicProvider.system[IO]) + +val program: IO[(ElapsedTime, ElapsedTime)] = + for + timer <- timing.start() + _ <- IO.sleep(1.seconds) + elapsed1 <- timer.checkpoint() + _ <- IO.sleep(1.seconds) + elapsed2 <- timer.checkpoint() + yield + (elapsed1, elapsed2) + +val (e1, e2) = program.unsafeRunSync() +assert(e1.start == e2.start) +assert(e1.end != e2.end) +println(e1.duration) +println(e1.toNanoseconds()) +println(e1.toMilliseconds()) +println(e1.toSeconds()) +``` + +### Testing + +For example, using munit and a simple helper for running IO-based tests: + +``` +iotest("should retrieve monotonic time") { + for + (provider, timing) <- Timing.manual[IO] + t1 <- timing.monotonic() + t2 <- timing.monotonic() + _ <- provider.tick() + t3 <- timing.monotonic() + _ <- provider.tick() + t4 <- timing.monotonic() + _ <- provider.reset() + t5 <- timing.monotonic() + yield + assertEquals(t1, 0L) + assertEquals(t2, 0L) + assertEquals(t3, 1L) + assertEquals(t4, 2L) + assertEquals(t5, 0L) +} +``` + ## Donate Enjoy this project or want to help me achieve my [goals](https://garrity.co)? diff --git a/src/main/scala/gs/timing/v0/MonotonicTimer.scala b/src/main/scala/gs/timing/v0/MonotonicTimer.scala index a474293..3c9f520 100644 --- a/src/main/scala/gs/timing/v0/MonotonicTimer.scala +++ b/src/main/scala/gs/timing/v0/MonotonicTimer.scala @@ -22,9 +22,9 @@ import scala.concurrent.duration.FiniteDuration * val program: IO[List[ElapsedTime]] = * for * timer <- timing.start() - * elapsed1 <- timing.checkpoint() - * elapsed2 <- timing.checkpoint() - * elapsed3 <- timing.checkpoint() + * elapsed1 <- timer.checkpoint() + * elapsed2 <- timer.checkpoint() + * elapsed3 <- timer.checkpoint() * yield * List(elapsed1, elapsed2, elapsed3) * }}}