File: EnumerableExtensions.cs
Web Access
Project: src\src\Controls\src\Core\Controls.Core.csproj (Microsoft.Maui.Controls)
using System;
using System.Collections.Generic;
 
namespace Microsoft.Maui.Controls.Internals
{
	static class EnumerableExtensions
	{
		public static bool HasChildGesturesFor<T>(this IEnumerable<GestureElement>? elements, Func<T, bool>? predicate = null) where T : GestureRecognizer
		{
			if (elements is null)
			{
				return false;
			}
 
			foreach (var element in elements)
			{
				foreach (var item in element.GestureRecognizers)
				{
					if (item is T gesture && (predicate is null || predicate(gesture)))
					{
						return true;
					}
				}
			}
 
			return false;
		}
 
		public static IEnumerable<T> GetChildGesturesFor<T>(this IEnumerable<GestureElement>? elements, Func<T, bool>? predicate = null) where T : GestureRecognizer
		{
			if (elements is null)
			{
				yield break;
			}
 
			foreach (var element in elements)
			{
				foreach (var item in element.GestureRecognizers)
				{
					if (item is T gesture && (predicate is null || predicate(gesture)))
					{
						yield return gesture;
					}
				}
			}
		}
 
		/// <remarks>The method makes a defensive copy of the gestures.</remarks>
		public static IEnumerable<T> GetGesturesFor<T>(this IEnumerable<IGestureRecognizer>? gestures, Func<T, bool>? predicate = null) where T : GestureRecognizer
		{
			if (gestures is null)
			{
				yield break;
			}
 
			foreach (IGestureRecognizer item in new List<IGestureRecognizer>(gestures))
			{
				if (item is T gesture && (predicate is null || predicate(gesture)))
				{
					yield return gesture;
				}
			}
		}
 
		internal static bool HasAnyGesturesFor<T>(this IEnumerable<IGestureRecognizer>? gestures, Func<T, bool>? predicate = null) where T : GestureRecognizer
			=> FirstGestureOrDefault(gestures, predicate) is not null;
 
		internal static T? FirstGestureOrDefault<T>(this IEnumerable<IGestureRecognizer>? gestures, Func<T, bool>? predicate = null) where T : GestureRecognizer
		{
			if (gestures is null)
			{
				return null;
			}
 
			foreach (IGestureRecognizer item in gestures)
			{
				if (item is T gesture && (predicate is null || predicate(gesture)))
				{
					return gesture;
				}
			}
 
			return null;
		}
	}
}