listNextStopTimesForStop method

Future<({Set<String> routeIds, List<({Date date, String routeId, StopTime time, Trip trip})> stopTimes})> listNextStopTimesForStop(
  1. GtfsDataset dataset,
  2. Stop stop, {
  3. LoadCriterion? tripCriterion,
  4. LoadCriterion? stopTimesCriterion,
})

Implementation

Future<
  ({
    List<({StopTime time, Trip trip, Date date, String routeId})> stopTimes,
    Set<String> routeIds,
  })
>
listNextStopTimesForStop(
  GtfsDataset dataset,
  Stop stop, {
  LoadCriterion? tripCriterion,
  LoadCriterion? stopTimesCriterion,
}) async {
  final now = DateTime.now();
  final today = Date.fromDatetime(now);
  final next24Hours = now.add(Duration(days: 1));
  final tomorrow = Date.fromDatetime(next24Hours);

  final Map<String, List<StopTime>> tripIdsToCheck = {};

  await for (final stopTime in dataset.stopTimes.streamResource(
    LoadCriterion.and(
      stopTimesCriterion ?? LoadCriterion.passAll(),
      LoadCriterion([
        'stop_id',
      ], (requestedFields) => requestedFields[0] == stop.id),
    ),
  )) {
    tripIdsToCheck[stopTime.tripId] =
        tripIdsToCheck[stopTime.tripId] ?? [stopTime];
  }

  final totalActiveServices = await dataset.calendar.listServicesForDateRange(
    now,
    next24Hours,
  );

  final List<({StopTime time, Trip trip, Date date, String routeId})>
  foundStopTimes = [];

  final Set<String> routeIds = {};

  await for (final trip in dataset.trips.streamResource(
    LoadCriterion.and(
      tripCriterion ?? LoadCriterion.passAll(),
      LoadCriterion([
        'trip_id',
      ], (requestedFields) => tripIdsToCheck.containsKey(requestedFields[0])),
    ),
  )) {
    for (final day in [today, tomorrow]) {
      if (totalActiveServices[day]!.contains(trip.serviceId)) {
        for (final stopTime in tripIdsToCheck[trip.id]!) {
          final departureTime = stopTime.departureTime!.relativeToDate(day);
          if ((departureTime.isAtSameMomentAs(now) ||
                  departureTime.isAfter(now)) &&
              (departureTime.isAtSameMomentAs(next24Hours) ||
                  departureTime.isBefore(next24Hours))) {
            routeIds.add(trip.routeId);
            foundStopTimes.add((
              time: stopTime,
              trip: trip,
              date: day,
              routeId: trip.routeId,
            ));
          }
        }
      }
    }
  }

  return (routeIds: routeIds, stopTimes: foundStopTimes);
}