public PageControlInfo CalculateAtPageIndex(int pageIndex)
        {
            if (pageIndex < 1 || TotalPageCount == 0)
            {
                return(PageControlInfo.NewEmptyResult());
            }

            return(pageIndex > TotalPageCount
                    ? GetResultFrom(TotalPageCount)
                    : GetResultFrom(pageIndex));
        }
        public static void SequenceCanonicalControls(this PageControlInfo controlInfo,
                                                     Action <int?> onPrevious,
                                                     Action onGap,
                                                     Action <int, bool> onOrdinal,
                                                     Action <int?> onNext)
        {
            var controlIndexMap  = controlInfo.ControlIndexMap;
            var centralWindow    = controlInfo.SequentialIndexWindow;
            var currentPageIndex = controlInfo.CurrentPageIndex;

            onPrevious(controlIndexMap.Previous != default(int) ? (int?)controlIndexMap.Previous : null);

            if (controlInfo.FirstIndexIsOutsideWindow)
            {
                onOrdinal(1, false);
            }

            var leftGapSize = controlInfo.WindowLeftGapSize;

            if (leftGapSize == 2)
            {
                onOrdinal(2, false);
            }
            else if (leftGapSize > 2)
            {
                onGap();
            }

            foreach (var index in centralWindow)
            {
                onOrdinal(index, index == currentPageIndex);
            }

            var rightGapSize = controlInfo.WindowRightGapSize;

            if (rightGapSize > 2)
            {
                onGap();
            }
            else if (rightGapSize == 2)
            {
                var index = controlIndexMap.Last - 1;
                onOrdinal(index, false);
            }

            if (controlInfo.LastIndexIsOutsideWindow)
            {
                onOrdinal(controlIndexMap.Last, false);
            }

            onNext(controlIndexMap.Next != default(int) ? (int?)controlIndexMap.Next : null);
        }
        private RenderedNavigationInfo RenderControls(PageControlInfo controlInfo)
        {
            if (controlInfo.ItemRange.TotalItemCount == 0)
            {
                return(new RenderedNavigationInfo("", controlInfo.ItemRange, controlInfo.TotalPageCount));
            }

            var builder = new StringBuilder();

            controlInfo.SequenceCanonicalControls(index => builder.Append(_selector.RenderPreviousControl(index)),
                                                  () => builder.Append(_selector.RenderGapMarker()),
                                                  (index, isSelected) => builder.Append(_selector.RenderOrdinalControl(index, isSelected)),
                                                  index => builder.Append(_selector.RenderNextControl(index)));

            var result = new RenderedNavigationInfo(builder.ToString(), controlInfo.ItemRange, _calculator.TotalPageCount);

            return(result);
        }