-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstatic.ts
249 lines (226 loc) · 8.79 KB
/
static.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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
import { readFile } from "fs/promises";
import { parse } from "csv-parse/sync";
import {
Calendar,
CalendarDates,
Route,
Stop,
StopTime,
Trip
} from "./gtfs-static.js";
export let UQ_LAKES_STOP_ID: Stop["stop_id"];
export async function getStaticData() {
/**
* Gets the options used to parse the static data.
*/
function getParseOptions() {
return {
columns: true,
};
}
/**
* Gets stops relevant to UQ Lakes Station.
* @returns {Promise<Array<Stop>>} stops relevant to UQ Lakes Station
*/
async function getStops(): Promise<Array<Stop>> {
/**
* Parses a CSV string into an object.
*
* @param {string} stops CSV string
*/
function parseStops(stops: string) {
let options = getParseOptions();
return parse(stops, options)
}
/**
* Filters stops to those relevant to UQ Lakes Station.
*
* @param {Array<Stop>} stops all stops from the static data
*
* @returns {Array<Stop>} stops relevant to UQ Lakes Station
*/
function filterStops(stops: Array<Stop>): Array<Stop> {
return stops.filter(stop =>
stop.stop_name
&& /\.*UQ Lakes station\.*/.test(stop.stop_name)
&& /\d/.test(stop.stop_id));
}
let stops = await readFile("static-data/stops.txt");
let parsedStops = parseStops(stops.toString());
let result = filterStops(parsedStops);
UQ_LAKES_STOP_ID = result[0].stop_id;
return result;
}
/**
* Gets stop times relevant to UQ Lakes Station.
*
* @param {Array<Stop>} stops stops relevant to UQ Lakes Station
*
* @returns {Promise<Array<StopTime>>} stop times relevant to UQ Lakes Station
*/
async function getStopTimes(stops: Array<Stop>): Promise<Array<StopTime>> {
/**
* Parses a CSV string into an object.
*
* @param {string} stopTimes CSV string
*/
function parseStopTimes(stopTimes: string) {
let options = getParseOptions();
return parse(stopTimes, options)
}
/**
* Filters stop times to those relevant to UQ Lakes Station.
*
* @param {Array<StopTime>} stopTimes all stop times from the static data
* @param {Array<Stop>} stops stops relevant to UQ Lakes Station
*
* @returns {Array<StopTime>} stop times relevant to UQ Lakes Station
*/
function filterStopTimes(stopTimes: Array<StopTime>, stops: Array<Stop>): Array<StopTime> {
let stopIds = stops.map(stop => stop.stop_id);
return stopTimes.filter(stopTime => stopIds.includes(stopTime.stop_id));
}
let stopTimesFile = await readFile("static-data/stop_times.txt");
let parsedStopTimes = parseStopTimes(stopTimesFile.toString());
return filterStopTimes(parsedStopTimes, stops);
}
/**
* Gets trips relevant to UQ Lakes Station.
*
* @param {Array<StopTime>} stopTimes stop times relevant to UQ Lakes Station
*
* @returns {Promise<Array<Trip>>} trips relevant to UQ Lakes Station
*/
async function getTrips(stopTimes: Array<StopTime>): Promise<Array<Trip>> {
/**
* Parses a CSV string into an object.
*
* @param {string} trips CSV string
*/
function parseTrips(trips: string) {
let options = getParseOptions();
return parse(trips, options)
}
/**
* Filters trips to those relevant to UQ Lakes Station.
*
* @param {Array<Trip>} trips all trips from the static data
* @param {Array<StopTime>} stopTimes stop times relevant to UQ Lakes Station
*
* @returns {Array<Trip>} trips relevant to UQ Lakes Station
*/
function filterTrips(trips: Array<Trip>, stopTimes: Array<StopTime>): Array<Trip> {
let tripIds = stopTimes.map(stopTime => stopTime.trip_id);
return trips.filter(trip => tripIds.includes(trip.trip_id));
}
let tripsFile = await readFile("static-data/trips.txt");
let parsedTrips = parseTrips(tripsFile.toString());
return filterTrips(parsedTrips, stopTimes);
}
/**
* Gets calendar dates relevant to UQ Lakes Station.
*
* @param {Array<Trip>} trips trips relevant to UQ Lakes Station
*
* @returns {Promise<Array<CalendarDates>>} calendar dates relevant to UQ Lakes Station
*/
async function getCalendarDates(trips: Array<Trip>): Promise<Array<CalendarDates>> {
/**
* Parses a CSV string into an object.
*
* @param {string} calendarDates CSV string
*/
function parseCalendarDates(calendarDates: string) {
let options = getParseOptions();
return parse(calendarDates, options)
}
/**
* Filters calendar dates to those relevant to UQ Lakes Station.
*
* @param {Array<CalendarDates>} calendarDates all calendar dates from the static data
* @param {Array<Trip>} trips trips relevant to UQ Lakes Station
*
* @returns {Array<CalendarDates>} calendar dates relevant to UQ Lakes Station
*/
function filterCalendarDates(calendarDates: Array<CalendarDates>, trips: Array<Trip>): Array<CalendarDates> {
let serviceIds = trips.map(trip => trip.service_id);
return calendarDates.filter(date => serviceIds.includes(date.service_id));
}
let calendarDates = await readFile("static-data/calendar_dates.txt");
let parsedCalendarDates = parseCalendarDates(calendarDates.toString());
return filterCalendarDates(parsedCalendarDates, trips);
}
/**
* Gets calendar relevant to UQ Lakes Station.
*
* @param {Array<Trip>} trips trips relevant to UQ Lakes Station
*
* @returns {Promise<Array<Calendar>>} calendar relevant to UQ Lakes Station
*/
async function getCalendar(trips: Array<Trip>): Promise<Array<Calendar>> {
/**
* Parses a CSV string into an object.
*
* @param {string} calendar CSV string
*/
function parseCalendar(calendar: string) {
let options = getParseOptions();
return parse(calendar, options)
}
/**
* Filters calendar to those relevant to UQ Lakes Station.
*
* @param {Array<Calendar>} calendar all services from the static data
* @param {Array<Trip>} trips trips relevant to UQ Lakes Station
*
* @returns {Array<Calendar>} calendar relevant to UQ Lakes Station
*/
function filterCalendar(calendar: Array<Calendar>, trips: Array<Trip>): Array<Calendar> {
let serviceIds = trips.map(trip => trip.service_id);
return calendar.filter(service => serviceIds.includes(service.service_id));
}
let calendar = await readFile("static-data/calendar.txt");
let parsedCalendar = parseCalendar(calendar.toString());
return filterCalendar(parsedCalendar, trips);
}
/**
* Gets routes relevant to UQ Lakes Station.
*
* @param {Array<Trip>} trips trips relevant to UQ Lakes Station
*
* @returns {Promise<Array<Route>>} routes relevant to UQ Lakes Station
*/
async function getRoutes(trips: Array<Trip>): Promise<Array<Route>> {
/**
* Parses a CSV string into an object.
*
* @param {string} routes CSV string
*/
function parseRoutes(routes: string) {
let options = getParseOptions();
return parse(routes, options)
}
/**
* Filters routes to those relevant to UQ Lakes Station.
*
* @param {Array<Route>} routes all routes from the static data
* @param {Array<Trip>} trips trips relevant to UQ Lakes Station
*
* @returns {Array<Route>} routes relevant to UQ Lakes Station
*/
function filterRoutes(routes: Array<Route>, trips: Array<Trip>): Array<Route> {
let routeIds = trips.map(trip => trip.route_id);
return routes.filter(route => routeIds.includes(route.route_id));
}
let routes = await readFile("static-data/routes.txt");
let parsedRoutes = parseRoutes(routes.toString());
return filterRoutes(parsedRoutes, trips);
}
let stops = await getStops();
let stopTimes = await getStopTimes(stops);
let trips = await getTrips(stopTimes);
let calendarDates = await getCalendarDates(trips);
let calendar = await getCalendar(trips);
let routes = await getRoutes(trips);
return { stops, stopTimes, trips, calendarDates, calendar, routes };
}