64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package haxe; | ||
|  | 
 | ||
|  | import haxe.iterators.RestIterator; | ||
|  | import haxe.iterators.RestKeyValueIterator; | ||
|  | import java.NativeArray; | ||
|  | import java.lang.System; | ||
|  | import java.lang.Object; | ||
|  | import java.util.Arrays; | ||
|  | 
 | ||
|  | private typedef NativeRest<T> = NativeArray<Object>; | ||
|  | 
 | ||
|  | @:coreApi | ||
|  | abstract Rest<T>(NativeRest<T>) { | ||
|  | 	public var length(get,never):Int; | ||
|  | 	inline function get_length():Int | ||
|  | 		return this.length; | ||
|  | 
 | ||
|  | 	@:from static public function of<T>(array:Array<T>):Rest<T> { | ||
|  | 		var native = @:privateAccess array.__a; | ||
|  | 		var result:NativeRest<T>; | ||
|  | 		#if jvm | ||
|  | 			result = (cast native:Object).clone(); | ||
|  | 		#else | ||
|  | 			result = new NativeRest<T>(native.length); | ||
|  | 			for(i in 0...native.length) | ||
|  | 				result[i] = cast native[i]; | ||
|  | 		#end | ||
|  | 		return new Rest(result); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	inline function new(a:NativeRest<T>):Void | ||
|  | 		this = a; | ||
|  | 
 | ||
|  | 	@:arrayAccess inline function get(index:Int):T | ||
|  | 		return cast this[index]; | ||
|  | 
 | ||
|  | 	@:to public function toArray():Array<T> { | ||
|  | 		return [for(i in 0...this.length) cast this[i]]; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	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<T>(this.length + 1); | ||
|  | 		System.arraycopy(this, 0, result, 0, this.length); | ||
|  | 		result[this.length] = cast item; | ||
|  | 		return new Rest(result); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function prepend(item:T):Rest<T> { | ||
|  | 		var result = new NativeRest<T>(this.length + 1); | ||
|  | 		System.arraycopy(this, 0, result, 1, this.length); | ||
|  | 		result[0] = cast item; | ||
|  | 		return new Rest(result); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function toString():String { | ||
|  | 		return toArray().toString(); | ||
|  | 	} | ||
|  | } |