public void TossEvent(Event evt, IAlarmCache alarms) { var potKey = evt.LinkedTo; (bool completed, bool alarmExist)@case = (evt.completed, alarms.TryGetValue(potKey, out var alarm)); switch (@case) { case var x when x.completed && x.alarmExist: alarm.RemoveEvent(evt); break; case var x when x.completed && !x.alarmExist: Debug.Assert(false, $"Completed EmissionEvent that has no alarm event {evt}"); break; case var x when !x.completed && x.alarmExist: alarm.AddEvent(evt); break; case var x when !x.completed && !x.alarmExist: alarms.Add(potKey, new Alarm(evt)); break; } }
public void MergeSentAlarms(IEnumerable <Alarm.ShortView> sentAlarms, IAlarmCache alarms) { sentAlarms.ToList().ForEach(sentAlarm => { if (alarms.TryGetValue(sentAlarm.Key, out var cacheAlarm)) { var sentStates = new List <Alarm.AlarmState> { Alarm.AlarmState.AlarmSent, Alarm.AlarmState.FinishedSent }; switch (sentAlarm.State) { case Alarm.AlarmState.AlarmSent: if (cacheAlarm.State == Alarm.AlarmState.AlarmPending) { cacheAlarm.State = sentAlarm.State; } else { Debug.Assert(false, $"Alarm id:{sentAlarm.Id}, key:{sentAlarm.Key} state changed state:{sentAlarm.State} cache-state:{cacheAlarm.State}"); } break; case Alarm.AlarmState.FinishedSent: if (cacheAlarm.State == Alarm.AlarmState.FinishPending) { cacheAlarm.State = Alarm.AlarmState.Completed; } else { Debug.Assert(false, $"Alarm id:{sentAlarm.Id}, key:{sentAlarm.Key} state changed state:{sentAlarm.State} cache-state:{cacheAlarm.State}"); } break; default: //Skip not sent alarms (or process it differently) //Debug.Assert(false, $"Alarm id:{sentAlarm.Id}, key:{sentAlarm.Key} in wrong state:{sentAlarm.State}"); break; } } else { Debug.Assert(false, $"Alarm id:{sentAlarm.Id}, key:{sentAlarm.Key} not found in cache"); } }); alarms.PurgeCompletedAlarms(); }
public void ProcessEventBatch(IEnumerable <Event> events, IAlarmCache alarms) { events.ToList().ForEach(x => TossEvent(x, alarms)); }