package tools; import utils.ArrayKeyValueReverseIterator; import utils.ArrayReverseIterator; class ArrayTools { public static function last(arr:Array):Null { return arr[arr.length - 1]; } public static function min(arr:Array, ?maxValue:T):T { var min = arr[0] ?? maxValue; for (value in arr) if (value < min) min = value; return min; } public static function max(arr:Array, ?minValue:T):T { var max = arr[0] ?? minValue; for (value in arr) if (value > max) max = value; return max; } public static function indexOfMax(arr:Array, ?minValue:T):Int { if (arr.length == 0) return -1; var max = arr[0] ?? minValue; var maxIndex = 0; for (i in 1...arr.length) { if (arr[i] > max) { maxIndex = i; max = arr[i]; } } return maxIndex; } public static function sum(arr:Array):T { var total:T = cast 0; for (value in arr) total += value; return total; } public static function shuffle(arr:Array):Void { for (i => a in arr) { final n = Std.random(arr.length); final b = arr[n]; arr[i] = b; arr[n] = a; } } public static inline function reversed(arr:Array) { return new ArrayReverseIterator(arr); } /** Key-value reversed array iterator **/ public static inline function reversedKV(arr:Array) { return new ArrayKeyValueReverseIterator(arr); } public static inline function findMin( arr:Array, f:(item:T) -> Float, maxValue:Float ):Null { var result:Null = null; for (item in arr) { final dist = f(item); if (dist > maxValue) continue; maxValue = dist; result = item; } return result; } extern overload public static inline function inlineFind(it:Array, f:(item:T) -> Bool):Null { var result:Null = null; for (v in it) { if (f(v)) { result = v; break; } } return result; } extern overload public static inline function inlineFind(it:Iterable, f:(item:T) -> Bool):Null { var result:Null = null; for (v in it) { if (f(v)) { result = v; break; } } return result; } extern overload public static inline function inlineExists(it:Array, f:(item:T) -> Bool):Bool { var result = false; for (v in it) { if (f(v)) { result = true; break; } } return result; } extern overload public static inline function inlineExists(it:Iterable, f:(item:T) -> Bool):Bool { var result = false; for (v in it) { if (f(v)) { result = true; break; } } return result; } }