diff options
Diffstat (limited to 'src/main/scala/forge/Evaluator.scala')
-rw-r--r-- | src/main/scala/forge/Evaluator.scala | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main/scala/forge/Evaluator.scala b/src/main/scala/forge/Evaluator.scala new file mode 100644 index 00000000..137943f7 --- /dev/null +++ b/src/main/scala/forge/Evaluator.scala @@ -0,0 +1,78 @@ +package forge + +import java.nio.{file => jnio} + +import sourcecode.Enclosing + +import scala.collection.mutable + +class Evaluator(workspacePath: jnio.Path, + enclosingBase: DefCtx){ + + /** + * Takes the given targets, finds + */ + def prepareTransitiveTargets(targets: Seq[Target[_]]) = { + + val targetIndices = targets.zipWithIndex.toMap + + 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) + } + } + + targets.foreach(rec) + val transitiveTargets = transitiveTargetSet.toVector + val numberedEdges = + for(i <- transitiveTargets.indices) + yield targets(i).inputs.map(targetIndices) + + val sortedClusters = Tarjans(numberedEdges) + val nonTrivialClusters = sortedClusters.filter(_.length > 1) + assert(nonTrivialClusters.isEmpty, nonTrivialClusters) + (transitiveTargets, sortedClusters.flatten) + } + + def apply[T](t: Target[T]) + (implicit enclosing: Enclosing): T = { + jnio.Files.createDirectories(workspacePath) + + val (transitiveTargets, sortedTargetIndices) = prepareTransitiveTargets(Seq(t)) + val results = mutable.Map.empty[Target[_], Any] + for (index <- sortedTargetIndices){ + + val target = transitiveTargets(index) + val inputResults = target.inputs.map(results) + + for(enclosing <- target.defCtx.staticEnclosing){ + val targetDestPath = workspacePath.resolve( + jnio.Paths.get(enclosing.stripSuffix(enclosingBase.staticEnclosing.getOrElse(""))) + ) + deleteRec(targetDestPath) + } + + + + + + results(target) = target.evaluate( + new Args(inputResults.toIndexedSeq, targetDestPath) + ) + } + results(t).asInstanceOf[T] + } + def deleteRec(path: jnio.Path) = { + if (jnio.Files.exists(path)){ + import collection.JavaConverters._ + jnio.Files.walk(path).iterator() + .asScala + .toArray + .reverseIterator + .map(jnio.Files.deleteIfExists) + } + } +} |