private void Process(long timestamp)
        {
            while (true)
            {
                if (!this.toDelete.TryGetFirst(out long currentTime, out List <TPayload> queue))
                {
                    break;
                }

                if (currentTime < timestamp)
                {
                    foreach (var item in queue)
                    {
                        this.currentVersion.Add(ChangeListEvent.CreateDeletion(item));
                    }

                    this.toDelete.Remove(currentTime);
                }
                else
                {
                    break;
                }
            }

            if (timestamp > this.currentTimestamp)
            {
                this.currentTimestamp = timestamp;
                if (this.currentVersion.Count > 0)
                {
                    this.observer.OnNext(this.currentVersion);
                    this.currentVersion = new List <ChangeListEvent <TPayload> >();
                }
            }
        }
        public override void OnNext(StreamMessage <Empty, TPayload> batch)
        {
            var col_bv     = batch.bitvector.col;
            var col_vsync  = batch.vsync.col;
            var col_vother = batch.vother.col;

            for (int i = 0; i < batch.Count; i++)
            {
                var currentSync = col_vsync[i];
                Process(currentSync);

                if ((col_bv[i >> 6] & (1L << (i & 0x3f))) != 0)
                {
                    continue;
                }
                if (col_vother[i] == StreamEvent.InfinitySyncTime)
                {
                    // Start edge: create an insertion event
                    this.currentVersion.Add(ChangeListEvent.CreateInsertion(batch[i]));
                }
                else if (currentSync < col_vother[i])
                {
                    // Interval: create an insertion event now, and a deletion later when time progresses
                    this.currentVersion.Add(ChangeListEvent.CreateInsertion(batch[i]));
                    EnqueueDelete(col_vother[i], batch[i]);
                }
                else
                {
                    // End edge: create a deletion event
                    this.currentVersion.Add(ChangeListEvent.CreateDeletion(batch[i]));
                }
            }

            batch.Free();
        }