adjacentCourseDate function

DateTime? adjacentCourseDate(
  1. CourseTableData courseTable, {
  2. required DateTime date,
  3. required CourseDateDirection direction,
  4. CourseScheduleDateRange? dateRange,
})

Finds the nearest date with scheduled courses in direction.

The course table repeats weekly, so scanning seven dates is sufficient. When dateRange is provided, navigation stops at the semester boundaries. Returns null when the semester has no scheduled courses at all.

Implementation

DateTime? adjacentCourseDate(
  CourseTableData courseTable, {
  required DateTime date,
  required CourseDateDirection direction,
  CourseScheduleDateRange? dateRange,
}) {
  final scheduledDays = courseTable.scheduled.keys
      .map((slot) => slot.day)
      .toSet();
  if (scheduledDays.isEmpty) return null;

  final dayStep = switch (direction) {
    .previous => -1,
    .next => 1,
  };
  for (var distance = 1; distance <= DateTime.daysPerWeek; distance++) {
    final candidate = date.add(Duration(days: distance * dayStep));
    if (_isInDateRange(candidate, dateRange) &&
        scheduledDays.contains(_dayOfWeek(candidate))) {
      return _dateOnly(candidate);
    }
  }

  return null;
}