using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace BS.Shared.Extensions
{
	public static class ICollectionExtensions
	{
		public static void AddIfNotIn<T>(this ICollection<T> pCollection, T pToAdd)
		{
			if (!pCollection.Contains(pToAdd))
			{
				pCollection.Add(pToAdd);
			}
		}

		public static void AddRange<T>(this ICollection<T> pCollection, IEnumerable<T> pToAdd)
		{
			foreach (var iItem in pToAdd)
			{
				pCollection.Add(iItem);
			}
		}

		public static bool Exists<T>(this IEnumerable<T> pCollection, Predicate<T> pMatch)
		{
			return pCollection.Any(iItem => pMatch(iItem));
		}

		public static void RemoveRange<T>(this ICollection<T> pList, IEnumerable<T> pToRemove)
		{
			foreach (T iItem in pToRemove.ToList())
			{
				pList.Remove(iItem);
			}
		}

		public static void RemoveRange<T>(this ICollection<T> pList, Predicate<T> pMatch)
		{
			var lToDelete = pList.Where(t => pMatch(t)).ToHashSet();
			pList.RemoveRange(lToDelete);
		}
	}
}