apply method

List<Location> apply(
  1. List<Location> locations
)

Filters a list of locations according to this query.

Implementation

List<Location> apply(List<Location> locations) {
  var filtered = locations.where((loc) {
    // Time range filter
    if (from != null && loc.timestamp.isBefore(from!)) return false;
    if (to != null && loc.timestamp.isAfter(to!)) return false;

    // Accuracy filter
    final accuracy = loc.coords.accuracy;
    if (minAccuracy != null && accuracy > minAccuracy!) {
      return false;
    }
    if (maxAccuracy != null && accuracy < maxAccuracy!) {
      return false;
    }

    // Motion filter
    if (isMoving != null && loc.isMoving != isMoving) return false;

    // Bounds filter
    if (bounds != null && !bounds!.contains(loc.coords)) return false;

    return true;
  }).toList();

  // Sort
  filtered.sort((a, b) {
    switch (sortOrder) {
      case LocationSortOrder.newestFirst:
        return b.timestamp.compareTo(a.timestamp);
      case LocationSortOrder.oldestFirst:
        return a.timestamp.compareTo(b.timestamp);
    }
  });

  // Pagination
  if (offset > 0 && offset < filtered.length) {
    filtered = filtered.sublist(offset);
  } else if (offset >= filtered.length) {
    filtered = [];
  }

  // Limit
  if (limit != null && limit! < filtered.length) {
    filtered = filtered.sublist(0, limit);
  }

  return filtered;
}