diff --git a/tasks/standard/TaskMap.scala b/tasks/standard/TaskMap.scala new file mode 100644 index 000000000..a4177d5d9 --- /dev/null +++ b/tasks/standard/TaskMap.scala @@ -0,0 +1,20 @@ +/* sbt -- Simple Build Tool + * Copyright 2010 Mark Harrah + */ +package sbt + + import std._ + import TaskExtra._ + import collection.mutable + +object TaskMap +{ + /** Memoizes a function that produces a Task. */ + def apply[A,B](f: A => Task[B]): A => Task[B] = + { + val map = new mutable.HashMap[A,Task[B]] + a => map.synchronized { map.getOrElseUpdate(a, f(a)) } + } + /** Lifts `f` to produce a Task and memoizes the lifted function. */ + def make[A,B](f: A => B): A => Task[B] = apply( a => task(f(a)) ) +} \ No newline at end of file