Scala ARM的な自動リソース管理(超簡易版)

自動リソース管理(というかclose管理)を使いたいけど、Scala ARMライブラリを導入するほどのもんでもないなー、というときに自作するためのメモ。

// ラッパクラスと関数の定義
class ManagedResource[T <: {def close(): Unit}](resource: T) {
  def foreach[U](f: T => U) {
    try {
      f(resource)
    } finally {
      resource.close
    }
  }
}
def managed[T <: {def close(): Unit}](resource: T) = new ManagedResource(resource)

// 使用例
    for (
      rd  <- managed(new LineNumberReader(new FileReader(inFileName)));
      wri <- managed(new PrintWriter(new FileWriter(outFileName)))
    ) {
      def read(l: List[String]=Nil): List[String] = {
        Option(rd.readLine) match {
          case Some(s): read(s::l)
          case None: l.reverse
        }
      }
      val inList = read()
      val outList = hogehoge(inList) // 諸々処理

      for(s <= outList) wri.println(s)
      
    } // スコープから抜けるとrd, wriはクローズされる
  }