Selaa lähdekoodia

partial support for Array.map/filter

Simon Krajewski 12 vuotta sitten
vanhempi
commit
42eea08e40
7 muutettua tiedostoa jossa 93 lisäystä ja 1 poistoa
  1. 2 0
      std/Array.hx
  2. 23 0
      std/flash/Boot.hx
  3. 21 0
      std/flash8/Boot.hx
  4. 3 0
      std/js/_std/Array.hx
  5. 14 0
      std/neko/_std/Array.hx
  6. 8 0
      std/php/Boot.hx
  7. 22 1
      tests/unit/unitstd/Array.unit.hx

+ 2 - 0
std/Array.hx

@@ -233,4 +233,6 @@ extern class Array<T> {
 	**/
 	function iterator() : Iterator<T>;
 
+	function map<S>( f : T -> S ) : Array<S>;
+	function filter( f : T -> Bool ) : Array<T>;
 }

+ 23 - 0
std/flash/Boot.hx

@@ -231,10 +231,33 @@ class Boot extends flash.display.MovieClip {
 				}
 			}
 		};
+		aproto.filter = function(f) {
+			var ret = [];
+			var i = 0;
+			var l = __this__.length;
+			while ( i < l ) {
+				if (f(__this__[i]))
+					ret.push(__this__[i]);
+				i++;
+			}
+			return ret;
+		};
+		aproto.map = function(f) {
+			var ret = [];
+			var i = 0;
+			var l = __this__.length;
+			while( i < l ) {
+				ret.push(f(__this__[i]));
+				i++;
+			}
+			return ret;
+		};
 		aproto.setPropertyIsEnumerable("copy", false);
 		aproto.setPropertyIsEnumerable("insert", false);
 		aproto.setPropertyIsEnumerable("remove", false);
 		aproto.setPropertyIsEnumerable("iterator", false);
+		aproto.setPropertyIsEnumerable("map", false);
+		aproto.setPropertyIsEnumerable("filter", false);
 		#if as3
 		String.prototype.charCodeAtHX = function(i) : Null<Int> {
 		#else

+ 21 - 0
std/flash8/Boot.hx

@@ -248,6 +248,27 @@ class Boot {
 					}
 				}
 			};
+			Array.prototype["map"] = function(f) {
+				var ret = [];
+				var i = 0;
+				var l = __this__["length"];
+				while( i < l ) {
+					ret.push(f(__this__[i]));
+					i++;
+				}
+				return ret;
+			};
+			Array.prototype["filter"] = function(f) {
+				var ret = [];
+				var i = 0;
+				var l = __this__["length"];
+				while ( i < l ) {
+					if (f(__this__[i]))
+						ret.push(__this__[i]);
+					i++;
+				}
+				return ret;
+			};
 			_global["ASSetPropFlags"](Array.prototype,null,7);
 			var cca = String.prototype["charCodeAt"];
 			String.prototype["cca"] = cca;

+ 3 - 0
std/js/_std/Array.hx

@@ -49,6 +49,9 @@ extern class Array<T> {
 		return (untyped this).slice();
 	}
 
+	function map<S>(f:T->S):Array<S>;
+	function filter(f:T->Bool):Array<T>;
+
 	@:runtime inline function iterator() : Iterator<T> {
 		return untyped HxOverrides.iter(this);
 	}

+ 14 - 0
std/neko/_std/Array.hx

@@ -235,6 +235,20 @@
 		return ret;
 	}
 
+	public function map<S>( f : T -> S ) : Array<S> {
+		var ret = [];
+		for (elt in this)
+			ret.push(f(elt));
+		return ret;
+	}
+
+	public function filter( f : T -> Bool ) : Array<T> {
+		var ret = [];
+		for (elt in this)
+			if (f(elt))
+				ret.push(elt);
+		return ret;
+	}
 
 
 	/* NEKO INTERNAL */

+ 8 - 0
std/php/Boot.hx

@@ -155,6 +155,14 @@ class _hx_array implements ArrayAccess, IteratorAggregate {
 		$this->length++;
 	}
 
+	function map($f) {
+		return new _hx_array(array_map($f, $this->»a));
+	}
+
+	function filter($f) {
+		return new _hx_array(array_filter($this->»a,$f));
+	}
+
 	// ArrayAccess methods:
 	function offsetExists($offset) {
 		return isset($this->»a[$offset]);

+ 22 - 1
tests/unit/unitstd/Array.unit.hx

@@ -209,4 +209,25 @@ b == [i0, i1, i2];
 var a = [];
 var b = a.copy();
 a != b;
-b == [];
+b == [];
+
+#if (!cpp && !flash && !cs && !java)
+// map
+[1, 2, 3].map(function(i) return i * 2) == [2, 4, 6];
+var a = [new IntWrap(1), new IntWrap(2)];
+var b = a.map(function(x) return x);
+a != b;
+b.length == a.length;
+a[0] == b[0];
+a[1] == b[1];
+var func = function(s) return s.toUpperCase();
+["foo", "bar"].map(func) == ["FOO", "BAR"];
+[].map(func) == [];
+
+// filter
+[1, 2, 3, 4].filter(function(i) return i < 3) == [1, 2];
+[1, 2, 3, 4].filter(function(i) return true) == [1, 2, 3, 4];
+[1, 2, 3, 4].filter(function(i) return false) == [];
+[].filter(function(i) return true) == [];
+[].filter(function(i) return false) == [];
+#end