sig
  module type Scheduler =
    sig
      type 'a cont
      val suspend : ('Reagents.Scheduler.cont -> 'a option) -> 'a
      val resume : 'Reagents.Scheduler.cont -> '-> unit
      val get_tid : unit -> int
    end
  module type S =
    sig
      type ('a, 'b) t
      val never : ('a, 'b) Reagents.S.t
      val constant : '-> ('b, 'a) Reagents.S.t
      val post_commit : ('-> unit) -> ('a, 'a) Reagents.S.t
      val lift : ('-> 'b) -> ('a, 'b) Reagents.S.t
      val lift_blocking : ('-> 'b option) -> ('a, 'b) Reagents.S.t
      val return : ('-> (unit, 'b) Reagents.S.t) -> ('a, 'b) Reagents.S.t
      val ( >>= ) :
        ('a, 'b) Reagents.S.t ->
        ('-> (unit, 'c) Reagents.S.t) -> ('a, 'c) Reagents.S.t
      val ( >>> ) :
        ('a, 'b) Reagents.S.t ->
        ('b, 'c) Reagents.S.t -> ('a, 'c) Reagents.S.t
      val ( <+> ) :
        ('a, 'b) Reagents.S.t ->
        ('a, 'b) Reagents.S.t -> ('a, 'b) Reagents.S.t
      val ( <*> ) :
        ('a, 'b) Reagents.S.t ->
        ('a, 'c) Reagents.S.t -> ('a, 'b * 'c) Reagents.S.t
      val attempt : ('a, 'b) Reagents.S.t -> ('a, 'b option) Reagents.S.t
      val run : ('a, 'b) Reagents.S.t -> '-> 'b
      module Ref :
        sig
          type 'a ref
          type ('a, 'b) reagent = ('a, 'b) t
          val mk_ref : '-> 'a ref
          val read : 'a ref -> (unit, 'a) reagent
          val read_imm : 'a ref -> 'a
          val cas : 'a ref -> '-> '-> (unit, unit) reagent
          val cas_imm : 'a ref -> '-> '-> bool
          val upd :
            'a ref -> ('-> '-> ('a * 'c) option) -> ('b, 'c) reagent
        end
      module Channel :
        sig
          type ('a, 'b) endpoint
          type ('a, 'b) reagent = ('a, 'b) t
          val mk_chan :
            ?name:string -> unit -> ('a, 'b) endpoint * ('b, 'a) endpoint
          val swap : ('a, 'b) endpoint -> ('a, 'b) reagent
        end
    end
  module Make : functor (Sched : Scheduler-> S
end