sig
  val create_exn :
    now:Time.t ->
    hopper_to_bucket_rate_per_sec:float Limiter.Infinite_or_finite.t ->
    bucket_size:float ->
    initial_bucket_level:float ->
    initial_hopper_level:float Limiter.Infinite_or_finite.t -> Limiter.t
  val tokens_may_be_available_when :
    Limiter.t ->
    now:Time.t ->
    float ->
    [ `At of Time.t
    | `Never_because_greater_than_bucket_size
    | `When_return_to_hopper_is_called ]
  val try_take :
    Limiter.t ->
    now:Time.t ->
    float -> [ `Asked_for_more_than_bucket_size | `Taken | `Unable ]
  val return_to_hopper : Limiter.t -> now:Time.t -> float -> unit
  val set_hopper_to_bucket_rate_per_sec_exn :
    Limiter.t -> now:Time.t -> float Limiter.Infinite_or_finite.t -> unit
  val set_token_target_level_exn :
    Limiter.t -> now:Time.t -> float Limiter.Infinite_or_finite.t -> unit
  val set_bucket_size_exn : Limiter.t -> now:Time.t -> float -> unit
end