Utility/EnumerableExtensions.cs
namespace Marker3d.Utility.Extensions;

public static class EnumerableExtensions {
    public static void ForEach<T>(this IEnumerable<T> self, Action<T> action) {
        foreach (T item in self) action(item);
    }

    public static IEnumerable<TResult> SelectWhere<TSource, TResult>(this IEnumerable<TSource> self, Func<TSource, TResult?> action) where TResult : struct {
        return self.SelectMany(x => {
            var result = action(x);
            return result == null ? Enumerable.Empty<TResult>() : [result.Value];
        });
    }

    public static int HashCombine<T>(this IEnumerable<T> self) {
        var result = 0;

        foreach (var el in self) {
            result = HashCode.Combine(result, el);
        }

        return result;
    }
}