diff options
| author | RblSb <msrblsb@gmail.com> | 2024-08-14 19:54:25 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2024-08-14 19:54:25 +0300 |
| commit | 38cc0a1d9b4b146af7110c681389378fd26761fa (patch) | |
| tree | e4a0a35e4a518508c4127fdb368f388ce130e2a0 /src/tools | |
| parent | 097cf610e664c922c1c618b11a582bb6a1d959f8 (diff) | |
Seamless reconnection for first 5 seconds
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/ArrayTools.hx | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/tools/ArrayTools.hx b/src/tools/ArrayTools.hx new file mode 100644 index 0000000..63b4839 --- /dev/null +++ b/src/tools/ArrayTools.hx @@ -0,0 +1,116 @@ +package tools; + +import utils.ArrayKeyValueReverseIterator; +import utils.ArrayReverseIterator; + +class ArrayTools { + public static function last<T>(arr:Array<T>):Null<T> { + return arr[arr.length - 1]; + } + + public static function min<T:Float>(arr:Array<T>, ?maxValue:T):T { + var min = arr[0] ?? maxValue; + for (value in arr) if (value < min) min = value; + return min; + } + + public static function max<T:Float>(arr:Array<T>, ?minValue:T):T { + var max = arr[0] ?? minValue; + for (value in arr) if (value > max) max = value; + return max; + } + + public static function indexOfMax<T:Float>(arr:Array<T>, ?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<T:Float>(arr:Array<T>):T { + var total:T = cast 0; + for (value in arr) total += value; + return total; + } + + public static function shuffle<T>(arr:Array<T>):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<T>(arr:Array<T>) { + return new ArrayReverseIterator(arr); + } + + /** Key-value reversed array iterator **/ + public static inline function reversedKV<T>(arr:Array<T>) { + return new ArrayKeyValueReverseIterator(arr); + } + + public static inline function findMin<T>( + arr:Array<T>, f:(item:T) -> Float, maxValue:Float + ):Null<T> { + var result:Null<T> = 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<T>(it:Array<T>, f:(item:T) -> Bool):Null<T> { + var result:Null<T> = null; + for (v in it) { + if (f(v)) { + result = v; + break; + } + } + return result; + } + + extern overload public static inline function inlineFind<T>(it:Iterable<T>, f:(item:T) -> Bool):Null<T> { + var result:Null<T> = null; + for (v in it) { + if (f(v)) { + result = v; + break; + } + } + return result; + } + + extern overload public static inline function inlineExists<T>(it:Array<T>, 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<T>(it:Iterable<T>, f:(item:T) -> Bool):Bool { + var result = false; + for (v in it) { + if (f(v)) { + result = true; + break; + } + } + return result; + } +} |
