AAndrei Misiukevichfixed formatting
1fbadd6e创建于 2020年2月19日历史提交
using PanCardView.Controls;
using Xamarin.Forms;
using System.Collections;
using System.ComponentModel;

namespace PanCardView.Extensions
{
    [EditorBrowsable(EditorBrowsableState.Never)]
    public static class CardViewExtensions
    {
        public static double GetSize(this CardsView cardsView, View card = null)
            => cardsView.IsHorizontalOrientation ? (card ?? cardsView).Width : (card ?? cardsView).Height;

        public static CardsView AsCardsView(this BindableObject bindable)
            => bindable as CardsView;

        public static CarouselView AsCarouselView(this BindableObject bindable)
            => bindable as CarouselView;
            
        public static CoverFlowView AsCoverFlowView(this BindableObject bindable)
            => bindable as CoverFlowView;

        public static IndicatorsControl AsIndicatorsControl(this BindableObject bindable)
            => bindable as IndicatorsControl;

        public static CircleFrame AsCircleFrame(this BindableObject bindable)
            => bindable as CircleFrame;

        public static ArrowControl AsArrowControl(this BindableObject bindable)
            => bindable as ArrowControl;

        public static TabsControl AsTabsView(this BindableObject bindable)
            => bindable as TabsControl;

        public static View CreateView(this DataTemplate template)
        {
            var content = template.CreateContent();
            return content is ViewCell cell
                ? cell.View
                : content as View;
        }

        public static DataTemplate SelectTemplate(this DataTemplate template, object context)
        {
            while (template is DataTemplateSelector selector)
            {
                template = selector.SelectTemplate(context, null);
            }
            return template;
        }

        public static int ToCyclicalIndex(this int index, int itemsCount)
        {
            if (itemsCount <= 0)
            {
                return -1;
            }

            var reminder = index % itemsCount;
            return reminder >= 0
                ? reminder
                : reminder + itemsCount;
        }

        public static int FindIndex(this IEnumerable collection, object value)
        {
            if (collection is IList list)
            {
                return list.IndexOf(value);
            }
            var searchIndex = 0;
            foreach (var item in collection)
            {
                if (item == value)
                {
                    return searchIndex;
                }
                ++searchIndex;
            }
            return -1;
        }

        public static object FindValue(this IEnumerable collection, int index)
        {
            if (collection is IList list)
            {
                return index >= 0 && index < list.Count
                    ? list[index]
                    : null;
            }
            var searchIndex = 0;
            foreach (var item in collection)
            {
                if (searchIndex == index)
                {
                    return item;
                }
                ++searchIndex;
            }
            return null;
        }

        public static int Count(this IEnumerable collection)
        {
            if (collection is ICollection list)
            {
                return list.Count;
            }
            var searchIndex = 0;
            foreach (var item in collection)
            {
                ++searchIndex;
            }
            return searchIndex;
        }
    }
}