Bladeren bron

[php] optimise Array and Vector methods map, filter, toString, remove

Alexander Kuzmenko 6 jaren geleden
bovenliggende
commit
afbc8cb536
2 gewijzigde bestanden met toevoegingen van 20 en 21 verwijderingen
  1. 17 18
      std/php/_std/Array.hx
  2. 3 3
      std/php/_std/haxe/ds/Vector.hx

+ 17 - 18
std/php/_std/Array.hx

@@ -44,11 +44,11 @@ class Array<T> implements ArrayAccess<Int,T> {
 
 	public inline function filter(f:T->Bool):Array<T> {
 		var result = Syntax.arrayDecl();
-		for(i in 0...length) {
-			if(f(arr[i])) {
-				result.push(arr[i]);
+		Syntax.foreach(arr, function(_, value:T) {
+			if(f(value)) {
+				result.push(value);
 			}
-		}
+		});
 		return wrap(result);
 	}
 
@@ -102,9 +102,9 @@ class Array<T> implements ArrayAccess<Int,T> {
 
 	public inline function map<S>(f:T->S):Array<S> {
 		var result = Syntax.arrayDecl();
-		for(i in 0...length) {
-			result.push(f(arr[i]));
-		}
+		Syntax.foreach(arr, function(_, value:T) {
+			result.push(f(value));
+		});
 		return wrap(result);
 	}
 
@@ -119,14 +119,16 @@ class Array<T> implements ArrayAccess<Int,T> {
 	}
 
 	public function remove(x:T):Bool {
-		for (i in 0...length) {
-			if (arr[i] == x) {
-				Global.array_splice(arr, i, 1);
+		var result = false;
+		Syntax.foreach(arr, function(index:Int, value:T) {
+			if (value == x) {
+				Global.array_splice(arr, index, 1);
 				length--;
-				return true;
+				result = true;
+				Syntax.code('break');
 			}
-		}
-		return false;
+		});
+		return result;
 	}
 
 	public inline function reverse():Void {
@@ -169,11 +171,8 @@ class Array<T> implements ArrayAccess<Int,T> {
 	}
 
 	public function toString():String {
-		var strings = Syntax.arrayDecl();
-		Syntax.foreach(arr, function(index:Int, value:T) {
-			strings[index] = Boot.stringify(value);
-		});
-		return '[' + Global.implode(',', strings) + ']';
+		var strings = Global.implode(',', Global.array_map(Syntax.nativeClassName(Boot) + '::stringify', arr));
+		return '[' + strings + ']';
 	}
 
 	public function resize( len:Int ) : Void {

+ 3 - 3
std/php/_std/haxe/ds/Vector.hx

@@ -121,9 +121,9 @@ abstract Vector<T>(VectorData<T>) {
 
 	public inline function map<S>(f:T->S):Vector<S> {
 		var result = new Vector(this.length);
-		for(i in 0...this.length) {
-			result[i] = f(get(i));
-		}
+		Syntax.foreach(this.data, function(key:Int, value:T) {
+			result[key] = f(value);
+		});
 		return result;
 	}