korolev.effect.io.FileIO.scala Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2017-2020 Aleksey Fomkin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package korolev.effect.io
import java.io.{BufferedReader, FileInputStream, FileOutputStream, FileReader}
import java.nio.file.Path
import korolev.effect.syntax._
import korolev.effect.{Effect, Stream}
object FileIO {
def readBytes[F[_]: Effect](path: Path): F[LazyBytes[F]] = {
val inputStream = new FileInputStream(path.toFile)
LazyBytes.fromInputStream(inputStream)
}
def readLines[F[_]: Effect](path: Path): F[Stream[F, String]] = {
Stream.unfoldResource[F, BufferedReader, Unit, String](
default = (),
create = Effect[F].delay(new BufferedReader(new FileReader(path.toFile))),
loop = (reader, _) => Effect[F].delay {
((), Option(reader.readLine()))
}
)
}
/**
* {{{
* lazyBytes.chunks.to(File.write(path, append = true))
* }}}
*/
def write[F[_]: Effect](path: Path, append: Boolean = false): Stream[F, Array[Byte]] => F[Unit] = { stream =>
val outputStream = new FileOutputStream(path.toFile, append)
def aux(): F[Unit] = {
stream.pull().flatMap {
case Some(chunk) => Effect[F]
.delay(outputStream.write(chunk))
.after(aux())
.recover {
case error =>
outputStream.close()
throw error
}
case None =>
Effect[F].delay(outputStream.close())
}
}
aux()
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy