Scala - как получить данные из IO [HttpResponse] в гамаке? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть простые методы:

def retrieveRepositories(url: String, params: String): IO[HttpResponse] = Hammock.getWithOpts(uri"$url", createOpts).exec[IO]

Который является http-клиентом. и json декодер:

implicit def decodeResponseEntity(response: HttpResponse): Either[CodecException, List[GitRepository]] = Decoder[List[GitRepository]].decode(response.entity)

Теперь я хочу назвать этот клиент следующим образом:

def getRepos(organization: String, params: String): F[Either[CodecException, List[GitRepository]]] = for {
    res <- retrieveRepositories(organization, params)
    result <- Sync[F].delay(decodeResponseEntity(res))
  } yield result

Но есть проблема со строкой result <- Sync[F].delay(decodeResponseEntity(res)), потому что я получилошибка: Type mismatch. Reguired: IO[B_] but found F[Either[CodecException, List[GitRepository]]]. Когда я добавляю unsafeRunSync() метод к retrieveRepositories(organization, params), он работает нормально, но я должен вызывать этот метод в конце, а не здесь. Как мне это исправить?

1 Ответ

1 голос
/ 11 ноября 2019

Если вы можете, вы можете изменить определение retrieveRepositories и параметризовать тип эффекта (F) вместо использования конкретного типа IO.

Если вы не можетеизменить retrieveRepositories, добавить неявное ограничение LiftIO в getRepos. Вы сможете использовать метод liftIO, чтобы поднять конкретные значения IO в F. Альтернативой может быть использование класса типов Async, который наследуется от Sync и LiftIO.

См. Документацию по liftIO: https://typelevel.org/cats-effect/typeclasses/liftio.html

...