Преобразование будущего [A] в F [A] с помощью Async [F] - PullRequest
0 голосов
/ 04 марта 2020

Я работаю с Slick and Cats.

database.run возвращает Future, но мне нужен метод моего класса (generi c на F[_]: Async) для возврата монады F. Я могу заставить его работать так:

val future = database.run(insertion)    
val result = Await.result(future, Duration.Inf)    
Async[F].delay(result)

, но это не тот способ, которым это нужно делать наверняка, поскольку он блокирует поток.

Есть ли какой-нибудь правильный способ сделать это?

1 Ответ

5 голосов
/ 04 марта 2020

Async.fromFuture - это то, что вам нужно.
Как всегда, scalado c - ваш друг.

import cats.effect.{Async, ContextShift]

def foo[F[_] : Async : ContextShift]: F[Result] =
  Async.fromFuture(Async[F].delay(database.run(insertion)))
...