diff --git a/modules/core/ce2/src/test/scala/tofu/time/TimeSuite.scala b/modules/core/ce2/src/test/scala/tofu/time/TimeSuite.scala index f55bc75a7..69dde3ad9 100644 --- a/modules/core/ce2/src/test/scala/tofu/time/TimeSuite.scala +++ b/modules/core/ce2/src/test/scala/tofu/time/TimeSuite.scala @@ -33,4 +33,9 @@ class TimeSuite { Sleep[ReaderT[IO, Unit, _]] Timeout[ReaderT[IO, Unit, _]] } + + def readerF[F[_]: Clock: Sleep] = { + Clock[ReaderT[F, Unit, _]] + Sleep[ReaderT[F, Unit, _]] + } } diff --git a/modules/core/ce3/src/test/scala/tofu/time/TimeSuite.scala b/modules/core/ce3/src/test/scala/tofu/time/TimeSuite.scala index 2122bb220..fd23d5173 100644 --- a/modules/core/ce3/src/test/scala/tofu/time/TimeSuite.scala +++ b/modules/core/ce3/src/test/scala/tofu/time/TimeSuite.scala @@ -28,4 +28,9 @@ class TimeSuite { Sleep[ReaderT[IO, Unit, _]] Timeout[ReaderT[IO, Unit, _]] } + + def readerF[F[_]: Clock: Sleep] = { + Clock[ReaderT[F, Unit, _]] + Sleep[ReaderT[F, Unit, _]] + } } diff --git a/modules/kernel/src/main/scala/tofu/time/Clock.scala b/modules/kernel/src/main/scala/tofu/time/Clock.scala index 3355170be..ed983234d 100644 --- a/modules/kernel/src/main/scala/tofu/time/Clock.scala +++ b/modules/kernel/src/main/scala/tofu/time/Clock.scala @@ -2,6 +2,7 @@ package tofu.time import java.util.concurrent.TimeUnit +import cats.data.Kleisli import tofu.internal.EffectComp import tofu.internal.instances.ClockInstance @@ -21,4 +22,14 @@ trait Clock[F[_]] { def nanos: F[Long] } -object Clock extends EffectComp[Clock] with ClockInstance +object Clock extends EffectComp[Clock] with ClockInstance { + implicit def clockForKleisli[F[_], R](implicit clock: Clock[F]): Clock[Kleisli[F, R, *]] = + new Clock[Kleisli[F, R, *]] { + + override def realTime(unit: TimeUnit): Kleisli[F, R, Long] = + Kleisli.liftF(clock.realTime(unit)) + + override def nanos: Kleisli[F, R, Long] = + Kleisli.liftF(clock.nanos) + } +} diff --git a/modules/kernel/src/main/scala/tofu/time/Sleep.scala b/modules/kernel/src/main/scala/tofu/time/Sleep.scala index 9ab270843..2f5c38bc0 100644 --- a/modules/kernel/src/main/scala/tofu/time/Sleep.scala +++ b/modules/kernel/src/main/scala/tofu/time/Sleep.scala @@ -1,6 +1,7 @@ package tofu.time import scala.concurrent.duration.FiniteDuration +import cats.data.Kleisli import tofu.internal.EffectComp import tofu.internal.instances.SleepInstance @@ -11,4 +12,7 @@ trait Sleep[F[_]] { def sleep(duration: FiniteDuration): F[Unit] } -object Sleep extends SleepInstance with EffectComp[Sleep] +object Sleep extends SleepInstance with EffectComp[Sleep] { + implicit def sleepForKleisli[F[_], R](implicit s: Sleep[F]): Sleep[Kleisli[F, R, *]] = + (duration: FiniteDuration) => Kleisli.liftF(s.sleep(duration)) +}