package haxe; import haxe.iterators.RestIterator; import haxe.iterators.RestKeyValueIterator; import cs.NativeArray; import cs.system.Array as CsArray; private typedef NativeRest = #if erase_generics NativeArray #else NativeArray #end; @:coreApi abstract Rest(NativeRest) { public var length(get,never):Int; inline function get_length():Int return this.Length; @:from static public inline function of(array:Array):Rest return new Rest(@:privateAccess array.__a); inline function new(a:NativeRest):Void this = a; @:arrayAccess inline function get(index:Int):T return (this[index] : T); // typecheck, otherwise it will be inlined as Dynamic with `-D erase-generics` @:to public function toArray():Array { var result = new NativeRest(this.Length); CsArray.Copy(this, 0, result, 0, this.Length); return @:privateAccess Array.ofNative(result); } public inline function iterator():RestIterator return new RestIterator(this); public inline function keyValueIterator():RestKeyValueIterator return new RestKeyValueIterator(this); public function append(item:T):Rest { var result = new NativeRest(this.Length + 1); CsArray.Copy(this, 0, result, 0, this.Length); result[this.Length] = item; return new Rest(result); } public function prepend(item:T):Rest { var result = new NativeRest(this.Length + 1); CsArray.Copy(this, 0, result, 1, this.Length); result[0] = item; return new Rest(result); } public function toString():String { return toArray().toString(); } }