Вопрос: Безопасно ли приостановить unsafeRunSync
с IO
?Например,
val io: IO[Unit] = //...
val io2: IO[Unit] = IO(io.unsafeRunSync)
Причина, по которой я бы сделал это, заключается в том, что у меня есть некоторый класс, параметризованный с помощью F[_]: Effect
, который похож на кеш:
import cats.effect.Effect
final class MyChache[F[_]](implicit F: Effect[F]) {
private val cache = new ConcurrentHashMap[Int, String]
def getOrCreate(key: Int): F[String] = F delay {
cache.computeIfAbsent(
key,
k => longRunningEffecfulComputation(k).toIO.unsafeRunSync() // <-- Here
)
}
}
object MyCache {
def longRunningEffecfulComputation[F[_] : Effect](key: Int): F[String] = {
//...
}
}
Суть в том, что я хочу запустить этодлительный эффект, полный расчет только один раз для каждого ключа (это довольно редко).Тем не менее, я хотел бы остаться неблокирующим при получении существующего ключа.
ConcurrentHashMap
кажется идеальным выбором, но он требует этого уродливого трюка с запуском и приостановкой эффекта.Есть ли лучший путь?