using UnityEngine; using UnityEngine.Events; using System; using System.Collections; using System.Collections.Generic; using System.Linq; public static class ExtList { public static T Roll(this List list) { T t = list[0]; list.RemoveAt(0); list.Add(t); return list[0]; } public static void Switch(this List list, int index0, int index1) { T t0 = list[index0]; list[index0] = list[index1]; list[index1] = t0; } public static T Prev(this List list, int index) { return list[(index + list.Count - 1) % list.Count]; } public static T Next(this List list, int index) { return list[(index + 1) % list.Count]; } public static T Back(this List list, int index, bool remove = false) { T t = list[list.Count - 1 - index]; if (remove) { list.RemoveAt(list.Count - 1 - index); } return t; } public static T Forward(this List list, int index, bool remove = false) { T t = list[index]; if (remove) { list.RemoveAt(index); } return t; } public static List Random(this List list, int amt = 1, bool allDifferent = true, bool remove = false, Func func = null) { if (amt > list.Count && allDifferent) { throw new Exception(); } int antiCrush = 0; List resultList = new List(); while (resultList.Count < amt) { if (antiCrush++ > 10000) { throw new Exception(); } int index = UnityEngine.Random.Range(0, list.Count); T result = list[index]; if (func != null) { if (!func(result)) { continue; } } if (allDifferent) { if (resultList.Contains(result)) { continue; } } if (remove) { list.RemoveAt(index); resultList.Add(result); } else { resultList.Add(result); } } return resultList; } public static List Disturb(this List list) { List resultList = new List(); resultList.AddRange(list.Random(list.Count)); return resultList; } public static List ToSingleList(this List twoLevelList) where T1 : List { //for (int i = 0; i < highLevelList.Count; i++) //{ // highLevelList[i][i].GetType() //} return null; } public static bool Valid(this List list) { if (list == null || list.Count == 0) { return false; } else { return true; } } public static bool UniqueAdd(this List list, T obj) { if (list.Contains(obj) == false) { list.Add(obj); return true; } else { return false; } } public static void ForEach(this List list, Action action, bool remove = false) { for (int i = 0; i < list.Count; i++) { action(list[i]); if (remove) { list.RemoveAt(i--); } } } public static void BackRemoveAt(this List list, int index) { list.RemoveAt(list.Count - 1 - index); } public static void MySort(this List list, Func func) { bool finish = false; for (int i = 0; i < list.Count; i++) { finish = true; for (int j = 0; j < list.Count - i - 1; j++) { if (func(list[j], list[j + 1])) { finish = false; T t = list[j]; list[j] = list[j + 1]; list[j + 1] = t; } } if (finish) { break; } } } public static float MyMin(this List list, Func func) { float result = func(list[0]); for (int i = 1; i < list.Count; i++) { if (result > func(list[i])) { result = func(list[i]); } } return result; } public static float MyMax(this List list, Func func) { float result = func(list[0]); for (int i = 1; i < list.Count; i++) { if (result < func(list[i])) { result = func(list[i]); } } return result; } public static float MySum(this List list, Func func, int count = -1) { if (count == -1) { count = list.Count; } float result = 0; for (int i = 0; i < count; i++) { result += func(list[i]); } return result; } public static bool MyContains(this List list, Func func) { for (int i = 0; i < list.Count; i++) { if (func.Invoke(list[i])) { return true; } } return false; } public static int GetMatchAmount(this List list, Func func) { int matchAmount = 0; for (int i = 0; i < list.Count; i++) { if (func.Invoke(list[i])) matchAmount++; } return matchAmount; } }