Как прикрепить эффекты к F в Resource[F, A], не используя A?
Учитывая Resource[F, A]
Какой самый идиоматичный способ прикрепить эффекты (например, метрики, ошибки регистрации) к F
без использования A
(т.е. .use
)?
Я могу легко сделать это с F[A]
но я зависим от API, который специально возвращает Resource[F, A]
чтобы убедиться, что A
будет выпущен правильно.
1 ответ
Решение
Если я правильно понимаю вопрос, я бы использовал Resource.liftF
а также <*
, Например:
import cats.effect.{ IO, Resource }
import cats.syntax.apply._
import scala.io.Source
val src = Resource.fromAutoCloseable(IO(Source.fromFile("build.sbt")))
val log = IO(println("opening file"))
val loggedSrc = src <* Resource.liftF(log)
А потом:
scala> val program = loggedSrc.use(s => IO(println(s.mkString)))
program: cats.effect.IO[Unit] = IO$201584418
scala> program.unsafeRunSync
opening file
scalaVersion := "2.12.8"
scalacOptions += "-Ypartial-unification"
libraryDependencies += "org.typelevel" %% "cats-effect" % "1.2.0"
В общем, вы бы использовали тот же подход, что и в F
, но поднял в Resource[F, _]
с Resource.liftF
,