namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter17.Listing17_09
{
    using System;

    // ----

    interface IPair<T>
    {
        T First { get; }
        T Second { get; }
        T this[PairItem index] { get; }

    }

    // ----

    public enum PairItem
    {
        First,
        Second
    }

    // ----

    public struct Pair<T> : IPair<T>
    {
        public Pair(T first, T second)
        {
            First = first;
            Second = second;
        }

        public T First { get; } // Automatycznie generowana właściwość z samym getterem (z wersji C# 6.0). 
        public T Second { get; } // Automatycznie generowana właściwość z samym getterem (z wersji C# 6.0).

        public T this[PairItem index]
        {
            get
            {
                switch(index)
                {
                    case PairItem.First:
                        return First;
                    case PairItem.Second:
                        return Second;
                    default:
                        throw new NotImplementedException(
                                 $"Wyliczenie nie zawiera wartości { index.ToString() }.");

                }
            }

            /*  
            // Aby stosować się do zasady, że struktury powinny być przeznaczone
            // tylko do odczytu, setter umieszczono w komentarzu.

            set
            {
                switch(index)
                {
                    case PairItem.First:
                        First = value;
                        break;
                    case PairItem.Second:
                        Second = value;
                        break;
                    default:
                        throw new NotImplementedException(
                            string.Format(
                            "Wyliczenie {0} nie zostało zaimplementowane",
                            index.ToString()));
                }
            }
            */
        }
    }
}
