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