-# Helper function to display n/d and handle division by 0
-fun div(n: Int, d: Int): String
-do
- if d == 0 then return "na"
- return ((100*n/d).to_f/100.0).to_precision(2)
+# A MetricSet is a metric holder
+#
+# It purpose is to be extended with a metric collect service
+class MetricSet
+ type ELM: Object
+
+ # Metrics to compute
+ var metrics: Set[Metric] = new HashSet[Metric]
+
+ # Add a metric to the set
+ fun register(metrics: Metric...) do for metric in metrics do self.metrics.add(metric)
+
+ # Clear all results for all metrics
+ fun clear do for metric in metrics do metric.clear
+
+ # Collect all metrics for this set of class
+ fun collect(elements: Set[ELM]) do
+ for metric in metrics do metric.collect(elements)
+ end
+
+ # Pretty print the resuls in console
+ fun to_console(indent: Int, colors: Bool) do
+ for metric in metrics do metric.to_console(indent, colors)
+ end
+
+ # Export the metric set in CSV format
+ fun to_csv: CsvDocument do
+ var csv = new CsvDocument
+
+ csv.format = new CsvFormat('"', ';', "\n")
+
+ # set csv headers
+ csv.header.add("entry")
+ for metric in metrics do csv.header.add(metric.name)
+
+ # collect all entries to merge metric results
+ var entries = new HashSet[ELM]
+ for metric in metrics do
+ for entry in metric.values.keys do entries.add(entry)
+ end
+
+ # collect results
+ for entry in entries do
+ var line = [entry.to_s]
+ for metric in metrics do
+ if metric.has_element(entry) then
+ line.add(metric[entry].to_s)
+ else
+ line.add("n/a")
+ end
+ end
+ csv.records.add(line)
+ end
+ return csv
+ end