/// <summary> /// Builds an AcyclicGraph from the included systems /// </summary> private AcyclicGraph <UTinySystem.Reference> GetSystemGraph() { var graph = new AcyclicGraph <UTinySystem.Reference>(); // Add all systems foreach (var module in EnumerateDependencies()) { foreach (var systemRef in module.Systems) { graph.Add(systemRef); } } // Connect all first level dependencies foreach (var node in graph.Nodes.ToList()) { var systemRef = node.Data; var system = systemRef.Dereference(Registry); foreach (var dependencyRef in system.ExecuteAfter) { var depedencyNode = graph.GetOrAdd(dependencyRef); graph.AddDirectedConnection(node, depedencyNode); } foreach (var dependencyRef in system.ExecuteBefore) { var depedencyNode = graph.GetOrAdd(dependencyRef); graph.AddDirectedConnection(depedencyNode, node); } } return(graph); }
public static IEnumerable <Reference> DepthFirst(IEnumerable <UTinyType> types) { var graph = new AcyclicGraph <Reference>(); // Push all types into the graph foreach (var type in types) { graph.Add((Reference)type); } // Connect types foreach (var type in types) { var typeNode = graph.GetOrAdd((Reference)type); foreach (var fieldType in EnumerateFieldTypes(type)) { var fieldTypeNode = graph.GetOrAdd(fieldType); graph.AddDirectedConnection(typeNode, fieldTypeNode); } } var result = new List <Reference>(); AcyclicGraphIterator.DepthFirst.Execute(graph, type => { result.Add(type); }); return(result); }