bucketSamples function

List<double?> bucketSamples(
  1. List<MetricSample> samples, {
  2. required DateTime from,
  3. required DateTime to,
  4. required int buckets,
})

Averages samples into buckets equal time slots between from and to. A slot without a sample is null, so a gap stays a gap.

Implementation

List<double?> bucketSamples(
  final List<MetricSample> samples, {
  required final DateTime from,
  required final DateTime to,
  required final int buckets,
}) {
  final int span = to.difference(from).inMicroseconds;
  if (buckets <= 0 || span <= 0) {
    return const [];
  }

  final List<double> sums = List<double>.filled(buckets, 0);
  final List<int> counts = List<int>.filled(buckets, 0);
  for (final MetricSample sample in samples) {
    final int offset = sample.timestamp.difference(from).inMicroseconds;
    if (offset < 0 || offset > span) {
      continue;
    }
    final int index = math.min(buckets - 1, offset * buckets ~/ span);
    sums[index] += sample.value;
    counts[index]++;
  }

  return [
    for (int i = 0; i < buckets; i++)
      counts[i] == 0 ? null : sums[i] / counts[i],
  ];
}