diff --git a/std/Array.hx b/std/Array.hx index e9b89a9ab29..10c0a516cc0 100644 --- a/std/Array.hx +++ b/std/Array.hx @@ -274,7 +274,15 @@ extern class Array { If `f` is null, the result is unspecified. **/ - function map(f:T->S):Array; + @:runtime inline function map(f:T->S):Array { + #if (cpp && !cppia) + var result = cpp.NativeArray.create(length); + for (i in 0...length) cpp.NativeArray.unsafeSet(result, i, f(cpp.NativeArray.unsafeGet(this, i))); + return result; + #else + return [for (v in this) f(v)]; + #end + } /** Returns an Array containing those elements of `this` for which `f` @@ -284,7 +292,9 @@ extern class Array { If `f` is null, the result is unspecified. **/ - function filter(f:T->Bool):Array; + @:runtime inline function filter(f:T->Bool):Array { + return [for (v in this) if (f(v)) v]; + } /** Set the length of the Array. diff --git a/std/cs/_std/Array.hx b/std/cs/_std/Array.hx index 984a56cd4d5..929b65373c6 100644 --- a/std/cs/_std/Array.hx +++ b/std/cs/_std/Array.hx @@ -390,18 +390,20 @@ final class Array implements ArrayAccess { return false; } - public function map(f:T->S):Array { - var ret = []; - for (elt in this) - ret.push(f(elt)); + public inline function map(f:T->S):Array { + var ret = alloc(length); + for (i in 0...length) + ret.__unsafe_set(i, f(__unsafe_get(i))); return ret; } - public function filter(f:T->Bool):Array { + public inline function filter(f:T->Bool):Array { var ret = []; - for (elt in this) + for (i in 0...length) { + var elt = __unsafe_get(i); if (f(elt)) ret.push(elt); + } return ret; } diff --git a/std/java/_std/Array.hx b/std/java/_std/Array.hx index 8eb1770aca8..12ed28a18b6 100644 --- a/std/java/_std/Array.hx +++ b/std/java/_std/Array.hx @@ -432,18 +432,20 @@ import java.NativeArray; } } - public function map(f:T->S):Array { - var ret = []; - for (elt in this) - ret.push(f(elt)); + public inline function map(f:T->S):Array { + var ret = alloc(length); + for (i in 0...length) + ret.__set(i, f(__get(i))); return ret; } - public function filter(f:T->Bool):Array { + public inline function filter(f:T->Bool):Array { var ret = []; - for (elt in this) + for (i in 0...length) { + var elt = __get(i); if (f(elt)) ret.push(elt); + } return ret; } diff --git a/std/js/_std/Array.hx b/std/js/_std/Array.hx index 42c487c9e44..a200d4508ec 100644 --- a/std/js/_std/Array.hx +++ b/std/js/_std/Array.hx @@ -62,8 +62,13 @@ extern class Array { return (cast this).slice(); } - function map(f:T->S):Array; - function filter(f:T->Bool):Array; + @:runtime inline function map(f:T->S):Array { + return [for (v in this) f(v)]; + } + + @:runtime inline function filter(f:T->Bool):Array { + return [for (v in this) if (f(v)) v]; + } @:runtime inline function iterator():Iterator { return @:privateAccess HxOverrides.iter(this); diff --git a/std/lua/_std/Array.hx b/std/lua/_std/Array.hx index b0221263164..a773273f520 100644 --- a/std/lua/_std/Array.hx +++ b/std/lua/_std/Array.hx @@ -227,11 +227,11 @@ class Array { return [for (i in this) i]; } - public function map(f:T->S):Array { + public inline function map(f:T->S):Array { return [for (i in this) f(i)]; } - public function filter(f:T->Bool):Array { + public inline function filter(f:T->Bool):Array { return [for (i in this) if (f(i)) i]; } diff --git a/std/neko/_std/Array.hx b/std/neko/_std/Array.hx index affb658711c..47de45aec58 100644 --- a/std/neko/_std/Array.hx +++ b/std/neko/_std/Array.hx @@ -286,14 +286,16 @@ return ret; } - public function map(f:T->S):Array { - var ret = []; - for (elt in this) - ret.push(f(elt)); + public inline function map(f:T->S):Array { + var l = length; + var ret = new1(neko.NativeArray.alloc(l), l); + for (i in 0...l) { + ret[i] = f(this[i]); + } return ret; } - public function filter(f:T->Bool):Array { + public inline function filter( f : T -> Bool ) : Array { var ret = []; for (elt in this) if (f(elt)) diff --git a/std/php/_std/Array.hx b/std/php/_std/Array.hx index dde0822b7d0..22badd35da4 100644 --- a/std/php/_std/Array.hx +++ b/std/php/_std/Array.hx @@ -45,12 +45,10 @@ final class Array implements ArrayAccess { public inline function filter(f:T->Bool):Array { var result = Syntax.arrayDecl(); - var i = 0; - while (i < length) { - if (f(arr[i])) { - result.push(arr[i]); + for(item in arr) { + if (f(item)) { + result.push(item); } - i++; } return wrap(result); } @@ -109,10 +107,8 @@ final class Array implements ArrayAccess { public inline function map(f:T->S):Array { var result = Syntax.arrayDecl(); - var i = 0; - while (i < length) { - result.push(f(arr[i])); - i++; + for(item in arr) { + result.push(f(item)); } return wrap(result); }