少し寒くても晴れてる方が良いよね。でもScalaも良いね
いい加減ファイル書き込みは飽きたので、読み込みを作ってみた
なんか無駄なことしたくなったので・・・
無駄にStream使ってその場で読み込ませてみたり、使えば良いのに意味もなくクラス使わなかったり・・・
作りたいイメージはあるのにコンパイラが言うこと聞いてくれないパターンがあるので言語を使う上ではもうちょっとかな
でも、わりとイメージしてるものになってるので良い傾向だと思う今日この頃
test("vfs read test 01") {
val (toStream,close) = textFileReaderOpen(testFileName)
val stream = toStream()
stream.take(5).foreach(println)
close()
}
def textFileReaderOpen(testFileName:String) : (()=>Stream[String],()=>Unit) = {
def toEither[U,R](arg: Either[Throwable, U] )( p : (U) => R) : Either[Throwable, R] = {
eith(arg)(catching(classOf[IOException]) either p(_))
}
def eith[U,R](arg: Either[Throwable, U] )( f : (U) => R) : R = {
arg match {
case Left(e) => throw e
case Right(o) => f(o)
}
}
val file = catching(classOf[IOException]) either fsManager.resolveFile(testFileName)
val content = toEither(file)(_.getContent())
val is = toEither(content)(_.getInputStream())
val isr = toEither(is)(new InputStreamReader(_))
val br = toEither(isr)(new BufferedReader(_))
def readLine() : String = {
eith(br)({ br => {
val l = br.readLine()
l
}})
}
def toStream() : Stream[String] = {
def toStr(current:Option[String]) : Stream[String] = {
current match {
case None => Stream.Empty
case Some(s) => Stream.cons(s,toStr(Some(readLine())))
}
}
toStr(Some(readLine()))
}
def close() : Unit ={
def close(clo: Either[Throwable, { def close(): Unit }]): Unit = {
eith(clo)(_.close)
}
close(br)
close(isr)
close(is)
close(content)
close(file)
}
(toStream,close)
}