Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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;
            }
        }