Как прикрепить эффекты к F в Resource [F, A], не используя A? - PullRequest
0 голосов
/ 12 февраля 2019

Учитывая Resource[F, A], какой самый идиоматичный способ прикрепить эффекты (например, метрики, ошибки регистрации) к F без использования A (то есть .use)?

Я могу легкосделать это с F[A], но я зависим от API, который специально возвращает Resource[F, A], чтобы убедиться, что A будет выпущен правильно.

1 Ответ

0 голосов
/ 12 февраля 2019

Если я правильно понял вопрос, я бы использовал 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.

...