91 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			91 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package haxe; | ||
|  | 
 | ||
|  | import haxe.iterators.RestIterator; | ||
|  | import haxe.iterators.RestKeyValueIterator; | ||
|  | 
 | ||
|  | private typedef NativeRest<T> = Array<T>; | ||
|  | 
 | ||
|  | /** | ||
|  | 	A special type that represents a "rest" function argument. | ||
|  | 	 | ||
|  | 	The special `...` syntax can be used for convenience and improved readability: | ||
|  | 
 | ||
|  | 	```haxe | ||
|  | 	function f(...rest:Int) { | ||
|  | 		$type(rest); // haxe.Rest<Int> | ||
|  | 	} | ||
|  | 
 | ||
|  | 	f(1, 2, 3); | ||
|  | 
 | ||
|  | 	final array = [1, 2, 3]; | ||
|  | 	f(...array); | ||
|  | 	``` | ||
|  | 
 | ||
|  | 	Should be used as a type for the last argument of a method, indicating that | ||
|  | 	an arbitrary number of arguments of the given type can be passed to that method. | ||
|  | 
 | ||
|  | 	Allows to use array access by index to get values of rest arguments. | ||
|  | 	If the index exceeds the amount of rest arguments passed, the result is unspecified. | ||
|  | **/ | ||
|  | @:coreApi | ||
|  | abstract Rest<T>(NativeRest<T>) { | ||
|  | 	/** Amount of arguments passed as rest arguments */ | ||
|  | 	public var length(get,never):Int; | ||
|  | 	inline function get_length():Int | ||
|  | 		return this.length; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Create rest arguments using contents of `array`. | ||
|  | 
 | ||
|  | 		WARNING: | ||
|  | 		Depending on a target platform modifying `array` after using this method | ||
|  | 		may affect the created `Rest` instance. | ||
|  | 		Use `Rest.of(array.copy())` to avoid that. | ||
|  | 	**/ | ||
|  | 	@:from static public inline function of<T>(array:Array<T>):Rest<T> | ||
|  | 		return new Rest(array); | ||
|  | 
 | ||
|  | 	inline function new(array:Array<T>):Void | ||
|  | 		this = array; | ||
|  | 
 | ||
|  | 	@:arrayAccess inline function get(index:Int):T | ||
|  | 		return this[index]; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Creates an array containing all the values of rest arguments. | ||
|  | 	**/ | ||
|  | 	@:to public #if !cppia inline #end function toArray():Array<T> | ||
|  | 		return this.copy(); | ||
|  | 
 | ||
|  | 	public inline function iterator():RestIterator<T> | ||
|  | 		return new RestIterator<T>(this); | ||
|  | 
 | ||
|  | 	public inline function keyValueIterator():RestKeyValueIterator<T> | ||
|  | 		return new RestKeyValueIterator<T>(this); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Create a new rest arguments collection by appending `item` to this one. | ||
|  | 	**/ | ||
|  | 	public function append(item:T):Rest<T> { | ||
|  | 		var result = this.copy(); | ||
|  | 		result.push(item); | ||
|  | 		return new Rest(result); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Create a new rest arguments collection by prepending this one with `item`. | ||
|  | 	**/ | ||
|  | 	public function prepend(item:T):Rest<T> { | ||
|  | 		var result = this.copy(); | ||
|  | 		result.unshift(item); | ||
|  | 		return new Rest(result); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public inline function toString():String { | ||
|  | 		#if (flash || js) | ||
|  | 			return '[${this.toString()}]'; | ||
|  | 		#else | ||
|  | 			return this.toString(); | ||
|  | 		#end | ||
|  | 	} | ||
|  | } |