-
Notifications
You must be signed in to change notification settings - Fork 1
/
BaseZoomGrids.ts
119 lines (106 loc) · 2.06 KB
/
BaseZoomGrids.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
import { TreeSet } from 'tstl';
import { BaseGrid } from './BaseGrid';
/**
* Zoom Level Matching Grids
*
* @param <T>
* grid type
*/
export class BaseZoomGrids<T extends BaseGrid> implements IterableIterator<T> {
/**
* Zoom level
*/
private readonly zoom: number;
/**
* Grids
*/
protected readonly grids = new TreeSet<T>();
private beginIterator: TreeSet.Iterator<T>;
/**
* Constructor
*
* @param zoom
* zoom level
*/
constructor(zoom: number) {
this.zoom = zoom;
this.beginIterator = this.grids.begin();
}
/**
* Get the zoom level
*
* @return zoom level
*/
public getZoom(): number {
return this.zoom;
}
/**
* Get the grids within the zoom level
*
* @return grids
*/
public getGrids(): TreeSet<T> {
return this.grids;
}
/**
* Get the number of grids
*
* @return number of grids
*/
public numGrids(): number {
return this.grids.size();
}
/**
* Determine if the zoom level has grids
*
* @return true if has grids
*/
public hasGrids(): boolean {
return !this.grids.empty();
}
/**
* Add a grid
*
* @param grid
* grid
* @return true if added
*/
public addGrid(grid: T): boolean {
const result = this.grids.push(grid) > 0;
this.reset();
return result;
}
/**
* Remove the grid
*
* @param grid
* grid
* @return true if removed
*/
public removeGrid(grid: T): boolean {
const result = this.grids.erase(grid) > 0;
this.reset();
return result;
}
public next(): IteratorResult<T> {
if (!this.beginIterator.equals(this.grids.end())) {
const result = this.beginIterator.value;
this.beginIterator = this.beginIterator.next();
return {
done: false,
value: result,
};
} else {
return {
done: true,
value: undefined,
};
}
}
public reset(): void {
this.beginIterator = this.grids.begin();
}
[Symbol.iterator](): IterableIterator<T> {
return this;
}
}