public static IndexedItem <TSource> FirstIndexedItem <TSource>(this IEnumerable <TSource> source, Func <TSource, bool> predicate)
        {
            Assert.IsNotNull(source);
            Assert.IsNotNull(predicate);

            var firstIndex = -1;
            var firstItem  = default(TSource);

            foreach (var item in source)
            {
                ++firstIndex;
                if (predicate(item))
                {
                    firstItem = item;
                    break;
                }
            }

            return(IndexedItem.Create(firstIndex, firstItem));
        }
        public static IndexedItem <TSource> ExtremumIndexedItem <TSource>(this IEnumerable <TSource> source, Func <TSource, TSource, bool> firstArgumentIsExtremum)
        {
            Assert.IsNotNull(source);
            Assert.IsNotNull(firstArgumentIsExtremum);

            var extremumIndex = -1;
            var extremumItem  = default(TSource);
            var itemIndex     = 0;

            foreach (var item in source)
            {
                if (itemIndex == 0 || firstArgumentIsExtremum(item, extremumItem))
                {
                    extremumIndex = itemIndex;
                    extremumItem  = item;
                }

                ++itemIndex;
            }

            return(IndexedItem.Create(extremumIndex, extremumItem));
        }