sig
  type 'a or_error = ('a, exn) CCResult.t
  module MVar :
    sig
      type 'a t
      val make : '-> 'Scheduling.MVar.t
      val get : 'Scheduling.MVar.t -> 'a
      val set : 'Scheduling.MVar.t -> '-> unit
      val update : f:('-> 'a * 'b) -> 'Scheduling.MVar.t -> 'b
    end
  module Fut :
    sig
      type 'a t
      val return : '-> 'Scheduling.Fut.t
      val map : ('-> 'b) -> 'Scheduling.Fut.t -> 'Scheduling.Fut.t
      type 'a final_state = Stopped | Done of '| Fail of exn
      type tasks_bag
      type 'a on_res_callback =
          Scheduling.Fut.tasks_bag -> 'Scheduling.Fut.final_state -> unit
      val make :
        ?on_res:'Scheduling.Fut.on_res_callback list ->
        (unit -> 'a) -> 'Scheduling.Fut.t
      val stop : 'Scheduling.Fut.t -> unit
      val is_done : 'Scheduling.Fut.t -> bool
      val on_res :
        'Scheduling.Fut.t -> f:'Scheduling.Fut.on_res_callback -> unit
      val get : 'Scheduling.Fut.t -> 'Scheduling.Fut.final_state
    end
  type process_status = int
  val popen :
    ?on_res:('a * Scheduling.process_status) Scheduling.or_error
            Scheduling.Fut.on_res_callback list ->
    string ->
    f:(Pervasives.out_channel * Pervasives.in_channel -> 'a) ->
    ('a * Scheduling.process_status) Scheduling.or_error Scheduling.Fut.t
  type shortcut = Shortcut | No_shortcut
  module Task :
    sig
      type 'res t
      val make :
        ?prio:int ->
        ?slice:float ->
        (deadline:float -> unit -> 'a * Scheduling.shortcut) ->
        'Scheduling.Task.t
      val of_fut :
        ?prio:int ->
        ?slice:float ->
        (deadline:float ->
         unit -> ('a * Scheduling.shortcut) Scheduling.Fut.t) ->
        'Scheduling.Task.t
      val map : f:('-> 'b) -> 'Scheduling.Task.t -> 'Scheduling.Task.t
    end
  type 'a run_result = Res_one of '| Res_list of 'a list | Res_fail of exn
  val run :
    j:int ->
    deadline:float ->
    'res Scheduling.Task.t list -> 'res Scheduling.run_result
end