我需要做什么来移植ReactiveMongo scala以使用cats效果?

我需要做什么来移植ReactiveMongo scala以使用cats效果?,scala,reactivemongo,cats-effect,Scala,Reactivemongo,Cats Effect,如果我想在像http4s这样的东西中使用ReactiveMongo,那么我必须将ReactiveMongo返回的所有调用打包成Cats IO效果,这样说对吗 在较高的层次上,我需要采取哪些步骤将ReactiveMongo合并到http4s中?Cats Effect提供了Asynctypeclass,它允许您将一些回调(例如未来的onComplete)转换为F。安: 实际上,Async[F]evan有一种方法可以将Future提升为Async:Async[F].fromFuture(Sync[F]

如果我想在像http4s这样的东西中使用ReactiveMongo,那么我必须将ReactiveMongo返回的所有调用打包成Cats IO效果,这样说对吗


在较高的层次上,我需要采取哪些步骤将ReactiveMongo合并到http4s中?

Cats Effect提供了
Async
typeclass,它允许您将一些回调(例如未来的
onComplete
)转换为
F
。安:

实际上,
Async[F]
evan有一种方法可以将Future提升为Async:
Async[F].fromFuture(Sync[F].defer(Future))
Future
包装在IO中,因为它的创建会产生副作用,并触发急切的计算)

但是,如果您固定使用
cats.effect.IO
,您只需使用
IO.fromFuture(IO(future))


您必须在任何需要将Future转换为IO(或其他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()