minotor 1.0.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +9 -3
  2. package/README.md +3 -2
  3. package/dist/cli.mjs +604 -531
  4. package/dist/cli.mjs.map +1 -1
  5. package/dist/gtfs/stops.d.ts +19 -5
  6. package/dist/gtfs/transfers.d.ts +5 -4
  7. package/dist/gtfs/trips.d.ts +7 -5
  8. package/dist/gtfs/utils.d.ts +7 -8
  9. package/dist/parser.cjs.js +569 -501
  10. package/dist/parser.cjs.js.map +1 -1
  11. package/dist/parser.esm.js +569 -501
  12. package/dist/parser.esm.js.map +1 -1
  13. package/dist/router.cjs.js +1 -1
  14. package/dist/router.cjs.js.map +1 -1
  15. package/dist/router.d.ts +3 -3
  16. package/dist/router.esm.js +1 -1
  17. package/dist/router.esm.js.map +1 -1
  18. package/dist/router.umd.js +1 -1
  19. package/dist/router.umd.js.map +1 -1
  20. package/dist/routing/__tests__/route.test.d.ts +1 -0
  21. package/dist/routing/query.d.ts +7 -7
  22. package/dist/routing/result.d.ts +3 -3
  23. package/dist/routing/route.d.ts +1 -0
  24. package/dist/stops/proto/stops.d.ts +5 -4
  25. package/dist/stops/stops.d.ts +10 -1
  26. package/dist/stops/stopsIndex.d.ts +21 -4
  27. package/dist/timetable/proto/timetable.d.ts +21 -18
  28. package/dist/timetable/timetable.d.ts +38 -14
  29. package/package.json +4 -3
  30. package/src/cli/repl.ts +13 -10
  31. package/src/gtfs/__tests__/parser.test.ts +50 -579
  32. package/src/gtfs/__tests__/stops.test.ts +181 -112
  33. package/src/gtfs/__tests__/transfers.test.ts +170 -12
  34. package/src/gtfs/__tests__/trips.test.ts +212 -141
  35. package/src/gtfs/__tests__/utils.test.ts +4 -4
  36. package/src/gtfs/parser.ts +22 -13
  37. package/src/gtfs/stops.ts +63 -28
  38. package/src/gtfs/transfers.ts +14 -6
  39. package/src/gtfs/trips.ts +110 -47
  40. package/src/gtfs/utils.ts +11 -11
  41. package/src/router.ts +2 -4
  42. package/src/routing/__tests__/route.test.ts +112 -0
  43. package/src/routing/__tests__/router.test.ts +234 -244
  44. package/src/routing/query.ts +7 -7
  45. package/src/routing/result.ts +9 -6
  46. package/src/routing/route.ts +11 -0
  47. package/src/routing/router.ts +26 -24
  48. package/src/stops/__tests__/io.test.ts +9 -8
  49. package/src/stops/__tests__/stopFinder.test.ts +45 -36
  50. package/src/stops/io.ts +8 -5
  51. package/src/stops/proto/stops.proto +8 -7
  52. package/src/stops/proto/stops.ts +68 -38
  53. package/src/stops/stops.ts +13 -1
  54. package/src/stops/stopsIndex.ts +50 -7
  55. package/src/timetable/__tests__/io.test.ts +40 -49
  56. package/src/timetable/__tests__/timetable.test.ts +50 -58
  57. package/src/timetable/io.ts +69 -56
  58. package/src/timetable/proto/timetable.proto +22 -17
  59. package/src/timetable/proto/timetable.ts +94 -184
  60. package/src/timetable/timetable.ts +62 -29
