再帰的に*.sqlのファイルパスを検索してくれるが、
scalaには見当たらなかったので、書いてみた。
// glob **/*.sql
val globSqlFiles = glob((f: File) =>
!f.isDirectory && f.getName.endsWith(".sql")) _
// curried function
def glob(filter: (File) => Boolean)(dirs: List[String]): List[File] = {
def recursive(dir: File, acc: List[File]): List[File] =
Option(dir.listFiles) match {
case None => throw new FileNotFoundException(dir.getAbsolutePath)
case Some(lists) =>
val filtered = lists.filter{ c => filter(c) }.toList
val childDirs = lists.filter{ c => c.isDirectory && !c.getName.startsWith(".") }
return ( (acc ::: filtered) /: childDirs){ (a, dir) => recursive(dir, a)}
}
dirs.flatMap{ d => recursive(new File(d), Nil)}
}
// 使い方。対象ディレクトリはListで複数指定できる。
globSqlFiles(List("/tmp/sql"))
汎用的になるようにカリー化してみた。
3、4行目の条件に正規表現を組み込めば曖昧検索できる。
S-99: Ninety-Nine Scala Problemsを頑張ってやっているせいか、
immutableなListの再帰に対してアレルギーがなくなってきた。
No comments:
Post a Comment