private static IEnumerable <KeyValuePair <string, ItemDescriptor> > SortCollection(DataKind kind, IEnumerable <KeyValuePair <string, ItemDescriptor> > input) { var dependencyKeysFn = GetDependenciesFunction(kind); if (dependencyKeysFn is null) { return(input); } IDictionary <string, ItemDescriptor> remainingItems = input.ToDictionary(kv => kv.Key, kv => kv.Value); var outputOrdering = new OutputOrdering(); while (remainingItems.Count > 0) { // pick a random item that hasn't been updated yet var entry = remainingItems.First(); AddWithDependenciesFirst(entry.Key, entry.Value, remainingItems, dependencyKeysFn, outputOrdering); } var ret = new SortedDictionary <string, ItemDescriptor>(outputOrdering); foreach (var kv in input) { ret[kv.Key] = kv.Value; } return(ret); }
private static IDictionary <string, IVersionedData> SortCollection(IVersionedDataKind kind, IDictionary <string, IVersionedData> input) { var ordering = kind as IVersionedDataOrdering; if (ordering == null) { return(input); } IDictionary <string, IVersionedData> remainingItems = new Dictionary <string, IVersionedData>(input); var outputOrdering = new OutputOrdering(); while (remainingItems.Count > 0) { // pick a random item that hasn't been updated yet foreach (var entry in remainingItems) { AddWithDependenciesFirst(entry.Value, remainingItems, ordering, outputOrdering); break; } } return(new SortedDictionary <string, IVersionedData>(input, outputOrdering)); }
private static void AddWithDependenciesFirst(string key, ItemDescriptor item, IDictionary <string, ItemDescriptor> remainingItems, Func <object, IEnumerable <string> > dependencyKeysFn, OutputOrdering output) { remainingItems.Remove(key); // we won't need to visit this item again foreach (var prereqKey in dependencyKeysFn(item.Item)) { if (remainingItems.TryGetValue(prereqKey, out var prereqItem)) { AddWithDependenciesFirst(prereqKey, prereqItem, remainingItems, dependencyKeysFn, output); } } output.Add(key); }
private static void AddWithDependenciesFirst(IVersionedData item, IDictionary <string, IVersionedData> remainingItems, IVersionedDataOrdering ordering, OutputOrdering output) { remainingItems.Remove(item.Key); // we won't need to visit this item again foreach (var prereqKey in ordering.GetDependencyKeys(item)) { if (remainingItems.TryGetValue(prereqKey, out var prereqItem)) { AddWithDependenciesFirst(prereqItem, remainingItems, ordering, output); } } output.Add(item); }