summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/scala/forge/Evaluator.scala57
-rw-r--r--src/test/scala/forge/ForgeTests.scala2
2 files changed, 32 insertions, 27 deletions
diff --git a/src/main/scala/forge/Evaluator.scala b/src/main/scala/forge/Evaluator.scala
index d2fdcb53..fb45aa32 100644
--- a/src/main/scala/forge/Evaluator.scala
+++ b/src/main/scala/forge/Evaluator.scala
@@ -9,38 +9,13 @@ import scala.collection.mutable
class Evaluator(workspacePath: jnio.Path,
enclosingBase: DefCtx){
- /**
- * Takes the given targets, finds
- */
- def topoSortedTransitiveTargets(sourceTargets: Seq[Target[_]]) = {
- val transitiveTargetSet = mutable.Set.empty[Target[_]]
- def rec(t: Target[_]): Unit = {
- if (transitiveTargetSet.contains(t)) () // do nothing
- else {
- transitiveTargetSet.add(t)
- t.inputs.foreach(rec)
- }
- }
-
- sourceTargets.foreach(rec)
- val transitiveTargets = transitiveTargetSet.toVector
- val targetIndices = transitiveTargets.zipWithIndex.toMap
- val numberedEdges =
- for(i <- transitiveTargets.indices)
- yield transitiveTargets(i).inputs.map(targetIndices)
-
- val sortedClusters = Tarjans(numberedEdges)
- val nonTrivialClusters = sortedClusters.filter(_.length > 1)
- assert(nonTrivialClusters.isEmpty, nonTrivialClusters)
- sortedClusters.flatten.map(transitiveTargets)
- }
def apply[T](t: Target[T])
(implicit enclosing: Enclosing): T = {
jnio.Files.createDirectories(workspacePath)
- val sortedTargets = topoSortedTransitiveTargets(Seq(t))
+ val sortedTargets = Evaluator.topoSortedTransitiveTargets(Seq(t))
val results = mutable.Map.empty[Target[_], Any]
for (target <- sortedTargets){
val inputResults = target.inputs.map(results)
@@ -76,3 +51,33 @@ class Evaluator(workspacePath: jnio.Path,
}
}
}
+
+
+object Evaluator{
+ /**
+ * Takes the given targets, finds
+ */
+ def topoSortedTransitiveTargets(sourceTargets: Seq[Target[_]]) = {
+ val transitiveTargetSet = mutable.Set.empty[Target[_]]
+ def rec(t: Target[_]): Unit = {
+ if (transitiveTargetSet.contains(t)) () // do nothing
+ else {
+ transitiveTargetSet.add(t)
+ t.inputs.foreach(rec)
+ }
+ }
+
+ sourceTargets.foreach(rec)
+ val transitiveTargets = transitiveTargetSet.toVector
+ val targetIndices = transitiveTargets.zipWithIndex.toMap
+
+ val numberedEdges =
+ for(i <- transitiveTargets.indices)
+ yield transitiveTargets(i).inputs.map(targetIndices)
+
+ val sortedClusters = Tarjans(numberedEdges)
+ val nonTrivialClusters = sortedClusters.filter(_.length > 1)
+ assert(nonTrivialClusters.isEmpty, nonTrivialClusters)
+ sortedClusters.flatten.map(transitiveTargets)
+ }
+} \ No newline at end of file
diff --git a/src/test/scala/forge/ForgeTests.scala b/src/test/scala/forge/ForgeTests.scala
index b6e003f3..8da52958 100644
--- a/src/test/scala/forge/ForgeTests.scala
+++ b/src/test/scala/forge/ForgeTests.scala
@@ -28,7 +28,7 @@ object ForgeTests extends TestSuite{
'topoSortedTransitiveTargets - {
def check(targets: Seq[Target[_]], expected: Seq[Target[_]]) = {
- val result = evaluator.topoSortedTransitiveTargets(targets)
+ val result = Evaluator.topoSortedTransitiveTargets(targets)
assert(result == expected)
}
'singleton - check(