code: package org.gridkit.jvmtool.stacktrace.analytics;
  
  import org.gridkit.jvmtool.stacktrace.ThreadSnapshot;
  
  class FrequencyAggregatorFactory implements ThreadDumpAggregator, ThreadDumpAggregatorFactory {
  
      @Override
      public ThreadDumpAggregator newInstance() {
          return new FrequencyAggregatorFactory();
      }
  
      long total;
      long minTs = Long.MAX_VALUE;
      long maxTs = Long.MIN_VALUE;
  
      @Override
      public void aggregate(ThreadSnapshot threadInfo) {
          ++total;
          minTs = Math.min(minTs, threadInfo.timestamp());
          maxTs = Math.max(maxTs, threadInfo.timestamp());
      }
  
      @Override
      public Object info() {
          if (total < 2) {
              return Double.NaN;
          }
          else {
              return 1000d * total / (maxTs - minTs);
          }
      }
  }
  