Code/Extensions/EnumerableExtensions.cs
namespace Nodebox.Extensions;

public static class EnumerableExtensions {
    extension<T>(IEnumerable<T> ie) {
        public IEnumerable<(int Index, T Item)> Enumerate() {
            var max = ie.Count();
            return Enumerable.Range(0, max).Zip(ie);
        }

        public void ForEach(Action<T> action) {
            foreach (T item in ie) {
                action(item);
            }
        }

        public IEnumerable<TOut> SelectWhere<TOut>(Func<T, TOut> action) {
            return ie.SelectMany(x => {
                var result = action(x);
                return result == null ? Enumerable.Empty<TOut>() : [result];
            });
        }
    }
}