forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |