using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Unity.Collections; using Unity.Entities; namespace DefaultNamespace { public static class EnumerableExtensions { public static void Fill(this T[] buffer, T val) { for (var i = 0; i < buffer.Length; i++) { buffer[i] = val; } } public static int FindMinIndex(this IReadOnlyList list, Func valueGetter) { var closestValue = float.MaxValue; var closestIndex = -1; for (var i = 0; i < list.Count; i++) { var val = valueGetter.Invoke(list[i]); if (val < closestValue || closestIndex < 0) { closestValue = val; closestIndex = i; } } return closestIndex; } public static int FindMinIndex(this NativeList list, Func valueGetter) where T : struct { var closestValue = float.MaxValue; var closestIndex = -1; for (var i = 0; i < list.Length; i++) { var val = valueGetter.Invoke(list[i]); if (val < closestValue || closestIndex < 0) { closestValue = val; closestIndex = i; } } return closestIndex; } public static T MinValue(this IEnumerable list, Func valueGetter) { var closestDist = float.PositiveInfinity; T obj = default; var isEmpty = true; foreach (var val in list) { var dist = valueGetter(val); if (dist <= closestDist) { closestDist = dist; obj = val; } isEmpty = false; } if (isEmpty) { throw new ArgumentException(); } return obj; } public static int FindIndex(this NativeList val, Predicate predicate) where T : struct { return FindIndex((NativeArray)val, predicate); } public static int FindIndex(this NativeArray val, Predicate predicate) where T : struct { for (var i = 0; i < val.Length; i++) { if (predicate.Invoke(val[i])) { return i; } } return -1; } public static void Reverse(this NativeList val) where T : struct { Reverse((NativeArray)val); } public static void Reverse(this NativeArray val) where T : struct { var tmp = new NativeArray(val.Length, Allocator.Temp); for (var i = 0; i < val.Length; i++) { tmp[val.Length - i - 1] = val[i]; } val.CopyFrom(tmp); tmp.Dispose(); } public static NativeArray Fill(this NativeArray val, T v) where T : struct { for (var i = 0; i < val.Length; i++) { val[i] = v; } return val; } public static IEnumerator Enumerate(this NativeList val) where T : struct { for (var i = 0; i < val.Length; i++) { yield return val[i]; } } public static IEnumerator Enumerate(this NativeArray val) where T : struct { for (var i = 0; i < val.Length; i++) { yield return val[i]; } } public static bool CheckIterate(this IEnumerable list) where T : struct { return list.Any(); } public static void Iterate(this IEnumerable list) where T : struct { foreach (var unused in list) { } } public static IEnumerable<(NativeArray, int)> NativeForEach(this NativeArray list, Func func) where T : struct { for (var i = 0; i < list.Length; i++) { list[i] = func.Invoke(list[i]); yield return (list, i); } } public static IEnumerable<(NativeSlice, int)> NativeForEach(this NativeSlice list, Func func) where T : struct { for (var i = 0; i < list.Length; i++) { list[i] = func.Invoke(list[i]); yield return (list, i); } } public static IEnumerable<(NativeArray, int)> NativeForEach (this IEnumerable<(NativeArray array, int index)> list, Func func) where T : struct { foreach (var tuple in list) { var array = tuple.array; array[tuple.index] = func.Invoke(tuple.array[tuple.index]); yield return tuple; } } public static IEnumerable<(NativeSlice, int)> NativeForEach (this IEnumerable<(NativeSlice array, int index)> list, Func func) where T : struct { foreach (var tuple in list) { var array = tuple.array; array[tuple.index] = func.Invoke(tuple.array[tuple.index]); yield return tuple; } } public static IEnumerable<(NativeArray, int)> NativeWhere(this NativeArray list, Predicate predicate) where T : struct { for (var i = 0; i < list.Length; i++) { var eVal = list[i]; if (predicate.Invoke(eVal)) { yield return (list, i); } } } public static IEnumerable<(NativeSlice, int)> NativeWhere(this NativeSlice list, Predicate predicate) where T : struct { for (var i = 0; i < list.Length; i++) { var eVal = list[i]; if (predicate.Invoke(eVal)) { yield return (list, i); } } } public static (DynamicBuffer, int)? NativeFirstOrOptional(this DynamicBuffer buffer, Predicate predicate) where T : struct { for (var i = 0; i < buffer.Length; i++) { var eVal = buffer[i]; if (predicate.Invoke(eVal)) { return (buffer, i); } } return null; } public static (NativeSlice, int)? NativeFirstOrOptional(this NativeSlice list, Predicate predicate) where T : struct { for (var i = 0; i < list.Length; i++) { var eVal = list[i]; if (predicate.Invoke(eVal)) { return (list, i); } } return null; } public static (NativeArray, int)? NativeFirstOrOptional(this NativeArray list, Predicate predicate) where T : struct { for (var i = 0; i < list.Length; i++) { var eVal = list[i]; if (predicate.Invoke(eVal)) { return (list, i); } } return null; } public static bool NativeModify(this (DynamicBuffer, int)? val, Func func) where T : struct { if (val.HasValue) { var list = val.Value.Item1; var index = val.Value.Item2; list[index] = func.Invoke(list[index]); return true; } return false; } public static bool NativeModify(this (NativeSlice, int)? val, Func func) where T : struct { if (val.HasValue) { var list = val.Value.Item1; var index = val.Value.Item2; list[index] = func.Invoke(list[index]); return true; } return false; } public static bool NativeModify(this (NativeArray, int)? val, Func func) where T : struct { if (val.HasValue) { var list = val.Value.Item1; var index = val.Value.Item2; list[index] = func.Invoke(list[index]); return true; } return false; } private static bool EmptyPredicate(T val) { return true; } public static DynamicBufferEnumerator Begin(this DynamicBuffer val) where T : struct, IBufferElementData { return new DynamicBufferEnumerator { Predicate = EmptyPredicate, Buffer = val, Index = 0 }; } public static DynamicBufferEnumerator Where(this DynamicBufferEnumerator val, Predicate func) where T : struct, IBufferElementData { return new DynamicBufferEnumerator { Buffer = val.Buffer, Index = 0, Predicate = v => (val.Predicate == null || val.Predicate.Invoke(v)) && func.Invoke(v) }; } public static float Sum(this DynamicBufferEnumerator val, Func sum) where T : struct, IBufferElementData { float final = 0; for (var i = val.Index; i < val.Buffer.Length; i++) { if (val.Predicate(val.Buffer[i])) { final += sum.Invoke(val.Buffer[i]); } } return final; } public static int Sum(this DynamicBufferEnumerator val, Func sum) where T : struct, IBufferElementData { var final = 0; for (var i = val.Index; i < val.Buffer.Length; i++) { if (val.Predicate(val.Buffer[i])) { final += sum.Invoke(val.Buffer[i]); } } return final; } public static bool Any(this DynamicBufferEnumerator val, Predicate predicate) where T : struct, IBufferElementData { for (var i = val.Index; i < val.Buffer.Length; i++) { if (val.Predicate(val.Buffer[i]) && predicate.Invoke(val.Buffer[i])) { return true; } } return false; } public static T FirstOrDefault(this DynamicBufferEnumerator val, Predicate predicate) where T : struct, IBufferElementData { for (var i = val.Index; i < val.Buffer.Length; i++) { if (val.Predicate(val.Buffer[i]) && predicate.Invoke(val.Buffer[i])) { return val.Buffer[i]; } } return default; } public static int IndexOf(this DynamicBufferEnumerator val, Predicate predicate) where T : struct, IBufferElementData { for (var i = val.Index; i < val.Buffer.Length; i++) { if (val.Predicate(val.Buffer[i]) && predicate.Invoke(val.Buffer[i])) { return i; } } return -1; } public static void Fill(this DynamicBuffer buffer, int amount) where T : struct, IBufferElementData { for (var i = 0; i < amount; i++) { buffer.Add(default); } } public static NativeHashMapEnum GetEnumerator(this NativeMultiHashMap map, T key) where T : struct, IEquatable where TK : struct { return new NativeHashMapEnum { map = map, key = key }; } public class EnumeratorEndException : Exception { } public struct DynamicBufferEnumerator where T : struct, IBufferElementData { public int Index; public DynamicBuffer Buffer; public Predicate Predicate; } public struct NativeHashMapEnum : IEnumerable where T : struct, IEquatable where TK : struct { public NativeMultiHashMap map; public T key; IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator GetEnumerator() { return new NativeHashMapIt { map = map, key = key }; } } public struct NativeHashMapIt : IEnumerator where T : struct, IEquatable where TK : struct { public T key; public TK current; public NativeMultiHashMapIterator it; public NativeMultiHashMap map; public bool isNotFirst; public bool hasMore; public bool MoveNext() { if (!isNotFirst) { hasMore = map.TryGetFirstValue(key, out current, out it); isNotFirst = true; } else { hasMore = map.TryGetNextValue(out current, ref it); } return hasMore; } public void Reset() { isNotFirst = false; } object IEnumerator.Current => Current; public void Dispose() { } public TK Current => current; } } }