sig
  val invariant : unit -> unit
  val current_execution_context : unit -> Execution_context.t
  val initialize_execution_context : Block_group.t -> unit
  val with_execution_context : Execution_context.t -> f:(unit -> 'a) -> 'a
  val add_job : Execution_context.t -> ('-> unit) -> '-> unit
  val main_execution_context : unit -> Execution_context.t
  val cycle_start : unit -> Core.Std.Time.t
  val run_cycle : unit -> [ `Jobs_remain | `No_jobs_remain ]
  val run_cycles_until_no_jobs_remain : unit -> unit
  val next_upcoming_event : unit -> Core.Std.Time.t option
  val uncaught_exception : unit -> Core.Std.Error.t option
  val num_pending_jobs : unit -> int
  val num_jobs_run : unit -> int
  val cycle_times : unit -> Core.Std.Time.Span.t Async_stream.t
  val cycle_num_jobs : unit -> int Async_stream.t
  val cycle_count : unit -> int
  val set_max_num_jobs_per_priority_per_cycle : int -> unit
  type 'a with_options =
      ?block_group:Block_group.t ->
      ?monitor:Monitor.t -> ?priority:Priority.t -> 'a
  val within' :
    ((unit -> 'Deferred.t) -> 'Deferred.t) Scheduler.with_options
  val within : ((unit -> unit) -> unit) Scheduler.with_options
  val within_v : ((unit -> 'a) -> 'a option) Scheduler.with_options
  val schedule' :
    ((unit -> 'Deferred.t) -> 'Deferred.t) Scheduler.with_options
  val schedule : ((unit -> unit) -> unit) Scheduler.with_options
  val within_context :
    Execution_context.t -> (unit -> 'a) -> ('a, unit) Core.Std.Result.t
  val ounit_tests : unit -> OUnit.test
end