# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import time


class Timer(object):
  '''A simple timer which starts when constructed and stops when Stop is called.
  '''

  def __init__(self):
    self._start = time.time()
    self._elapsed = None

  def Stop(self):
    '''Stops the timer. Must only be called once. Returns |self|.
    '''
    assert self._elapsed is None
    self._elapsed = time.time() - self._start
    return self

  def With(self, other):
    '''Returns a new stopped Timer with this Timer's elapsed time + |other|'s.
    Both Timers must already be stopped.
    '''
    assert self._elapsed is not None
    assert other._elapsed is not None
    self_and_other = Timer()
    self_and_other._start = min(self._start, other._start)
    self_and_other._elapsed = self._elapsed + other._elapsed
    return self_and_other

  def FormatElapsed(self):
    '''Returns the elapsed time as a string in a pretty format; as a whole
    number in either seconds or milliseconds depending on which is more
    appropriate. Must already be Stopped.
    '''
    assert self._elapsed is not None
    elapsed = self._elapsed
    if elapsed < 1:
      elapsed = int(elapsed * 1000)
      unit = 'ms'
    else:
      elapsed = int(elapsed)
      unit = 'second' if elapsed == 1 else 'seconds'
    return '%s %s' % (elapsed, unit)


def TimerClosure(closure, *args, **optargs):
  '''A shorthand for timing a single function call. Returns a tuple of
  (closure return value, timer).
  '''
  timer = Timer()
  try:
    return closure(*args, **optargs), timer
  finally:
    timer.Stop()