2025-01-22 16:18:30 +01:00

54 lines
1.5 KiB
Haxe

package haxe;
import haxe.iterators.RestIterator;
import haxe.iterators.RestKeyValueIterator;
import cs.NativeArray;
import cs.system.Array as CsArray;
private typedef NativeRest<T> = #if erase_generics NativeArray<Dynamic> #else NativeArray<T> #end;
@:coreApi
abstract Rest<T>(NativeRest<T>) {
public var length(get,never):Int;
inline function get_length():Int
return this.Length;
@:from static public inline function of<T>(array:Array<T>):Rest<T>
return new Rest(@:privateAccess array.__a);
inline function new(a:NativeRest<T>):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<T> {
var result = new NativeRest(this.Length);
CsArray.Copy(this, 0, result, 0, this.Length);
return @:privateAccess Array.ofNative(result);
}
public inline function iterator():RestIterator<T>
return new RestIterator<T>(this);
public inline function keyValueIterator():RestKeyValueIterator<T>
return new RestKeyValueIterator<T>(this);
public function append(item:T):Rest<T> {
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<T> {
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();
}
}