public List <IDependencyState <T> > UnresolvedDependencies(IDependencyState <T> state)
 {
     return(state.NextDependencies
            .Where(TargetsTaken.ContainsKey)
            .SelectMany(t => TargetsTaken[t].Where(s => !s.Equals(state)))
            .Where(s => s.State == DependState.Resolving)
            .ToList());
 }
        public bool IsFrozen(IDependencyState <T> state)
        {
            var targets = TargetsTaken.Where(x => x.Value.Contains(state))
                          .Select(x => x.Key)
                          .Concat(state.NextTargets)
                          .ToList();

            var dependingStates = targets.SelectMany(x => DependanciesTaken.Where(d => d.Key.Equals(x)).SelectMany(d => d.Value).Concat(UnboundedDependancyTaken));

            return(dependingStates.Any(x => !x.Equals(state) && !IsCompleted(x)));
        }
        void ResetSet(IDependencyState <T> source, ISet <IDependencyState <T> > taken)
        {
            var toRemove = taken.Where(x => !x.Equals(source)).ToList();

            foreach (var takenState in toRemove)
            {
                taken.Remove(takenState);
                takenState.Reset();
            }
            foreach (var takenState in toRemove)
            {
                ResetDependenciesOf(takenState);
            }
        }
        // Reset anything that has taken a dependency on this state
        public void ResetDependenciesOf(IDependencyState <T> state)
        {
            var targets = TargetsTaken.Where(x => x.Value.Contains(state))
                          .Select(x => x.Key)
                          .ToList();

            // Reset bounded dependencies taken
            foreach (var dependancy in targets.Where(DependanciesTaken.ContainsKey))
            {
                ResetSet(state, DependanciesTaken[dependancy]);
            }

            // Reset unbounded dependencies taken
            ResetSet(state, UnboundedDependancyTaken);

            // clear targets
            foreach (var target in targets)
            {
                TargetsTaken[target].Remove(state);
            }
        }
 public void Update(IDependencyState <T> state)
 {
     // Manage dependencies and targets taken
     foreach (var dependancy in state.NextDependencies)
     {
         if (!DependanciesTaken.ContainsKey(dependancy))
         {
             DependanciesTaken[dependancy] = new HashSet <IDependencyState <T> >();
         }
         DependanciesTaken[dependancy].Add(state);
     }
     if (state.NextUnboundDependency)
     {
         UnboundedDependancyTaken.Add(state);
     }
     foreach (var target in state.NextTargets)
     {
         if (!TargetsTaken.ContainsKey(target))
         {
             TargetsTaken[target] = new HashSet <IDependencyState <T> >();
         }
         TargetsTaken[target].Add(state);
     }
 }
 public bool IsCompleted(IDependencyState <T> state)
 {
     return(state.State == DependState.Completed ||
            state.State == DependState.Failed);
 }