public static VideoChunk First(VideoEvent @event)
        {
            if (@event.Type != VideoEventType.Add)
            {
                throw new InvalidOperationException($"Unexpected video event type '{@event.Type}'.");
            }

            return(new VideoChunk
            {
                Segments = new[] { @event.Segment },
                StartTimestamp = @event.Timestamp,
            });
        }
        public VideoChunk Next(VideoEvent @event)
        {
            StopTimestamp = @event.Timestamp;

            switch (@event.Type)
            {
            case VideoEventType.Add:
                return(new VideoChunk
                {
                    Segments = Segments.Concat(new[] { @event.Segment }).ToArray(),
                    StartTimestamp = @event.Timestamp
                });

            case VideoEventType.Remove:
                var segments = Segments.Where(x => x != @event.LastSegment).ToArray();
                if (segments.Length == 0)
                {
                    return(null);
                }
                return(new VideoChunk
                {
                    Segments = segments,
                    StartTimestamp = @event.Timestamp
                });

            case VideoEventType.Update:
                return(new VideoChunk
                {
                    Segments = Segments.Where(x => x != @event.LastSegment).Concat(new[] { @event.Segment }).ToArray(),
                    StartTimestamp = @event.Timestamp
                });

            default:
                throw new InvalidOperationException($"Unexpected video event type '{@event.Type}'.");
            }
        }