public bool VisitFrom(IEnumerable <PackageDependency> dependencies, PackageVisitor visitor) { var nodes = (dependencies ?? Leafs()).Where(x => _byName.ContainsKey(x.Name)).ToList(); var expectedVisits = GetExpectedVisitCounts(nodes).ToDictionary(x => x.Key, x => x.Value.Count); return(nodes.All(package => _byName.ContainsKey(package.Name) && VisitDependencyNode(null, package, _byName[package.Name], visitor, expectedVisits))); }
bool VisitDependencyNode(IPackageInfo from, PackageDependency dependency, IPackageInfo to, PackageVisitor visitor, Dictionary<string,int> visitsLeft) { if (!visitor(from, dependency, to)) return false; if (DecreaseVisitCount(visitsLeft, to.Name) <= 0) { foreach (var dependencyNode in to.Dependencies) if (!VisitDependencyNode(to, dependencyNode, _byName[dependencyNode.Name], visitor, visitsLeft)) return false; } return true; }
public bool VisitFromLeafs(PackageVisitor visitor, IEnumerable<PackageDependency> dependencies = null) { var byDependents = new Dictionary<string, List<string>>(); var nodes = (dependencies ?? Leafs()).ToList(); nodes.ForEach(x => VisitDependencyNode(null, x, _byName[x.Name], (from, dep, to) => { if (from == null) return true; List<string> dependents; if (!byDependents.TryGetValue(to.Name, out dependents)) byDependents[to.Name] = dependents = new List<string>(); if (!dependents.Contains(from.Name)) dependents.Add(from.Name); return true; }, new Dictionary<string, int>())); var expectedVisits = byDependents.ToDictionary(x => x.Key, x => x.Value.Count); foreach (var package in nodes) if (!VisitDependencyNode(null, package, _byName[package.Name], visitor, expectedVisits)) return false; return true; }
public bool VisitFrom(PackageVisitor visitor) { return(VisitFrom(null, visitor)); }
bool VisitDependencyNode(IPackageInfo from, PackageDependency dependency, IPackageInfo to, PackageVisitor visitor, Dictionary <string, int> visitsLeft) { var visitResult = visitor(from, dependency, to); return(visitResult && (DecreaseVisitCount(visitsLeft, to.Name) != 0 || to.Dependencies.All(dependencyNode => !_byName.ContainsKey(dependencyNode.Name) || VisitDependencyNode(to, dependencyNode, _byName[dependencyNode.Name], visitor, visitsLeft)))); }