sclass DoubleMinMax {
  double min = Double.NaN, max = Double.NaN;
  
  bool isEmpty() { ret isNaN(min); }
  
  void add(double d) {
    if (isNaN(min) || d < min) min = d;
    if (isNaN(max) || d > max) max = d;
  }
  
  double rangeLength() { ret max-min; }
  
  toString { ret renderVars(+min, +max); }
  
  DoubleRange range() {
    ret isEmpty() ? null : doubleRange(min, max);
  }
}