-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlists.ts
123 lines (99 loc) · 2.64 KB
/
lists.ts
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
* @description A list utility class that provides a set of helper methods for working with lists.
*/
interface IEnumerator<T> {
current: T;
moveNext(): boolean;
reset(): void;
}
interface IList<T> {
add(item: T): void;
addRange(items: T[]): void;
clear(): void;
contains(item: T): boolean;
indexOf(item: T): number;
insert(index: number, item: T): void;
remove(item: T): void;
removeAt(index: number): void;
toArray(): T[];
count(): number;
getEnumerator(): IEnumerator<T>;
}
class ListEnumerator<T> implements IEnumerator<T> {
private _list: IList<T>;
private _index: number = -1;
constructor(list: IList<T>) {
this._list = list;
}
public get current(): T {
return this._list.toArray()[this._index];
}
public moveNext(): boolean {
this._index++;
return this._index < this._list.count();
}
public reset(): void {
this._index = -1;
}
}
class List<T> implements IList<T> {
private _items: T[] = [];
public add(item: T): void {
this._items.push(item);
}
public addRange(items: T[]): void {
this._items = this._items.concat(items);
}
public clear(): void {
this._items = [];
}
public contains(item: T): boolean {
return this.indexOf(item) !== -1;
}
public indexOf(item: T): number {
return this._items.indexOf(item);
}
public insert(index: number, item: T): void {
this._items.splice(index, 0, item);
}
public remove(item: T): void {
var index = this.indexOf(item);
if (index !== -1) {
this.removeAt(index);
}
}
public removeAt(index: number): void {
this._items.splice(index, 1);
}
public toArray(): T[] {
return this._items;
}
public count(): number {
return this._items.length;
}
public getEnumerator(): IEnumerator<T> {
return new ListEnumerator(this);
}
public static fromArray<T>(items: T[]): List<T> {
var list = new List<T>();
list.addRange(items);
return list;
}
public static fromEnumerator<T>(enumerator: IEnumerator<T>): List<T> {
var list = new List<T>();
while (enumerator.moveNext()) {
list.add(enumerator.current);
}
return list;
}
public static fromObject<T>(obj: any): List<T> {
var list = new List<T>();
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
list.add(obj[key]);
}
}
return list;
}
}
export { List, ListEnumerator, IList, IEnumerator };