package python.internal; /* * Copyright (C)2005-2012 Haxe Foundation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ import python.lib.FuncTools; import python.lib.Builtin; @:allow(Array) @:keep class ArrayImpl { public static inline function get_length (x:Array):Int return python.lib.Builtin.len(x); public static inline function concat( a1:Array, a2 : Array) : Array { return untyped (untyped a1) + (untyped a2); } public static inline function copy(x:Array) : Array { return Builtin.list(x); } @:keep public static inline function iterator(x:Array) : Iterator { return python.Lib.toHaxeIterator(untyped x.__iter__()); } //public static function insert( pos : Int, x : T ) : Void; public static function indexOf(a:Array, x : T, ?fromIndex:Int) : Int { var l = if (fromIndex == null) 0 else if (fromIndex < 0) a.length + fromIndex else fromIndex; if (l < 0) l = 0; for (i in l...a.length) { if (a[i] == x) return i; } return -1; } public static function lastIndexOf(a:Array, x : T, ?fromIndex:Int) : Int { var l = if (fromIndex == null) a.length else if (fromIndex < 0) a.length + fromIndex + 1 else fromIndex+1; if (l > a.length) l = a.length; while (--l > -1) { if (a[l] == x) return l; } return -1; } public static inline function join(x:Array, sep : String ) : String { return untyped sep.join(x.map(Std.string)); } public static inline function toString(x:Array) : String { return "[" + x.join(",") + "]"; } public static inline function pop(x:Array) : Null { return if (x.length == 0) null else untyped __field__(x, "pop")(); } public static inline function push(x:Array, e:T) : Int { untyped x.append(e); return get_length(x); } public static inline function unshift(x:Array,e : T) : Void { return x.insert(0,e); } @:keep public static function remove(x:Array,e : T) : Bool { try { untyped __field__(x, "remove")(e); return true; } catch (e:Dynamic) { return false; } } // public static function reverse(x:Array) : Void; public static inline function shift(x:Array) : Null { if (x.length == 0) return null; return untyped __field__(x, "pop")(0); } public static inline function slice(x:Array, pos : Int, ?end : Int ) : Array { return untyped __python_array_get__(x, pos, end); } public static inline function sort(x:Array, f:T->T->Int) : Void { return untyped __field__(x, "sort")( (untyped __named_arg__)("key", python.lib.FuncTools.cmp_to_key(f))); } /* b = [i0, i1, i3, i0, i2]; a = b.splice( -2, 2); b == [i0, i1, i3]; trace(a); a == [i0, i2]; */ public static inline function splice(x:Array, pos : Int, len : Int ) : Array { if (pos < 0) pos = x.length+pos; if (pos < 0) pos = 0; var res = untyped __python_array_get__(x, pos, pos+len); untyped __python_del__(untyped __python_array_get__(x, pos, pos+len)); return res; } @:keep public static inline function map(x:Array, f : T -> S ) : Array { return Builtin.list(Builtin.map(f,cast x)); } @:keep public static inline function filter(x:Array, f : T -> Bool ) : Array { return Builtin.list(Builtin.filter(f, x)); } @:keep private static inline function __get(x:Array, idx:Int):T { var _hx_a = x; if (idx >= _hx_a.length || idx < 0) return null; else return x[idx]; } @:keep private static inline function __set(x:Array, idx:Int, v:T):T { var _hx_a = x; _hx_a[idx] = v; return v; } @:keep private static inline function __unsafe_get(x:Array,idx:Int):T { return x[idx]; } @:keep private static inline function __unsafe_set(x:Array,idx:Int, val:T):T { x[idx] = val; return val; } }