Monday, November 1, 2010

scalaでDir.glob("**/*.sql")

RubyだとDir.glob("**/*.sql")で指定したディレクトリから、
再帰的に*.sqlのファイルパスを検索してくれるが、
scalaには見当たらなかったので、書いてみた。

  1. // glob **/*.sql   
  2. val globSqlFiles = glob((f: File) =>   
  3.   !f.isDirectory && f.getName.endsWith(".sql")) _  
  4.   
  5. // curried function  
  6. def glob(filter: (File) => Boolean)(dirs: List[String]): List[File] = {  
  7.   def recursive(dir: File, acc: List[File]): List[File] =   
  8.     Option(dir.listFiles) match {  
  9.       case None => throw new FileNotFoundException(dir.getAbsolutePath)  
  10.       case Some(lists) =>   
  11.         val filtered = lists.filter{ c =>  filter(c) }.toList  
  12.         val childDirs = lists.filter{ c => c.isDirectory && !c.getName.startsWith(".") }  
  13.         return ( (acc ::: filtered) /: childDirs){ (a, dir) => recursive(dir, a)}  
  14.   }  
  15.   dirs.flatMap{ d => recursive(new File(d), Nil)}  
  16. }  
  17.   
  18. // 使い方。対象ディレクトリはListで複数指定できる。  
  19. globSqlFiles(List("/tmp/sql"))  

汎用的になるようにカリー化してみた。
3、4行目の条件に正規表現を組み込めば曖昧検索できる。

S-99: Ninety-Nine Scala Problemsを頑張ってやっているせいか、
immutableなListの再帰に対してアレルギーがなくなってきた。

No comments:

Post a Comment