VisitStats.of constructor

VisitStats.of(
  1. List<Stay> stays,
  2. DateTime now, {
  3. int days = 14,
})

Counts stays over the days calendar days that end with now's.

Implementation

factory VisitStats.of(List<Stay> stays, DateTime now, {int days = 14}) {
  // Calendar dates as UTC midnights, so a daylight-saving day still counts as one.
  DateTime date(DateTime t) => DateTime.utc(t.year, t.month, t.day);
  final today = date(now);
  final perDay = List<int>.filled(days, 0);
  final perHour = List<int>.filled(24, 0);
  var stayed = Duration.zero;
  var left = 0;
  for (final stay in stays) {
    final back = today.difference(date(stay.arrived)).inDays;
    if (back < 0 || back >= days) {
      continue;
    }
    perDay[days - 1 - back]++;
    perHour[stay.arrived.hour]++;
    if (stay.stayed case final s?) {
      stayed += s;
      left++;
    }
  }
  return VisitStats._(
    days: days,
    perDay: perDay,
    perHour: perHour,
    averageStay: left == 0 ? null : stayed ~/ left,
  );
}