(*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *)

(** Timers for runtime statistics *)

type t = private
  { mutable ustart: float
  ; mutable sstart: float
  ; mutable uaggregate: float
  ; mutable saggregate: float
  ; mutable count: int
  ; mutable max: float
  ; mutable threshold: float
  ; name: string }

val create :
     ?at_exit:
       (   name:string
        -> elapsed:float
        -> aggregate:float
        -> count:int
        -> unit)
  -> string
  -> t
(** Construct a timer with the given name and register the given function to
    run at exit. The [at_exit] function receives [name]: the name of the
    timer passed to [create], [elapsed]: the number of milliseconds between
    the longest single [start]-[stop] pair, [aggregate]: the sum of the time
    that elapsed while the named timer was running, [count]: the number of
    times [stop] was called on the timer. *)

val start : t -> unit
(** Start a timer. *)

val stop : t -> unit
(** Stop a timer. *)

val stop_report :
     t
  -> (name:string -> elapsed:float -> aggregate:float -> count:int -> unit)
  -> unit
(** Stop a timer and report using the given function, which receives [name]:
    the name of the timer passed to [create], [elapsed]: the number of
    milliseconds since [start] was called, [aggregate]: the sum of the time
    that has elapsed while the timer was running, [count]: the number of
    times [stop] has been called on the timer. *)

val enabled : bool ref
(** Timers do nothing unless [enabled] is set. *)