import collections


class Track(object):
    """Track and summarize observations of metrics."""
    def __init__(self):
        self.data = collections.defaultdict(list)

    def add_observation(self, metric, value):
        self.data[metric].append(value)

    def summarize_and_reset(self, metric, op=sum):
        """Apply `op` on the current values for `metric`.

        This operation also resets the metric.

        Returns:
            a tuple (should_send, value)
        """
        try:
            values = self.data.pop(metric)
            return True, op(values)
        except KeyError:
            return False, None