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);
 }