// Ignore Spelling: Linq

using System;
using System.Collections.Generic;
using System.Linq;

namespace AsbCloudInfrastructure
{
    public static class LinqExtensions
    {
        public static TProp? MaxOrDefault<TObj, TProp>(this IEnumerable<TObj> enumerable, Func<TObj, TProp> getter)
            where TProp : struct
        {
            var value = MaxByOrDefault(enumerable, getter);
            if (value is null)
                return null;
            return getter(value);
        }

        public static TObj? MaxByOrDefault<TObj, TProp>(this IEnumerable<TObj> enumerable, Func<TObj, TProp> getter)
        {
            return enumerable.OrderByDescending(getter).FirstOrDefault();
        }

        public static TProp? MinOrDefault<TObj, TProp>(this IEnumerable<TObj> enumerable, Func<TObj, TProp> getter)
            where TProp : struct
        {
            var value = MinByOrDefault(enumerable, getter);            
            if (value is null)
                return null;
            return getter(value);
        }

        public static TObj? MinByOrDefault<TObj, TProp>(this IEnumerable<TObj> enumerable, Func<TObj, TProp> getter)
        {
            return enumerable.OrderBy(getter).FirstOrDefault();
        }
    }
}