public EventTransition(FileChangedReason previousReason, FileChangedReason currentReason, FileChangedReason newReason)
 {
     PreviousReason = previousReason;
     CurrentReason = currentReason;
     NewReason = newReason;
 }
 public FileChangedEventArgs(string file, FileChangedReason reason)
 {
     File = file;
     ChangedReason = reason;
 }
 private void AddEvent(string file, FileChangedReason reason)
 {
     lock (_eventsLock)
     {
         _events.Add(new FileChangedEventArgs(file, reason));
     }
     Task.Delay(500).ContinueWith(task =>
     {
         lock (_eventsLock)
         {
             if (_events.Any())
             {
                 try
                 {
                     if (Changed != null)
                     {
                         var events = new Dictionary<string, FileChangedReason>();
                         foreach (var evt in _events)
                         {
                             FileChangedReason prevReason;
                             if (!events.TryGetValue(evt.File, out prevReason))
                             {
                                 prevReason = FileChangedReason.None;
                             }
                             var newReason = _eventTransitions
                                 .Single(t => t.PreviousReason == prevReason && t.CurrentReason == evt.ChangedReason)
                                 .NewReason;
                             events[evt.File] = newReason;
                         }
                         foreach (var evt in events.Where(x => x.Value != FileChangedReason.None))
                         {
                             Changed(this, new FileChangedEventArgs(evt.Key, evt.Value));
                         }
                     }
                 }
                 finally
                 {
                     _events.Clear();
                 }
             }
         }
     });
 }