FS2: Как получить java .io.InputStream из fs2.Stream? - PullRequest
0 голосов
/ 26 апреля 2020

Скажем, у меня есть val fs2Stream: Stream[IO, Byte], и мне нужно, например, вызвать какую-то библиотеку Java, для которой требуется java.io.InputStream.

Полагаю, я слишком новичок в FS2, но я не могу найти ответ. Я пытался использовать fs2.io.toInputStream и fs2.io.readInputStream, но не могу понять, как предоставить некоторые обязательные параметры. Я отыскивал всемогущий Google на предмет ответов, но похоже, что API изменился с тех пор, как большинство людей в последний раз искали ответ.

Как я могу go сделать что-то вроде следующего?

def myFunc(data: fs2.Stream[IO, Byte]): InputStream[Byte] = someMagicalFunction(data)

1 Ответ

4 голосов
/ 26 апреля 2020

Вы, вероятно, хотите что-то вроде этого:

import cats.effect.{ContextShift, IO, Resource}
import java.io.InputStream

def myFunc(data: fs2.Stream[IO, Byte])
          (implicit cs: ContextShift[IO]): Resource[IO, InputStream] =
  data.through(fs2.io.toInputStream).compile.resource.lastOrError

Тогда вы можете использовать это как:

object JavaApi {
  def foo(is: InputStream): IO[Unit] = ???
}

object Main extends IOApp {
  def data: fs2.Stream[IO, Byte] = ???

  override def run(args: List[String]): IO[ExitCode] =
    myFunc(data).use(JavaApi.foo).as(ExitCode.Success)
}

Вот это Scast ie с работающим кодом.

...