using System; using System.Collections.Generic; using System.Linq; using JD.Kernel.StaticHelpers; namespace JD.Collections.Utilities { public abstract class GraphWalker { #region Methods protected abstract IEnumerable GetDependenciesOf(T item); public bool CanReach(T source, T target) { Throw.IfNull(source, "source"); Throw.IfNull(target, "target"); Set reachable = new Set(); Predicate isTarget = targetToTest => Equals(target, targetToTest); return CanReach(source, isTarget, reachable); } public bool CanReach(T source, Predicate target) { Throw.IfNull(source, "source"); Throw.IfNull(target, "target"); Set reachable = new Set(); return CanReach(source, target, reachable); } private bool CanReach(T source, Predicate isTarget, Set reachable) { if (isTarget(source)) { return true; } if (reachable.Add(source)) { return GetDependenciesOf(source).Any(dependency => CanReach(dependency, isTarget, reachable)); } return false; } /// /// True if the source can reach the target in one step. /// public bool IsAdjacent(T source, Predicate isTrarget) { // It could have used a Func directly but I prefer the predicate (they are more explicit). return GetDependenciesOf(source).Any(dependency => isTrarget(dependency)); } #endregion } }