public void CumulativeMax(PrimitiveColumnContainer <DateTime> column)
        {
            var ret = column.Buffers[0].ReadOnlySpan[0];

            for (int b = 0; b < column.Buffers.Count; b++)
            {
                var buffer        = column.Buffers[b];
                var mutableBuffer = DataFrameBuffer <DateTime> .GetMutableBuffer(buffer);

                var mutableSpan  = mutableBuffer.Span;
                var readOnlySpan = buffer.ReadOnlySpan;
                for (int i = 0; i < readOnlySpan.Length; i++)
                {
                    var val = readOnlySpan[i];

                    if (val > ret)
                    {
                        ret = val;
                    }

                    mutableSpan[i] = ret;
                }
                column.Buffers[b] = mutableBuffer;
            }
        }
        public void CumulativeMax(PrimitiveColumnContainer <DateTime> column, IEnumerable <long> rows)
        {
            var ret           = default(DateTime);
            var mutableBuffer = DataFrameBuffer <DateTime> .GetMutableBuffer(column.Buffers[0]);

            var  span        = mutableBuffer.Span;
            long minRange    = 0;
            long maxRange    = ReadOnlyDataFrameBuffer <DateTime> .MaxCapacity;
            long maxCapacity = maxRange;
            IEnumerator <long> enumerator = rows.GetEnumerator();

            if (enumerator.MoveNext())
            {
                long row = enumerator.Current;
                if (row < minRange || row >= maxRange)
                {
                    int bufferIndex = (int)(row / maxCapacity);
                    mutableBuffer = DataFrameBuffer <DateTime> .GetMutableBuffer(column.Buffers[bufferIndex]);

                    span     = mutableBuffer.Span;
                    minRange = checked (bufferIndex * maxCapacity);
                    maxRange = checked ((bufferIndex + 1) * maxCapacity);
                }
                row -= minRange;
                ret  = span[(int)row];
            }

            while (enumerator.MoveNext())
            {
                long row = enumerator.Current;
                if (row < minRange || row >= maxRange)
                {
                    int bufferIndex = (int)(row / maxCapacity);
                    mutableBuffer = DataFrameBuffer <DateTime> .GetMutableBuffer(column.Buffers[bufferIndex]);

                    span     = mutableBuffer.Span;
                    minRange = checked (bufferIndex * maxCapacity);
                    maxRange = checked ((bufferIndex + 1) * maxCapacity);
                }
                row -= minRange;

                var val = span[(int)row];

                if (val > ret)
                {
                    ret = val;
                }

                span[(int)row] = ret;
            }
        }