File: Rest.hx

package info (click to toggle)
haxe 1%3A4.2.5-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 42,984 kB
  • sloc: ml: 132,401; ansic: 2,403; makefile: 436; java: 365; cs: 336; cpp: 318; python: 315; sh: 75; objc: 64; php: 45; xml: 30; javascript: 11
file content (54 lines) | stat: -rw-r--r-- 1,569 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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();
	}
}