package model; import java.util.HashMap; import java.util.Map; import java.util.function.BiFunction; public class Statistics { private final Map counters; private final Map measurements; private final Map attributes; private final T context; public Statistics(T context) { this.context = context; this.counters = new HashMap<>(); this.measurements = new HashMap<>(); this.attributes = new HashMap<>(); } public void increment(String key) { counters.merge(key, 1, Integer::sum); } public void increment(String key, int delta) { counters.merge(key, delta, Integer::sum); } public void record(String key, double value) { measurements.put(key, value); } public void record(String key, String value) { attributes.put(key, value); } public int getCount(String key) { return counters.getOrDefault(key, 0); } public double getMeasurement(String key) { return measurements.getOrDefault(key, 0.0); } public String getAttribute(String key) { return attributes.get(key); } public Map getAllCounters() { return new HashMap<>(counters); } public Map getAllMeasurements() { return new HashMap<>(measurements); } public Map getAllAttributes() { return new HashMap<>(attributes); } public T getContext() { return context; } public void clear() { counters.clear(); measurements.clear(); attributes.clear(); } public String toString() { return String.format("Statistics{context=%s, counters=%s, measurements=%s}", context, counters, measurements); } }