code: private Metric reduce(List<Metric> metrics) {
  		SystemAssert.requireArgument(metrics != null, "Cannot transform empty metric/metrics");
  
  		/*
  		 * if (metrics.isEmpty()) { return new Metric(defaultScope, defaultMetricName); }
  		 */
  		MetricDistiller distiller = new MetricDistiller();
  
  		distiller.distill(metrics);
  
  		Map<Long, List<Double>> collated = collate(metrics);
  		Map<Long, Double> minDatapoints = reduce(collated);
  		String newMetricName = distiller.getMetric() == null ? defaultMetricName : distiller.getMetric();
  		String newScopeName = distiller.getScope() == null ? defaultScope : distiller.getScope();
  		Metric newMetric = new Metric(newScopeName, newMetricName);
  
  		newMetric.setDisplayName(distiller.getDisplayName());
  		newMetric.setUnits(distiller.getUnits());
  		newMetric.setTags(distiller.getTags());
  		newMetric.setDatapoints(minDatapoints);
  		return newMetric;
  	}
docs: O(n * m), where n is the max number of data points and m is the number of metrics. This becomes O(n) as the number of data points becomes
  large.
  
  @param   metrics  The list of metrics to reduce.
  
  @return  The reduced metric.