using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; namespace Harmony { public static class GeneralExtensions { public static string Join(this IEnumerable enumeration, Func converter = null, string delimiter = ", ") { if (converter == null) converter = t => t.ToString(); return enumeration.Aggregate("", (prev, curr) => prev + (prev != "" ? delimiter : "") + converter(curr)); } public static string Description(this Type[] parameters) { if (parameters == null) return "NULL"; var pattern = @", \w+, Version=[0-9.]+, Culture=neutral, PublicKeyToken=[0-9a-f]+"; return "(" + parameters.Join(p => p?.FullName == null ? "null" : Regex.Replace(p.FullName, pattern, "")) + ")"; } public static string FullDescription(this MethodBase method) { var parameters = method.GetParameters().Select(p => p.ParameterType).ToArray(); return method.DeclaringType.FullName + "." + method.Name + parameters.Description(); } public static Type[] Types(this ParameterInfo[] pinfo) { return pinfo.Select(pi => pi.ParameterType).ToArray(); } public static T GetValueSafe(this Dictionary dictionary, S key) { T result; if (dictionary.TryGetValue(key, out result)) return result; return default(T); } public static T GetTypedValue(this Dictionary dictionary, string key) { object result; if (dictionary.TryGetValue(key, out result)) if (result is T) return (T)result; return default(T); } } public static class CollectionExtensions { public static void Do(this IEnumerable sequence, Action action) { if (sequence == null) return; var enumerator = sequence.GetEnumerator(); while (enumerator.MoveNext()) action(enumerator.Current); } public static void DoIf(this IEnumerable sequence, Func condition, Action action) { sequence.Where(condition).Do(action); } public static IEnumerable Add(this IEnumerable sequence, T item) { return (sequence ?? Enumerable.Empty()).Concat(new[] { item }); } public static T[] AddRangeToArray(this T[] sequence, T[] items) { return (sequence ?? Enumerable.Empty()).Concat(items).ToArray(); } public static T[] AddToArray(this T[] sequence, T item) { return Add(sequence, item).ToArray(); } } }