private void AddPointEvents <T, P>( EventsDistribution <T, P> distribution, Event <T, P>[] pointEvents) { if (pointEvents.Length == 0) { return; } var eventsLine = new EventsLine <T, P>(true); while (true) { var @event = pointEvents[0]; eventsLine.Events.Add(@event); pointEvents = pointEvents .SkipWhile(e => e.Start - @event.Start <= _pointEventMaximumDuration) .ToArray(); if (pointEvents.Length == 0) { break; } } distribution.Lines.Add(eventsLine); }
public EventsDistribution <T, P> Distribute <T, P>(IReadOnlyList <Event <T, P> > events) { if (events is null) { throw new ArgumentNullException(nameof(events)); } var pointEvents = events .Where(e => e.Duration <= _pointEventMaximumDuration) .OrderBy(e => e.Start) .ToArray(); var intervalEvents = events .Where(e => e.Duration > _pointEventMaximumDuration) .OrderBy(e => e.Start) .ToArray(); var distribution = new EventsDistribution <T, P>(); AddPointEvents(distribution, pointEvents); AddIntervalEvents(distribution, intervalEvents); return(distribution); }
private void AddIntervalEvents <T, P>( EventsDistribution <T, P> distribution, Event <T, P>[] intervalEvents) { if (intervalEvents.Length == 0) { return; } while (true) { var(restIntervalEvents, eventsLine) = FillEventsLine(intervalEvents); distribution.Lines.Add(eventsLine); if (restIntervalEvents.Length == 0) { break; } intervalEvents = restIntervalEvents; } }