/* sbt -- Simple Build Tool
 * Copyright 2008 David MacIver
 */
package sbt;

import scala.collection._;

trait trait Dag[Node <: sbt.Dag[Node]] extends java.lang.Object with ScalaObjectDag[>: Nothing <: sbt.Dag[Node]Node <: Dag[Node]]{
	self : Node =>

	def => Iterable[Node]dependencies : Iterable[Node]Iterable[Node]

	def => List[Node]topologicalSort = {
		val scala.collection.mutable.HashSet[Node]discovered = scala.collection.mutable.HashSet[Node]new mutable.scala.collection.mutable.HashSet[Node]HashSet[Node];
		val scala.collection.jcl.LinkedHashSet[Node]finished = ()scala.collection.jcl.LinkedHashSet[Node]new jcl.scala.collection.jcl.LinkedHashSet[Node]LinkedHashSet[Node];

		def (Node)Unitvisit(Nodedag : NodeNode){
			Unitif (=> Boolean!(Node)Booleandiscovered(Nodedag)) {
				scala.collection.mutable.HashSet[Node]discovered(Nodedag) = Boolean(true)true; 
				Nodedag.=> Iterable[Node]dependencies.((Node) => Unit)Unitforeach((Node)Unitvisit);
				scala.collection.jcl.LinkedHashSet[Node]finished(Nodedag) = Boolean(true)true; 
			}
		}

		(Node)Unitvisit(Nodeself);
	
		scala.collection.jcl.LinkedHashSet[Node]finished.=> List[Node]toList;
	}
}