diff options
-rw-r--r-- | src/main/scala/forge/Evaluator.scala | 57 | ||||
-rw-r--r-- | src/test/scala/forge/ForgeTests.scala | 2 |
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( |