Как прикрепить эффекты к 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,

Другие вопросы по тегам