sbt/util/collection/Dag.scala

35 lines
719 B
Scala

/* sbt -- Simple Build Tool
* Copyright 2008, 2009, 2010 David MacIver, Mark Harrah
*/
package sbt;
trait Dag[Node <: Dag[Node]]{
self : Node =>
def dependencies : Iterable[Node]
def topologicalSort = Dag.topologicalSort(self)(_.dependencies)
}
object Dag
{
import scala.collection.{mutable, JavaConversions};
import JavaConversions.{asIterable, asSet}
def topologicalSort[T](root: T)(dependencies: T => Iterable[T]) = {
val discovered = new mutable.HashSet[T]
val finished = asSet(new java.util.LinkedHashSet[T])
def visit(dag : T){
if (!discovered(dag)) {
discovered(dag) = true;
dependencies(dag).foreach(visit);
finished += dag;
}
}
visit(root);
finished.toList;
}
}