void UpdateCachedContent() { var messagingEvents = new Dictionary <A.Node, IEnumerable <M.Event> >(); var eventToLogSource = new Dictionary <M.Event, ILogSource>(); var nodeInfos = new Dictionary <A.Node, Node>(); var sourceNames = logSourceNamesProvider.GetSourcesSequenceDiagramNames( outputs.Select(output => output.LogSource), outputs.Select(output => new { LogSource = output.LogSource, SuggestedRoleInstanceName = output.Events .OfType <M.MetadataEvent>() .Where(e => e.Key == M.MetadataKeys.RoleInstanceName) .Select(e => e.Value) .FirstOrDefault(), SuggestedRoleName = output.Events .OfType <M.MetadataEvent>() .Where(e => e.Key == M.MetadataKeys.RoleName) .Select(e => e.Value) .FirstOrDefault() }) .Where(x => x.SuggestedRoleInstanceName != null) .ToDictionary(x => x.LogSource, x => new LogSourceNames() { RoleInstanceName = shortNames.ResolveShortNamesMurkup(x.SuggestedRoleInstanceName), RoleName = x.SuggestedRoleName }) ); var groups = outputs .GroupBy(output => output.RotatedLogPartToken, new PartsOfSameLogEqualityComparer()) .Select(group => new RotatedLogGroup(group, sourceNames)) .ToArray(); Func <A.Message, Message> makeMessageInfo = msg => { var node = nodeInfos[msg.Node]; return(new Message() { Event = msg.Event, Direction = msg.Direction, LogSource = eventToLogSource[msg.Event], Node = node, Timestamp = node.TimeOffsets.Get(msg.Timestamp) }); }; foreach (var group in groups) { messagingEvents.Add(group.AnalysisNode, group.Outputs.SelectMany(x => x.Events)); nodeInfos.Add(group.AnalysisNode, group.Node); foreach (var output in group.Outputs) { foreach (var e in output.Events) { eventToLogSource[e] = output.LogSource; } } } A.IInternodeMessagesDetector internodeMessagesDetector = new A.InternodeMessagesDetector(); var detectedUnpairedMessages = new List <A.Message>(); var detectedInternodeMessages = internodeMessagesDetector.DiscoverInternodeMessages( messagingEvents, int.MaxValue, detectedUnpairedMessages); internodeMessages = ImmutableArray.CreateRange(detectedInternodeMessages.Select(m => new InternodeMessage() { IncomingMessage = makeMessageInfo(m.IncomingMessage), OutgoingMessage = makeMessageInfo(m.OutgoingMessage), OutgoingMessageId = m.OutgoingMessage.Key.MessageId, OutgoingMessageType = m.OutgoingMessage.Key.Type })); unpairedMessages = ImmutableArray.CreateRange(detectedUnpairedMessages.Select(makeMessageInfo)); timelineComments = ImmutableArray.CreateRange( from g in groups from output in g.Outputs from commentEvt in output.TimelineComments let commentTime = (commentEvt.Trigger as ITriggerTime)?.Timestamp where commentTime != null select new TimelineComment() { Event = commentEvt, Node = g.Node, Timestamp = g.Node.TimeOffsets.Get(commentTime.Value), LogSource = output.LogSource } ); stateComments = ImmutableArray.CreateRange( from g in groups from output in g.Outputs from commentEvt in output.StateComments let commentTime = (commentEvt.Trigger as ITriggerTime)?.Timestamp where commentTime != null select new StateComment() { Event = commentEvt, Node = g.Node, Timestamp = g.Node.TimeOffsets.Get(commentTime.Value), LogSource = output.LogSource } ); metadataEntries = ImmutableArray.CreateRange( from g in groups from output in g.Outputs from metaEvent in output.Events.OfType <M.MetadataEvent>() select new MetadataEntry() { Event = metaEvent, Node = g.Node, LogSource = output.LogSource } ); changeNotification.Post(); }
public ImmutableHashSet<Point> CheckFilledLines(ImmutableHashSet<Point> gameField, int width, out int bonusPoints) { var fallingHeight = 0; gameField = gameField .GroupBy(c => c.AbsY) .OrderByDescending(g => g.Key) .SelectMany(g => { if (g.Count() != width) return g.Select(x => x.Move(0, fallingHeight)); fallingHeight++; return Enumerable.Empty<Point>(); }) .ToImmutableHashSet(); bonusPoints = fallingHeight; return gameField; }