Высокий уровень того, что мне нужно сделать для переноса ReactiveMongo scala для использования эффектов кошек?

Правильно ли сказать, что если я захочу использовать ReactiveMongo в чем-то вроде http4s, мне придется обернуть все вызовы Future, которые ReactiveMongo возвращает, в эффект Cats IO?

На высоком уровне, что мне нужно сделать, чтобы включить ReactiveMongo в http4s?


person Blankman    schedule 13.07.2020    source источник
comment
Краткий ответ: да   -  person cchantep    schedule 14.07.2020


Ответы (1)


Cats Effect предоставляет Async класс типов, который позволяет вам переводить некоторые обратные вызовы (например, Future onComplete) в F. Пример из документации:

import cats.effect.{IO, Async}

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

val apiCall = Future.successful("I come from the Future!")

val ioa: IO[String] =
  Async[IO].async { cb =>
    import scala.util.{Failure, Success}

    apiCall.onComplete {
      case Success(value) => cb(Right(value))
      case Failure(error) => cb(Left(error))
    }
 }

ioa.unsafeRunSync()

Фактически, Async[F] evan имеет метод, позволяющий поднять Future до async: Async[F].fromFuture(Sync[F].defer(future)) (Future обернут в IO, поскольку его создание имеет побочные эффекты и запускает активные вычисления).

Однако, если вы настроены на использование именно cats.effect.IO, вы можете просто использовать IO.fromFuture(IO(future)).

Вам придется использовать это (или какую-то утилиту, делегирующую это) везде, где вам нужно перевести Future в IO (или другой F).

person Mateusz Kubuszok    schedule 14.07.2020