occurrencesIn method

Iterable<EventOccurrence<T>> occurrencesIn(
  1. DateRange range
)

Every occurrence that touches range.

Implementation

Iterable<EventOccurrence<T>> occurrencesIn(DateRange range) sync* {
  final from = range.start;
  final to = range.end.endOfDay;
  final rule = recurrence;
  if (status == EventStatus.cancelled) return;
  if (rule == null) {
    if (!end.isBefore(from) && !start.isAfter(to)) {
      yield EventOccurrence(this, start, end);
    }
    for (final extra in additionalDates) {
      final e = extra.add(duration);
      if (!e.isBefore(from) && !extra.isAfter(to)) yield EventOccurrence(this, extra, e);
    }
    return;
  }
  final len = duration;
  for (final extra in additionalDates) {
    final e = extra.add(len);
    if (!e.isBefore(from) && !extra.isAfter(to)) yield EventOccurrence(this, extra, e);
  }
  // Start a little early so occurrences that began before the range but
  // are still running are included.
  final lookBack = from.subtract(len);
  for (final s in rule.occurrences(start, exclude: exceptionDates)) {
    if (s.isAfter(to)) break;
    if (s.isBefore(lookBack)) continue;
    final e = s.add(len);
    if (!e.isBefore(from)) yield EventOccurrence(this, s, e);
  }
}