trimmedMean function

double trimmedMean(
  1. List<num> values,
  2. double trim
)

Trimmed mean: drop trim fraction from each tail (0..0.5), then average.

Implementation

double trimmedMean(List<num> values, double trim) {
  if (values.isEmpty) return double.nan;
  if (trim <= 0) {
    return values.fold<double>(0, (double s, num v) => s + v.toDouble()) / values.length;
  }
  final List<num> sorted = List<num>.of(values)..sort();
  final int k = (sorted.length * trim.clamp(0.0, 0.5)).round();
  final int start = k;
  final int end = sorted.length - k;
  if (start >= end) return double.nan;
  double sum = 0;
  for (int i = start; i < end; i++) {
    sum += sorted[i].toDouble();
  }
  return sum / (end - start);
}