All Downloads are FREE. Search and download functionalities are using the official Maven repository.

korolev.effect.io.JavaIO.scala Maven / Gradle / Ivy

package korolev.effect.io

import korolev.data.BytesLike
import korolev.effect.{Effect, Stream}

import java.io.InputStream
import scala.annotation.tailrec

object JavaIO {

  def fromInputStream[F[_] : Effect, B: BytesLike](inputStream: InputStream, chunkSize: Int = 8192 * 2): F[Stream[F, B]] = {
    @tailrec
    def readStream(chunk: Array[Byte], offset: Int, len: Int): (Unit, Option[B]) = {
      val read = inputStream.read(chunk, offset, len)
      if (read == len) {
        ((), Some(BytesLike[B].wrapArray(chunk)))
      } else {
        readStream(chunk, offset + read, len - read)
      }
    }

    Stream.unfoldResource[F, InputStream, Unit, B](
      default = (),
      create = Effect[F].pure(inputStream),
      loop = (inputStream, _) => Effect[F].delay {
        if (inputStream.available() > 0) {
          val len = Math.min(inputStream.available(), chunkSize)
          val chunk = new Array[Byte](len)
          readStream(chunk, 0, len)
        } else {
          ((), None)
        }
      }
    )
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy