-
Notifications
You must be signed in to change notification settings - Fork 2
/
classes.ts
129 lines (108 loc) · 3.49 KB
/
classes.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
124
125
126
127
128
129
class Interval {
// This is what we use when a place isn't open at all on a particular day
static none: [Interval] = [new Interval(-1, -1)];
private openingTime: number;
private closingTime: number;
constructor(open: number, close: number) {
this.openingTime = open;
this.closingTime = close;
}
// 1100
getOpen(): number {
return this.openingTime;
}
// "11:00am"
getOpenString(): string {
return stringifyHour(this.openingTime);
}
// 2530
getClose(): number {
return this.closingTime;
}
// "1:30am"
getCloseString(): string {
return stringifyHour(this.closingTime);
}
// [1100, 2530]
getInterval(): [number, number] {
return [this.openingTime, this.closingTime];
}
// "11:00am to 1:30am"
getIntervalString(): string {
if (this.getOpen() == 0 && this.getClose() == 2400) return "All day";
return this.getOpenString() + " to " + this.getCloseString();
}
}
interface PlaceWeekIntervalsJSON {
Sunday: Array<[number, number]>;
Monday: Array<[number, number]>;
Tuesday: Array<[number, number]>;
Wednesday: Array<[number, number]>;
Thursday: Array<[number, number]>;
Friday: Array<[number, number]>;
Saturday: Array<[number, number]>;
}
class Place {
private name: string;
private isOnCampus: boolean;
private Sunday: Interval[];
private Monday: Interval[];
private Tuesday: Interval[];
private Wednesday: Interval[];
private Thursday: Interval[];
private Friday: Interval[];
private Saturday: Interval[];
constructor(name: string, data: PlaceWeekIntervalsJSON) {
this.name = name;
this.isOnCampus = true;
Object.keys(data).forEach(dayName => {
if (data[dayName] === []) {
this[dayName] = Interval.none;
} else {
this[dayName] = data[dayName].map(interval => {
return new Interval(interval[0], interval[1]);
});
}
});
}
getName(): string {
return this.name;
}
getHoursForDay(d: number): Interval[] {
switch (d) {
case 0: return this.Sunday;
case 1: return this.Monday;
case 2: return this.Tuesday;
case 3: return this.Wednesday;
case 4: return this.Thursday;
case 5: return this.Friday;
case 6: return this.Saturday;
}
}
getHoursForYesterday(): Interval[] {
return this.getHoursForDay(((new Date()).getDay() - 1 + 7) % 7);
}
getHoursForToday(): Interval[] {
return this.getHoursForDay((new Date()).getDay());
}
getHoursForTomorrow(): Interval[] {
return this.getHoursForDay(((new Date()).getDay() + 1) % 7);
}
/* This function returns true if the Place is open right now, and
false otherwise. */
isOpenNow(): boolean {
var time: number = getExtendedTime();
// If we're dealing with 2500 (for example) we need to be looking at
// yesterday's open intervals, not today's.
if (time > 2400) {
var openings: Interval[] = this.getHoursForYesterday();
} else {
var openings: Interval[] = this.getHoursForToday();
}
for (var i=0; i<openings.length; i++) {
var x: Interval = openings[i];
if ((time > x.getOpen()) && (time < x.getClose())) return true;
}
return false;
}
}