From 9d6a4f70f7104e32df8163fbe76caba74773920b Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Wed, 24 Nov 2010 14:09:02 -0500 Subject: [PATCH] additional utility methods --- util/io/IO.scala | 11 ++++++++++- util/io/PathMapper.scala | 8 +++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/util/io/IO.scala b/util/io/IO.scala index 6b6350237..07537d92a 100644 --- a/util/io/IO.scala +++ b/util/io/IO.scala @@ -13,7 +13,7 @@ import java.util.Properties import java.util.jar.{Attributes, JarEntry, JarFile, JarInputStream, JarOutputStream, Manifest} import java.util.zip.{CRC32, GZIPOutputStream, ZipEntry, ZipFile, ZipInputStream, ZipOutputStream} import scala.collection.immutable.TreeSet -import scala.collection.mutable.HashSet +import scala.collection.mutable.{HashMap,HashSet} import scala.reflect.{Manifest => SManifest} import Function.tupled @@ -244,6 +244,15 @@ object IO private[sbt] def jars(dir: File): Iterable[File] = listFiles(dir, GlobFilter("*.jar")) + def deleteIfEmpty(dirs: collection.Set[File]): Unit = + { + val isEmpty = new HashMap[File, Boolean] + def visit(f: File): Boolean = isEmpty.getOrElseUpdate(f, dirs(f) && f.isDirectory && (f.listFiles forall visit) ) + + dirs foreach visit + for( (f, true) <- isEmpty) f.delete + } + def delete(files: Iterable[File]): Unit = files.foreach(delete) def delete(file: File) { diff --git a/util/io/PathMapper.scala b/util/io/PathMapper.scala index fd0327225..b4a8b20d1 100644 --- a/util/io/PathMapper.scala +++ b/util/io/PathMapper.scala @@ -3,7 +3,7 @@ */ package sbt -import java.io.File + import java.io.File trait Mapper { @@ -51,4 +51,10 @@ trait Alternatives new Alternative[A,B] { def | (g: A => Option[B]) = (a: A) => f(a) orElse g(a) } + final def alternatives[A,B](alts: Seq[A => Option[B]]): A => Option[B] = + alts match + { + case Seq(f, fs @ _*) => f | alternatives(fs) + case Seq() => a => None + } } \ No newline at end of file