docs: def calculate(self):
          """
          Calculate the overall counts of best, worst, fastest, slowest, total
          found, total not found and total runtime
  
          Results are returned in a dictionary with the above parameters as keys.
          """
          best, worst, fastest, slowest = (), (), (), ()
          found = notfound = total_time = 0
          for source, rec in self.source_stats.items():
              if not best or rec.successes > best[1]:
                  best = (source, rec.successes, rec.success_rate())
              if not worst or rec.successes < worst[1]:
                  worst = (source, rec.successes, rec.success_rate())
  
              avg_time = self.avg_time(source)
              if not fastest or (avg_time != 0 and avg_time < fastest[1]):
                  fastest = (source, avg_time)
              if not slowest or (avg_time != 0 and avg_time > slowest[1]):
                  slowest = (source, avg_time)
  
              found += rec.successes
              notfound += rec.fails
              total_time += sum(rec.runtimes)
  
          return {
              'best': best,
              'worst': worst,
              'fastest': fastest,
              'slowest': slowest,
              'found': found,
              'notfound': notfound,
              'total_time': total_time
          }