All Downloads are FREE. Search and download functionalities are using the official Maven repository.

trace4cats.fs2.ContinuationSpan.scala Maven / Gradle / Ivy

The newest version!
package trace4cats.fs2

import cats.data.NonEmptyList
import cats.effect.kernel.{MonadCancelThrow, Resource}
import trace4cats.context.Provide
import trace4cats.kernel.{ErrorHandler, Span}
import trace4cats.model._

trait ContinuationSpan[F[_]] extends Span[F] {
  def run[A](k: F[A]): F[A]
}

object ContinuationSpan {
  def fromSpan[F[_]: MonadCancelThrow, G[_]: MonadCancelThrow](
    span: Span[F]
  )(implicit P: Provide[F, G, Span[F]]): ContinuationSpan[G] = {
    // 👀
    val spanK: Span[G] = span.mapK(P.liftK)

    new ContinuationSpan[G] {
      override def context: SpanContext = spanK.context

      override def put(key: String, value: AttributeValue): G[Unit] = spanK.put(key, value)

      override def putAll(fields: (String, AttributeValue)*): G[Unit] = spanK.putAll(fields: _*)

      override def putAll(fields: Map[String, AttributeValue]): G[Unit] = spanK.putAll(fields)

      override def setStatus(spanStatus: SpanStatus): G[Unit] = spanK.setStatus(spanStatus)

      override def addLink(link: Link): G[Unit] = spanK.addLink(link)

      override def addLinks(links: NonEmptyList[Link]): G[Unit] = spanK.addLinks(links)

      override def child(name: String, kind: SpanKind): Resource[G, Span[G]] = spanK.child(name, kind)

      override def child(name: String, kind: SpanKind, errorHandler: ErrorHandler): Resource[G, Span[G]] =
        spanK.child(name, kind, errorHandler)

      override def run[A](k: G[A]): G[A] = P.lift(P.provide(k)(span))
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy