Cats Effect предоставляет класс типов Async
, который позволяет вам преобразовывать некоторые обратные вызовы (например, onComplete
Future) в 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 до asyn c: Async[F].fromFuture(Sync[F].defer(future))
(Future
завернут в IO поскольку его создание имеет побочные эффекты и запускает активные вычисления).
Однако, если вы настроены на использование cats.effect.IO
, вы можете просто использовать IO.fromFuture(IO(future))
.
Вам придется используйте это (или какую-нибудь утилиту, делегирующую это) везде, где вам нужно перевести Future в IO (или другой F).