Iceshrimp.NET/Iceshrimp.Backend/Core/Extensions/EnumerableExtensions.cs
Kopper 8c1a635027
[backend/federation] Refactor collection iteration
Collection iteration is extracted into a seprate IAsyncEnumerable from
the currently only place where it happens. This is in preparation for
handling paginated collections.
2024-09-15 01:47:40 +02:00

61 lines
No EOL
1.6 KiB
C#

namespace Iceshrimp.Backend.Core.Extensions;
public static class EnumerableExtensions
{
public static async Task<IEnumerable<T>> AwaitAllAsync<T>(this IEnumerable<Task<T>> tasks)
{
return await Task.WhenAll(tasks);
}
public static async Task AwaitAllAsync(this IEnumerable<Task> tasks)
{
await Task.WhenAll(tasks);
}
public static async Task<List<T>> AwaitAllNoConcurrencyAsync<T>(this IEnumerable<Task<T>> tasks)
{
var results = new List<T>();
foreach (var task in tasks)
results.Add(await task);
return results;
}
public static async Task<List<T>> AwaitAllNoConcurrencyAsync<T>(this IAsyncEnumerable<Task<T>> tasks)
{
var results = new List<T>();
await foreach (var task in tasks)
results.Add(await task);
return results;
}
public static async Task AwaitAllNoConcurrencyAsync(this IEnumerable<Task> tasks)
{
foreach (var task in tasks) await task;
}
public static bool IsDisjoint<T>(this IEnumerable<T> x, IEnumerable<T> y)
{
return x.All(item => !y.Contains(item));
}
public static bool Intersects<T>(this IEnumerable<T> x, IEnumerable<T> y)
{
return x.Any(y.Contains);
}
public static bool IsEquivalent<T>(this IEnumerable<T> x, IEnumerable<T> y)
{
var xArray = x as T[] ?? x.ToArray();
var yArray = y as T[] ?? y.ToArray();
return xArray.Length == yArray.Length && xArray.All(yArray.Contains);
}
public static IEnumerable<T> NotNull<T>(this IEnumerable<T?> @enum) => @enum.OfType<T>();
public static IEnumerable<T> StructNotNull<T>(this IEnumerable<T?> @enum) where T : struct =>
@enum.Where(p => p.HasValue).Select(p => p!.Value);
}