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();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |