// 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();
    }
}