Task.doFinally

This commit is contained in:
Mark Harrah 2010-11-13 20:02:25 -05:00
parent 171cbeb9ce
commit fdb4a98d8b
2 changed files with 7 additions and 0 deletions

View File

@ -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)
}
}

View File

@ -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 )
}