@@ -22,40 +22,36 @@ describe('Router', () => {
22
22
 
23
23
  beforeEach(() => {
24
24
  const stopsAdjacency: StopsAdjacency = new Map([
25
- ['stop1', { transfers: [], routes: ['route1'] }],
26
- ['stop2', { transfers: [], routes: ['route1'] }],
27
- ['stop3', { transfers: [], routes: ['route1'] }],
25
+ [0, { transfers: [], routes: ['route1'] }],
26
+ [1, { transfers: [], routes: ['route1'] }],
27
+ [2, { transfers: [], routes: ['route1'] }],
28
28
  ]);
29
29
 
30
30
  const routesAdjacency: RoutesAdjacency = new Map([
31
31
  [
32
32
  'route1',
33
33
  {
34
- stopTimes: [
35
- {
36
- arrival: Time.fromString('08:00:00'),
37
- departure: Time.fromString('08:10:00'),
38
- pickUpType: 'REGULAR',
39
- dropOffType: 'REGULAR',
40
- },
41
- {
42
- arrival: Time.fromString('08:15:00'),
43
- departure: Time.fromString('08:25:00'),
44
- pickUpType: 'REGULAR',
45
- dropOffType: 'REGULAR',
46
- },
47
- {
48
- arrival: Time.fromString('08:35:00'),
49
- departure: Time.fromString('08:45:00'),
50
- pickUpType: 'REGULAR',
51
- dropOffType: 'REGULAR',
52
- },
53
- ],
54
- stops: ['stop1', 'stop2', 'stop3'],
34
+ stopTimes: new Uint32Array([
35
+ Time.fromString('08:00:00').toSeconds(),
36
+ Time.fromString('08:10:00').toSeconds(),
37
+ Time.fromString('08:15:00').toSeconds(),
38
+ Time.fromString('08:25:00').toSeconds(),
39
+ Time.fromString('08:35:00').toSeconds(),
40
+ Time.fromString('08:45:00').toSeconds(),
41
+ ]),
42
+ pickUpDropOffTypes: new Uint8Array([
43
+ 0,
44
+ 0, // REGULAR
45
+ 0,
46
+ 0, // REGULAR
47
+ 0,
48
+ 0, // REGULAR
49
+ ]),
50
+ stops: new Uint32Array([0, 1, 2]),
55
51
  stopIndices: new Map([
56
- ['stop1', 0],
57
- ['stop2', 1],
58
- ['stop3', 2],
52
+ [0, 0],
53
+ [1, 1],
54
+ [2, 2],
59
55
  ]),
60
56
  serviceRouteId: 'service_route1',
61
57
  },
@@ -75,9 +71,10 @@ describe('Router', () => {
75
71
  timetable = new Timetable(stopsAdjacency, routesAdjacency, routes);
76
72
  const stopsMap: StopsMap = new Map([
77
73
  [
78
- 'stop1',
74
+ 0,
79
75
  {
80
- id: 'stop1',
76
+ id: 0,
77
+ sourceStopId: 'stop1',
81
78
  name: 'Stop 1',
82
79
  lat: 1.0,
83
80
  lon: 1.0,
@@ -86,9 +83,10 @@ describe('Router', () => {
86
83
  },
87
84
  ],
88
85
  [
89
- 'stop2',
86
+ 1,
90
87
  {
91
- id: 'stop2',
88
+ id: 1,
89
+ sourceStopId: 'stop2',
92
90
  name: 'Stop 2',
93
91
  lat: 2.0,
94
92
  lon: 2.0,
@@ -97,9 +95,10 @@ describe('Router', () => {
97
95
  },
98
96
  ],
99
97
  [
100
- 'stop3',
98
+ 2,
101
99
  {
102
- id: 'stop3',
100
+ id: 2,
101
+ sourceStopId: 'stop3',
103
102
  name: 'Stop 3',
104
103
  lat: 3.0,
105
104
  lon: 3.0,
@@ -159,42 +158,37 @@ describe('Router', () => {
159
158
 
160
159
  beforeEach(() => {
161
160
  const stopsAdjacency: StopsAdjacency = new Map([
162
- ['stop1', { transfers: [], routes: ['route1'] }],
163
- ['stop2', { transfers: [], routes: ['route1', 'route2'] }],
164
- ['stop3', { transfers: [], routes: ['route1'] }],
165
- ['stop4', { transfers: [], routes: ['route2'] }],
166
- ['stop5', { transfers: [], routes: ['route2'] }],
161
+ [0, { transfers: [], routes: ['route1'] }],
162
+ [1, { transfers: [], routes: ['route1', 'route2'] }],
163
+ [2, { transfers: [], routes: ['route1'] }],
164
+ [3, { transfers: [], routes: ['route2'] }],
165
+ [4, { transfers: [], routes: ['route2'] }],
167
166
  ]);
168
-
169
167
  const routesAdjacency: RoutesAdjacency = new Map([
170
168
  [
171
169
  'route1',
172
170
  {
173
- stopTimes: [
174
- {
175
- arrival: Time.fromString('08:00:00'),
176
- departure: Time.fromString('08:15:00'),
177
- pickUpType: 'REGULAR',
178
- dropOffType: 'REGULAR',
179
- },
180
- {
181
- arrival: Time.fromString('08:30:00'),
182
- departure: Time.fromString('08:45:00'),
183
- pickUpType: 'REGULAR',
184
- dropOffType: 'REGULAR',
185
- },
186
- {
187
- arrival: Time.fromString('09:00:00'),
188
- departure: Time.fromString('09:10:00'),
189
- pickUpType: 'REGULAR',
190
- dropOffType: 'REGULAR',
191
- },
192
- ],
193
- stops: ['stop1', 'stop2', 'stop3'],
171
+ stopTimes: new Uint32Array([
172
+ Time.fromString('08:00:00').toSeconds(),
173
+ Time.fromString('08:15:00').toSeconds(),
174
+ Time.fromString('08:30:00').toSeconds(),
175
+ Time.fromString('08:45:00').toSeconds(),
176
+ Time.fromString('09:00:00').toSeconds(),
177
+ Time.fromString('09:10:00').toSeconds(),
178
+ ]),
179
+ pickUpDropOffTypes: new Uint8Array([
180
+ 0, // REGULAR
181
+ 0, // REGULAR
182
+ 0, // REGULAR
183
+ 0, // REGULAR
184
+ 0, // REGULAR
185
+ 0, // REGULAR
186
+ ]),
187
+ stops: new Uint32Array([0, 1, 2]),
194
188
  stopIndices: new Map([
195
- ['stop1', 0],
196
- ['stop2', 1],
197
- ['stop3', 2],
189
+ [0, 0],
190
+ [1, 1],
191
+ [2, 2],
198
192
  ]),
199
193
  serviceRouteId: 'service_route1',
200
194
  },
@@ -202,31 +196,27 @@ describe('Router', () => {
202
196
  [
203
197
  'route2',
204
198
  {
205
- stopTimes: [
206
- {
207
- arrival: Time.fromString('08:05:00'),
208
- departure: Time.fromString('08:20:00'),
209
- pickUpType: 'REGULAR',
210
- dropOffType: 'REGULAR',
211
- },
212
- {
213
- arrival: Time.fromString('09:00:00'),
214
- departure: Time.fromString('09:15:00'),
215
- pickUpType: 'REGULAR',
216
- dropOffType: 'REGULAR',
217
- },
218
- {
219
- arrival: Time.fromString('09:20:00'),
220
- departure: Time.fromString('09:35:00'),
221
- pickUpType: 'REGULAR',
222
- dropOffType: 'REGULAR',
223
- },
224
- ],
225
- stops: ['stop4', 'stop2', 'stop5'],
199
+ stopTimes: new Uint32Array([
200
+ Time.fromString('08:05:00').toSeconds(),
201
+ Time.fromString('08:20:00').toSeconds(),
202
+ Time.fromString('09:00:00').toSeconds(),
203
+ Time.fromString('09:15:00').toSeconds(),
204
+ Time.fromString('09:20:00').toSeconds(),
205
+ Time.fromString('09:35:00').toSeconds(),
206
+ ]),
207
+ pickUpDropOffTypes: new Uint8Array([
208
+ 0, // REGULAR
209
+ 0, // REGULAR
210
+ 0, // REGULAR
211
+ 0, // REGULAR
212
+ 0, // REGULAR
213
+ 0, // REGULAR
214
+ ]),
215
+ stops: new Uint32Array([3, 1, 4]),
226
216
  stopIndices: new Map([
227
- ['stop4', 0],
228
- ['stop2', 1],
229
- ['stop5', 2],
217
+ [3, 0],
218
+ [1, 1],
219
+ [4, 2],
230
220
  ]),
231
221
  serviceRouteId: 'service_route2',
232
222
  },
@@ -251,11 +241,13 @@ describe('Router', () => {
251
241
  ]);
252
242
 
253
243
  timetable = new Timetable(stopsAdjacency, routesAdjacency, routes);
244
+
254
245
  const stopsMap: StopsMap = new Map([
255
246
  [
256
- 'stop1',
247
+ 0,
257
248
  {
258
- id: 'stop1',
249
+ id: 0,
250
+ sourceStopId: 'stop1',
259
251
  name: 'Stop 1',
260
252
  lat: 1.0,
261
253
  lon: 1.0,
@@ -264,9 +256,10 @@ describe('Router', () => {
264
256
  },
265
257
  ],
266
258
  [
267
- 'stop2',
259
+ 1,
268
260
  {
269
- id: 'stop2',
261
+ id: 1,
262
+ sourceStopId: 'stop2',
270
263
  name: 'Stop 2',
271
264
  lat: 2.0,
272
265
  lon: 2.0,
@@ -275,9 +268,10 @@ describe('Router', () => {
275
268
  },
276
269
  ],
277
270
  [
278
- 'stop3',
271
+ 2,
279
272
  {
280
- id: 'stop3',
273
+ id: 2,
274
+ sourceStopId: 'stop3',
281
275
  name: 'Stop 3',
282
276
  lat: 3.0,
283
277
  lon: 3.0,
@@ -286,9 +280,10 @@ describe('Router', () => {
286
280
  },
287
281
  ],
288
282
  [
289
- 'stop4',
283
+ 3,
290
284
  {
291
- id: 'stop4',
285
+ id: 3,
286
+ sourceStopId: 'stop4',
292
287
  name: 'Stop 4',
293
288
  lat: 4.0,
294
289
  lon: 4.0,
@@ -297,9 +292,10 @@ describe('Router', () => {
297
292
  },
298
293
  ],
299
294
  [
300
- 'stop5',
295
+ 4,
301
296
  {
302
- id: 'stop5',
297
+ id: 4,
298
+ sourceStopId: 'stop5',
303
299
  name: 'Stop 5',
304
300
  lat: 5.0,
305
301
  lon: 5.0,
@@ -308,6 +304,7 @@ describe('Router', () => {
308
304
  },
309
305
  ],
310
306
  ]);
307
+
311
308
  const stopsIndex = new StopsIndex(stopsMap);
312
309
  router = new Router(timetable, stopsIndex);
313
310
  });
@@ -347,13 +344,13 @@ describe('Router', () => {
347
344
 
348
345
  beforeEach(() => {
349
346
  const stopsAdjacency: StopsAdjacency = new Map([
350
- ['stop1', { transfers: [], routes: ['route1'] }],
347
+ [0, { transfers: [], routes: ['route1'] }],
351
348
  [
352
- 'stop2',
349
+ 1,
353
350
  {
354
351
  transfers: [
355
352
  {
356
- destination: 'stop5',
353
+ destination: 4,
357
354
  type: 'REQUIRES_MINIMAL_TIME',
358
355
  minTransferTime: Duration.fromSeconds(300),
359
356
  },
@@ -361,41 +358,37 @@ describe('Router', () => {
361
358
  routes: ['route1'],
362
359
  },
363
360
  ],
364
- ['stop3', { transfers: [], routes: ['route1'] }],
365
- ['stop4', { transfers: [], routes: ['route2'] }],
366
- ['stop5', { transfers: [], routes: ['route2'] }],
367
- ['stop6', { transfers: [], routes: ['route2'] }],
361
+ [2, { transfers: [], routes: ['route1'] }],
362
+ [3, { transfers: [], routes: ['route2'] }],
363
+ [4, { transfers: [], routes: ['route2'] }],
364
+ [5, { transfers: [], routes: ['route2'] }],
368
365
  ]);
369
366
 
370
367
  const routesAdjacency: RoutesAdjacency = new Map([
371
368
  [
372
369
  'route1',
373
370
  {
374
- stopTimes: [
375
- {
376
- arrival: Time.fromString('08:00:00'),
377
- departure: Time.fromString('08:15:00'),
378
- pickUpType: 'REGULAR',
379
- dropOffType: 'REGULAR',
380
- },
381
- {
382
- arrival: Time.fromString('08:25:00'),
383
- departure: Time.fromString('08:35:00'),
384
- pickUpType: 'REGULAR',
385
- dropOffType: 'REGULAR',
386
- },
387
- {
388
- arrival: Time.fromString('08:45:00'),
389
- departure: Time.fromString('08:55:00'),
390
- pickUpType: 'REGULAR',
391
- dropOffType: 'REGULAR',
392
- },
393
- ],
394
- stops: ['stop1', 'stop2', 'stop3'],
371
+ stopTimes: new Uint32Array([
372
+ Time.fromString('08:00:00').toSeconds(),
373
+ Time.fromString('08:15:00').toSeconds(),
374
+ Time.fromString('08:25:00').toSeconds(),
375
+ Time.fromString('08:35:00').toSeconds(),
376
+ Time.fromString('08:45:00').toSeconds(),
377
+ Time.fromString('08:55:00').toSeconds(),
378
+ ]),
379
+ pickUpDropOffTypes: new Uint8Array([
380
+ 0, // REGULAR
381
+ 0, // REGULAR
382
+ 0, // REGULAR
383
+ 0, // REGULAR
384
+ 0, // REGULAR
385
+ 0, // REGULAR
386
+ ]),
387
+ stops: new Uint32Array([0, 1, 2]),
395
388
  stopIndices: new Map([
396
- ['stop1', 0],
397
- ['stop2', 1],
398
- ['stop3', 2],
389
+ [0, 0],
390
+ [1, 1],
391
+ [2, 2],
399
392
  ]),
400
393
  serviceRouteId: 'service_route1',
401
394
  },
@@ -403,31 +396,27 @@ describe('Router', () => {
403
396
  [
404
397
  'route2',
405
398
  {
406
- stopTimes: [
407
- {
408
- arrival: Time.fromString('08:10:00'),
409
- departure: Time.fromString('08:20:00'),
410
- pickUpType: 'REGULAR',
411
- dropOffType: 'REGULAR',
412
- },
413
- {
414
- arrival: Time.fromString('08:40:00'),
415
- departure: Time.fromString('08:50:00'),
416
- pickUpType: 'REGULAR',
417
- dropOffType: 'REGULAR',
418
- },
419
- {
420
- arrival: Time.fromString('09:00:00'),
421
- departure: Time.fromString('09:10:00'),
422
- pickUpType: 'REGULAR',
423
- dropOffType: 'REGULAR',
424
- },
425
- ],
426
- stops: ['stop4', 'stop5', 'stop6'],
399
+ stopTimes: new Uint32Array([
400
+ Time.fromString('08:10:00').toSeconds(),
401
+ Time.fromString('08:20:00').toSeconds(),
402
+ Time.fromString('08:40:00').toSeconds(),
403
+ Time.fromString('08:50:00').toSeconds(),
404
+ Time.fromString('09:00:00').toSeconds(),
405
+ Time.fromString('09:10:00').toSeconds(),
406
+ ]),
407
+ pickUpDropOffTypes: new Uint8Array([
408
+ 0, // REGULAR
409
+ 0, // REGULAR
410
+ 0, // REGULAR
411
+ 0, // REGULAR
412
+ 0, // REGULAR
413
+ 0, // REGULAR
414
+ ]),
415
+ stops: new Uint32Array([3, 4, 5]),
427
416
  stopIndices: new Map([
428
- ['stop4', 0],
429
- ['stop5', 1],
430
- ['stop6', 2],
417
+ [3, 0],
418
+ [4, 1],
419
+ [5, 2],
431
420
  ]),
432
421
  serviceRouteId: 'service_route2',
433
422
  },
@@ -454,9 +443,10 @@ describe('Router', () => {
454
443
  timetable = new Timetable(stopsAdjacency, routesAdjacency, routes);
455
444
  const stopsMap: StopsMap = new Map([
456
445
  [
457
- 'stop1',
446
+ 0,
458
447
  {
459
- id: 'stop1',
448
+ id: 0,
449
+ sourceStopId: 'stop1',
460
450
  name: 'Stop 1',
461
451
  lat: 1.0,
462
452
  lon: 1.0,
@@ -465,9 +455,10 @@ describe('Router', () => {
465
455
  },
466
456
  ],
467
457
  [
468
- 'stop2',
458
+ 1,
469
459
  {
470
- id: 'stop2',
460
+ id: 1,
461
+ sourceStopId: 'stop2',
471
462
  name: 'Stop 2',
472
463
  lat: 2.0,
473
464
  lon: 2.0,
@@ -476,9 +467,10 @@ describe('Router', () => {
476
467
  },
477
468
  ],
478
469
  [
479
- 'stop3',
470
+ 2,
480
471
  {
481
- id: 'stop3',
472
+ id: 2,
473
+ sourceStopId: 'stop3',
482
474
  name: 'Stop 3',
483
475
  lat: 3.0,
484
476
  lon: 3.0,
@@ -487,9 +479,10 @@ describe('Router', () => {
487
479
  },
488
480
  ],
489
481
  [
490
- 'stop4',
482
+ 3,
491
483
  {
492
- id: 'stop4',
484
+ id: 3,
485
+ sourceStopId: 'stop4',
493
486
  name: 'Stop 4',
494
487
  lat: 4.0,
495
488
  lon: 4.0,
@@ -498,9 +491,10 @@ describe('Router', () => {
498
491
  },
499
492
  ],
500
493
  [
501
- 'stop5',
494
+ 4,
502
495
  {
503
- id: 'stop5',
496
+ id: 4,
497
+ sourceStopId: 'stop5',
504
498
  name: 'Stop 5',
505
499
  lat: 5.0,
506
500
  lon: 5.0,
@@ -509,9 +503,10 @@ describe('Router', () => {
509
503
  },
510
504
  ],
511
505
  [
512
- 'stop6',
506
+ 5,
513
507
  {
514
- id: 'stop6',
508
+ id: 5,
509
+ sourceStopId: 'stop6',
515
510
  name: 'Stop 6',
516
511
  lat: 6.0,
517
512
  lon: 6.0,
@@ -559,42 +554,38 @@ describe('Router', () => {
559
554
 
560
555
  beforeEach(() => {
561
556
  const stopsAdjacency: StopsAdjacency = new Map([
562
- ['stop1', { transfers: [], routes: ['route1'] }],
563
- ['stop2', { transfers: [], routes: ['route1', 'route2'] }],
564
- ['stop3', { transfers: [], routes: ['route1'] }],
565
- ['stop4', { transfers: [], routes: ['route2'] }],
566
- ['stop5', { transfers: [], routes: ['route2'] }],
557
+ [0, { transfers: [], routes: ['route1'] }],
558
+ [1, { transfers: [], routes: ['route1', 'route2'] }],
559
+ [2, { transfers: [], routes: ['route1'] }],
560
+ [3, { transfers: [], routes: ['route2'] }],
561
+ [4, { transfers: [], routes: ['route2'] }],
567
562
  ]);
568
563
 
569
564
  const routesAdjacency: RoutesAdjacency = new Map([
570
565
  [
571
566
  'route1',
572
567
  {
573
- stopTimes: [
574
- {
575
- arrival: Time.fromString('08:00:00'),
576
- departure: Time.fromString('08:15:00'),
577
- pickUpType: 'REGULAR',
578
- dropOffType: 'REGULAR',
579
- },
580
- {
581
- arrival: Time.fromString('08:30:00'),
582
- departure: Time.fromString('08:45:00'),
583
- pickUpType: 'REGULAR',
584
- dropOffType: 'REGULAR',
585
- },
586
- {
587
- arrival: Time.fromString('09:00:00'),
588
- departure: Time.fromString('09:15:00'),
589
- pickUpType: 'REGULAR',
590
- dropOffType: 'REGULAR',
591
- },
592
- ],
593
- stops: ['stop1', 'stop2', 'stop3'],
568
+ stopTimes: new Uint32Array([
569
+ Time.fromString('08:00:00').toSeconds(),
570
+ Time.fromString('08:15:00').toSeconds(),
571
+ Time.fromString('08:30:00').toSeconds(),
572
+ Time.fromString('08:45:00').toSeconds(),
573
+ Time.fromString('09:00:00').toSeconds(),
574
+ Time.fromString('09:15:00').toSeconds(),
575
+ ]),
576
+ pickUpDropOffTypes: new Uint8Array([
577
+ 0, // REGULAR
578
+ 0, // REGULAR
579
+ 0, // REGULAR
580
+ 0, // REGULAR
581
+ 0, // REGULAR
582
+ 0, // REGULAR
583
+ ]),
584
+ stops: new Uint32Array([0, 1, 2]),
594
585
  stopIndices: new Map([
595
- ['stop1', 0],
596
- ['stop2', 1],
597
- ['stop3', 2],
586
+ [0, 0],
587
+ [1, 1],
588
+ [2, 2],
598
589
  ]),
599
590
  serviceRouteId: 'service_route1',
600
591
  },
@@ -602,31 +593,27 @@ describe('Router', () => {
602
593
  [
603
594
  'route2',
604
595
  {
605
- stopTimes: [
606
- {
607
- arrival: Time.fromString('08:10:00'),
608
- departure: Time.fromString('08:25:00'),
609
- pickUpType: 'REGULAR',
610
- dropOffType: 'REGULAR',
611
- },
612
- {
613
- arrival: Time.fromString('08:50:00'),
614
- departure: Time.fromString('09:05:00'),
615
- pickUpType: 'REGULAR',
616
- dropOffType: 'REGULAR',
617
- },
618
- {
619
- arrival: Time.fromString('09:10:00'),
620
- departure: Time.fromString('09:25:00'),
621
- pickUpType: 'REGULAR',
622
- dropOffType: 'REGULAR',
623
- },
624
- ],
625
- stops: ['stop4', 'stop2', 'stop5'],
596
+ stopTimes: new Uint32Array([
597
+ Time.fromString('08:10:00').toSeconds(),
598
+ Time.fromString('08:25:00').toSeconds(),
599
+ Time.fromString('08:50:00').toSeconds(),
600
+ Time.fromString('09:05:00').toSeconds(),
601
+ Time.fromString('09:10:00').toSeconds(),
602
+ Time.fromString('09:25:00').toSeconds(),
603
+ ]),
604
+ pickUpDropOffTypes: new Uint8Array([
605
+ 0, // REGULAR
606
+ 0, // REGULAR
607
+ 0, // REGULAR
608
+ 0, // REGULAR
609
+ 0, // REGULAR
610
+ 0, // REGULAR
611
+ ]),
612
+ stops: new Uint32Array([3, 1, 4]),
626
613
  stopIndices: new Map([
627
- ['stop4', 0],
628
- ['stop2', 1],
629
- ['stop5', 2],
614
+ [3, 0],
615
+ [1, 1],
616
+ [4, 2],
630
617
  ]),
631
618
  serviceRouteId: 'service_route2',
632
619
  },
@@ -634,24 +621,22 @@ describe('Router', () => {
634
621
  [
635
622
  'route3',
636
623
  {
637
- stopTimes: [
638
- {
639
- arrival: Time.fromString('08:00:00'),
640
- departure: Time.fromString('08:15:00'),
641
- pickUpType: 'REGULAR',
642
- dropOffType: 'REGULAR',
643
- },
644
- {
645
- arrival: Time.fromString('09:45:00'),
646
- departure: Time.fromString('10:00:00'),
647
- pickUpType: 'REGULAR',
648
- dropOffType: 'REGULAR',
649
- },
650
- ],
651
- stops: ['stop1', 'stop5'],
624
+ stopTimes: new Uint32Array([
625
+ Time.fromString('08:00:00').toSeconds(),
626
+ Time.fromString('08:15:00').toSeconds(),
627
+ Time.fromString('09:45:00').toSeconds(),
628
+ Time.fromString('10:00:00').toSeconds(),
629
+ ]),
630
+ pickUpDropOffTypes: new Uint8Array([
631
+ 0, // REGULAR
632
+ 0, // REGULAR
633
+ 0, // REGULAR
634
+ 0, // REGULAR
635
+ ]),
636
+ stops: new Uint32Array([0, 4]),
652
637
  stopIndices: new Map([
653
- ['stop1', 0],
654
- ['stop5', 1],
638
+ [0, 0],
639
+ [4, 1],
655
640
  ]),
656
641
  serviceRouteId: 'service_route3',
657
642
  },
@@ -685,9 +670,10 @@ describe('Router', () => {
685
670
  timetable = new Timetable(stopsAdjacency, routesAdjacency, routes);
686
671
  const stopsMap: StopsMap = new Map([
687
672
  [
688
- 'stop1',
673
+ 0,
689
674
  {
690
- id: 'stop1',
675
+ id: 0,
676
+ sourceStopId: 'stop1',
691
677
  name: 'Stop 1',
692
678
  lat: 1.0,
693
679
  lon: 1.0,
@@ -696,9 +682,10 @@ describe('Router', () => {
696
682
  },
697
683
  ],
698
684
  [
699
- 'stop2',
685
+ 1,
700
686
  {
701
- id: 'stop2',
687
+ id: 1,
688
+ sourceStopId: 'stop2',
702
689
  name: 'Stop 2',
703
690
  lat: 2.0,
704
691
  lon: 2.0,
@@ -707,9 +694,10 @@ describe('Router', () => {
707
694
  },
708
695
  ],
709
696
  [
710
- 'stop3',
697
+ 2,
711
698
  {
712
- id: 'stop3',
699
+ id: 2,
700
+ sourceStopId: 'stop3',
713
701
  name: 'Stop 3',
714
702
  lat: 3.0,
715
703
  lon: 3.0,
@@ -718,9 +706,10 @@ describe('Router', () => {
718
706
  },
719
707
  ],
720
708
  [
721
- 'stop4',
709
+ 3,
722
710
  {
723
- id: 'stop4',
711
+ id: 3,
712
+ sourceStopId: 'stop4',
724
713
  name: 'Stop 4',
725
714
  lat: 4.0,
726
715
  lon: 4.0,
@@ -729,9 +718,10 @@ describe('Router', () => {
729
718
  },
730
719
  ],
731
720
  [
732
- 'stop5',
721
+ 4,
733
722
  {
734
- id: 'stop5',
723
+ id: 4,
724
+ sourceStopId: 'stop5',
735
725
  name: 'Stop 5',
736
726
  lat: 5.0,
737
727
  lon: 5.0,