diff options
Diffstat (limited to 'src/main/scala/forge/Evaluator.scala')
-rw-r--r-- | src/main/scala/forge/Evaluator.scala | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/main/scala/forge/Evaluator.scala b/src/main/scala/forge/Evaluator.scala index 1bff722b..1220f56c 100644 --- a/src/main/scala/forge/Evaluator.scala +++ b/src/main/scala/forge/Evaluator.scala @@ -17,7 +17,7 @@ class Evaluator(workspacePath: jnio.Path, val sortedTargets = Evaluator.topoSortedTransitiveTargets(targets) val evaluated = mutable.Buffer.empty[Target[_]] val results = mutable.Map.empty[Target[_], Any] - for (target <- sortedTargets){ + for (target <- sortedTargets.values){ val inputResults = target.inputs.map(results).toIndexedSeq val enclosingStr = target.defCtx.label @@ -62,11 +62,45 @@ class Evaluator(workspacePath: jnio.Path, object Evaluator{ + class TopoSorted private[Evaluator] (val values: Seq[Target[_]]) case class Results(values: Seq[Any], evaluated: Seq[Target[_]]) + def groupAroundNamedTargets(topoSortedTargets: TopoSorted): Seq[Seq[Target[_]]] = { + val grouping = new MultiBiMap[Int, Target[_]]() + + var groupCount = 0 + + for(target <- topoSortedTargets.values.reverseIterator){ + + if (!grouping.containsValue(target)){ + grouping.add(groupCount, target) + groupCount += 1 + } + + val targetGroup = grouping.lookupValue(target) + for(upstream <- target.inputs){ + grouping.lookupValueOpt(upstream) match{ + case None if upstream.dirty.isEmpty && upstream.defCtx.anonId.nonEmpty => + grouping.add(targetGroup, upstream) + case Some(upstreamGroup) if upstreamGroup == targetGroup => + val upstreamTargets = grouping.removeAll(upstreamGroup) + grouping.addAll(targetGroup, upstreamTargets) + case _ => //donothing + } + } + } + val output = mutable.Buffer.empty[Seq[Target[_]]] + for(target <- topoSortedTargets.values){ + for(targetGroup <- grouping.lookupValueOpt(target)){ + output.append(grouping.removeAll(targetGroup)) + } + } + output + } + /** * Takes the given targets, finds */ - def topoSortedTransitiveTargets(sourceTargets: Seq[Target[_]]) = { + def topoSortedTransitiveTargets(sourceTargets: Seq[Target[_]]): TopoSorted = { val transitiveTargetSet = mutable.Set.empty[Target[_]] val transitiveTargets = mutable.Buffer.empty[Target[_]] def rec(t: Target[_]): Unit = { @@ -88,6 +122,6 @@ object Evaluator{ val sortedClusters = Tarjans(numberedEdges) val nonTrivialClusters = sortedClusters.filter(_.length > 1) assert(nonTrivialClusters.isEmpty, nonTrivialClusters) - sortedClusters.flatten.map(transitiveTargets) + new TopoSorted(sortedClusters.flatten.map(transitiveTargets)) } }
\ No newline at end of file |