From 10d48fd3fa36af909042ac75ef966eec6239b63e Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Thu, 10 Feb 2011 08:14:51 -0500 Subject: [PATCH] add multi-directory versions of rebase and relativeTo --- util/io/PathMapper.scala | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/util/io/PathMapper.scala b/util/io/PathMapper.scala index b4a8b20d1..1efe3557c 100644 --- a/util/io/PathMapper.scala +++ b/util/io/PathMapper.scala @@ -12,6 +12,8 @@ trait Mapper val basic: PathMap = f => Some(f.getPath) def relativeTo(base: File): PathMap = IO.relativize(base, _) + def relativeTo(bases: Iterable[File], zero: PathMap = transparent): PathMap = fold(zero, bases)(relativeTo) + def rebase(oldBase: File, newBase0: String): PathMap = { val newBase = normalizeBase(newBase0) @@ -28,12 +30,15 @@ trait Mapper val newBase = normalizeBase(newBase0) f => Some(newBase + f.getName) } - def some[A,B](f: A => B): A => Some[B] = x => Some(f(x)) + def total[A,B](f: A => B): A => Some[B] = x => Some(f(x)) + def transparent: Any => Option[Nothing] = _ => None def normalizeBase(base: String) = if(!base.isEmpty && !base.endsWith("/")) base + "/" else base def abs: FileMap = f => Some(f.getAbsoluteFile) def resolve(newDirectory: File): FileMap = file => Some(new File(newDirectory, file.getPath)) + def rebase(oldBases: Iterable[File], newBase: File, zero: FileMap = transparent): FileMap = + fold(fail: FileMap, oldBases)(old => rebase(old, newBase)) def rebase(oldBase: File, newBase: File): FileMap = file => if(file == oldBase) @@ -42,6 +47,10 @@ trait Mapper IO.relativize(oldBase, file) map { r => new File(newBase, r) } def flat(newDirectory: File): FileMap = file => Some(new File(newDirectory, file.getName)) + + import Alternatives._ + private[this] def fold[A,B,T](zero: A => Option[B], in: Iterable[T])(f: T => A => Option[B]): A => Option[B] = + (zero /: in)( (mapper, base) => f(base) | mapper ) } trait Alternative[A,B] { def | (g: A => Option[B]): A => Option[B] } @@ -57,4 +66,5 @@ trait Alternatives case Seq(f, fs @ _*) => f | alternatives(fs) case Seq() => a => None } -} \ No newline at end of file +} +object Alternatives extends Alternatives \ No newline at end of file