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

trace4cats.context.Ask.scala Maven / Gradle / Ivy

There is a newer version: 0.14.7
Show newest version
package trace4cats.context

import cats.{~>, Monad}
import cats.syntax.all._
import trace4cats.optics.Getter
import trace4cats.context.internal.TupleAskInstances

trait Ask[F[_], R] extends ContextRoot { self =>
  def F: Monad[F]

  def ask[R1 >: R]: F[R1]

  def access[A](f: R => A): F[A] = F.map(ask)(f)
  def accessF[A](f: R => F[A]): F[A] = F.flatMap(ask)(f)

  def zoom[R1](g: Getter[R, R1]): Ask[F, R1] = Ask.make(self.access(g.get))(self.F)

  def mapK[G[_]: Monad](fk: F ~> G): Ask[G, R] = Ask.make(fk(self.ask[R]))

}

object Ask extends TupleAskInstances {

  def apply[F[_], R](implicit ev: Ask[F, R]): Ask[F, R] = ev

  def make[F[_]: Monad, A](f: F[A]): Ask[F, A] = new Ask[F, A] {
    override def F: Monad[F] = Monad[F]

    def ask[E2 >: A]: F[E2] = f.widen

  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy