sig
  module type S = Timing_wheel_intf.S
  type 'a t = 'Timing_wheel.t
  type 'a timing_wheel = 'a t
  module Alarm :
    sig
      type 'a t = 'Timing_wheel.Alarm.t
      val at : 'a timing_wheel -> 'a t -> Time.t
      val key : 'a timing_wheel -> 'a t -> int
      val value : 'a timing_wheel -> 'a t -> 'a
      val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
    end
  val invariant :
    'Core_kernel.Invariant_intf.inv -> 'a t Core_kernel.Invariant_intf.inv
  module Level_bits :
    sig
      type t = Timing_wheel.Level_bits.t
      val invariant : t Core_kernel.Invariant_intf.inv
      val max_num_bits : int
      val create_exn : int list -> t
      val default : Word_size.t -> t
      val num_bits : t -> int
      val t_of_sexp : Sexplib.Sexp.t -> t
      val sexp_of_t : t -> Sexplib.Sexp.t
    end
  module Config :
    sig
      type t = Timing_wheel.Config.t
      val invariant : t Core_kernel.Invariant_intf.inv
      val create :
        ?alarm_precision:Time.Span.t -> ?level_bits:Level_bits.t -> unit -> t
      val alarm_precision : t -> Time.Span.t
      val level_bits : t -> Level_bits.t
      val default : t
      val durations : t -> Time.Span.t list
      val t_of_sexp : Sexplib.Sexp.t -> t
      val sexp_of_t : t -> Sexplib.Sexp.t
    end
  val create : config:Config.t -> start:Time.t -> 'a t
  val alarm_precision : 'a t -> Time.Span.t
  val now : 'a t -> Time.t
  val start : 'a t -> Time.t
  val is_empty : 'a t -> bool
  val length : 'a t -> int
  val iter : 'a t -> f:('Alarm.t -> unit) -> unit
  val interval_num : 'a t -> Time.t -> int
  val now_interval_num : 'a t -> int
  val interval_num_start : 'a t -> int -> Time.t
  val interval_start : 'a t -> Time.t -> Time.t
  val advance_clock :
    'a t -> to_:Time.t -> handle_fired:('Alarm.t -> unit) -> unit
  val alarm_upper_bound : 'a t -> Time.t
  val add : 'a t -> at:Time.t -> '-> 'Alarm.t
  val add_at_interval_num : 'a t -> at:int -> '-> 'Alarm.t
  val mem : 'a t -> 'Alarm.t -> bool
  val remove : 'a t -> 'Alarm.t -> unit
  val clear : 'a t -> unit
  val next_alarm_fires_at : 'a t -> Time.t option
  module Priority_queue :
    sig
      type 'a t = 'Timing_wheel.Priority_queue.t
      type 'a priority_queue = 'a t
      module Elt :
        sig
          type 'a t = 'Timing_wheel.Priority_queue.Elt.t
          val invariant :
            'a priority_queue -> 'Invariant.t -> 'a t Invariant.t
          val key : 'a priority_queue -> 'a t -> int
          val value : 'a priority_queue -> 'a t -> 'a
          val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
        end
      val invariant :
        'Core_kernel.Invariant_intf.inv ->
        'a t Core_kernel.Invariant_intf.inv
      val create : ?level_bits:Level_bits.t -> unit -> 'a t
      val length : 'a t -> int
      val is_empty : 'a t -> bool
      val max_representable_key : int
      val min_allowed_key : 'a t -> int
      val max_allowed_key : 'a t -> int
      val min_elt : 'a t -> 'Elt.t option
      val min_key : 'a t -> int option
      val add : 'a t -> key:int -> '-> 'Elt.t
      val remove : 'a t -> 'Elt.t -> unit
      val clear : 'a t -> unit
      val mem : 'a t -> 'Elt.t -> bool
      val increase_min_allowed_key :
        'a t -> key:int -> handle_removed:('Elt.t -> unit) -> unit
      val iter : 'a t -> f:('Elt.t -> unit) -> unit
      val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
    end
  val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
  module Debug :
    functor (M : S->
      sig
        type 'a t = 'Timing_wheel.Debug(M).t
        type 'a timing_wheel = 'a t
        module Alarm :
          sig
            type 'a t = 'Timing_wheel.Debug(M).Alarm.t
            val at : 'a timing_wheel -> 'a t -> Time.t
            val key : 'a timing_wheel -> 'a t -> int
            val value : 'a timing_wheel -> 'a t -> 'a
            val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
          end
        val invariant :
          'Core_kernel.Invariant_intf.inv ->
          'a t Core_kernel.Invariant_intf.inv
        module Level_bits :
          sig
            type t = Timing_wheel.Debug(M).Level_bits.t
            val invariant : t Core_kernel.Invariant_intf.inv
            val max_num_bits : int
            val create_exn : int list -> t
            val default : Word_size.t -> t
            val num_bits : t -> int
            val t_of_sexp : Sexplib.Sexp.t -> t
            val sexp_of_t : t -> Sexplib.Sexp.t
          end
        module Config :
          sig
            type t = Timing_wheel.Debug(M).Config.t
            val invariant : t Core_kernel.Invariant_intf.inv
            val create :
              ?alarm_precision:Time.Span.t ->
              ?level_bits:Level_bits.t -> unit -> t
            val alarm_precision : t -> Time.Span.t
            val level_bits : t -> Level_bits.t
            val default : t
            val durations : t -> Time.Span.t list
            val t_of_sexp : Sexplib.Sexp.t -> t
            val sexp_of_t : t -> Sexplib.Sexp.t
          end
        val create : config:Config.t -> start:Time.t -> 'a t
        val alarm_precision : 'a t -> Time.Span.t
        val now : 'a t -> Time.t
        val start : 'a t -> Time.t
        val is_empty : 'a t -> bool
        val length : 'a t -> int
        val iter : 'a t -> f:('Alarm.t -> unit) -> unit
        val interval_num : 'a t -> Time.t -> int
        val now_interval_num : 'a t -> int
        val interval_num_start : 'a t -> int -> Time.t
        val interval_start : 'a t -> Time.t -> Time.t
        val advance_clock :
          'a t -> to_:Time.t -> handle_fired:('Alarm.t -> unit) -> unit
        val alarm_upper_bound : 'a t -> Time.t
        val add : 'a t -> at:Time.t -> '-> 'Alarm.t
        val add_at_interval_num : 'a t -> at:int -> '-> 'Alarm.t
        val mem : 'a t -> 'Alarm.t -> bool
        val remove : 'a t -> 'Alarm.t -> unit
        val clear : 'a t -> unit
        val next_alarm_fires_at : 'a t -> Time.t option
        module Priority_queue :
          sig
            type 'a t = 'Timing_wheel.Debug(M).Priority_queue.t
            type 'a priority_queue = 'a t
            module Elt :
              sig
                type 'a t = 'Timing_wheel.Debug(M).Priority_queue.Elt.t
                val invariant :
                  'a priority_queue -> 'Invariant.t -> 'a t Invariant.t
                val key : 'a priority_queue -> 'a t -> int
                val value : 'a priority_queue -> 'a t -> 'a
                val sexp_of_t :
                  ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
              end
            val invariant :
              'Core_kernel.Invariant_intf.inv ->
              'a t Core_kernel.Invariant_intf.inv
            val create : ?level_bits:Level_bits.t -> unit -> 'a t
            val length : 'a t -> int
            val is_empty : 'a t -> bool
            val max_representable_key : int
            val min_allowed_key : 'a t -> int
            val max_allowed_key : 'a t -> int
            val min_elt : 'a t -> 'Elt.t option
            val min_key : 'a t -> int option
            val add : 'a t -> key:int -> '-> 'Elt.t
            val remove : 'a t -> 'Elt.t -> unit
            val clear : 'a t -> unit
            val mem : 'a t -> 'Elt.t -> bool
            val increase_min_allowed_key :
              'a t -> key:int -> handle_removed:('Elt.t -> unit) -> unit
            val iter : 'a t -> f:('Elt.t -> unit) -> unit
            val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
          end
        val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
        val check_invariant : bool ref
        val show_messages : bool ref
      end
end