diff --git a/modules/mtl/shared/src/main/scala/package.scala b/modules/mtl/shared/src/main/scala/package.scala index 40ef4377..413e4365 100644 --- a/modules/mtl/shared/src/main/scala/package.scala +++ b/modules/mtl/shared/src/main/scala/package.scala @@ -4,6 +4,8 @@ package natchez +import cats._ +import cats.data.Kleisli import cats.mtl.Local import cats.effect.{Trace => _, _} @@ -13,4 +15,23 @@ package object mtl { eb: MonadCancel[F, Throwable] ): Trace[F] = new LocalTrace(ev) + + implicit def localSpanForKleisli[F[_]](implicit + F: MonadCancel[F, _] + ): Local[Kleisli[F, Span[F], *], Span[Kleisli[F, Span[F], *]]] = + new Local[Kleisli[F, Span[F], *], Span[Kleisli[F, Span[F], *]]] { + override def local[A]( + fa: Kleisli[F, Span[F], A] + )(f: Span[Kleisli[F, Span[F], *]] => Span[Kleisli[F, Span[F], *]]): Kleisli[F, Span[F], A] = + fa.local { + f.andThen(_.mapK(Kleisli.applyK(Span.noop[F]))) + .compose(_.mapK(Kleisli.liftK)) + } + + override def applicative: Applicative[Kleisli[F, Span[F], *]] = + Kleisli.catsDataApplicativeForKleisli + + override def ask[E2 >: Span[Kleisli[F, Span[F], *]]]: Kleisli[F, Span[F], E2] = + Kleisli.ask[F, Span[F]].map(_.mapK(Kleisli.liftK)) + } }