From fdb4a98d8b275832f414d6a335006e13f0c5f34c Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sat, 13 Nov 2010 20:02:25 -0500 Subject: [PATCH] Task.doFinally --- tasks/Result.scala | 5 +++++ tasks/standard/TaskExtra.scala | 2 ++ 2 files changed, 7 insertions(+) diff --git a/tasks/Result.scala b/tasks/Result.scala index 344810f17..99b6a2b07 100644 --- a/tasks/Result.scala +++ b/tasks/Result.scala @@ -31,4 +31,9 @@ object Result case Inc(i) => throw i } } + def tryValues[S](r: Seq[Result[Unit]], v: Result[S]): S = + { + r foreach tryValue[Unit] + tryValue[S](v) + } } \ No newline at end of file diff --git a/tasks/standard/TaskExtra.scala b/tasks/standard/TaskExtra.scala index 76f9959e4..5cff9b427 100644 --- a/tasks/standard/TaskExtra.scala +++ b/tasks/standard/TaskExtra.scala @@ -28,6 +28,7 @@ sealed trait SingleInTask[S] def mapFailure[T](f: Incomplete => T): Task[T] def dependsOn(tasks: Task[_]*): Task[S] def andFinally(fin: => Unit): Task[S] + def doFinally(t: Task[Unit]): Task[S] def || [T >: S](alt: Task[T]): Task[T] def && [T](alt: Task[T]): Task[T] @@ -224,6 +225,7 @@ trait TaskExtra def mapFailure[T](f: Incomplete => T): Task[T] = mapR(f compose failM) def andFinally(fin: => Unit): Task[S] = mapR(x => Result.tryValue[S]( { fin; x })) + def doFinally(t: Task[Unit]): Task[S] = flatMapR(x => t.mapR { tx => Result.tryValues[S](tx :: Nil, x) }) def || [T >: S](alt: Task[T]): Task[T] = flatMapR { case Value(v) => task(v); case Inc(i) => alt } def && [T](alt: Task[T]): Task[T] = flatMap( _ => alt ) }