sig
  module type Scheduler =
    sig
      type 'a cont
      val suspend : ('a Reagents.Scheduler.cont -> 'a option) -> 'a
      val resume : 'a Reagents.Scheduler.cont -> 'a -> unit
      val get_tid : unit -> int
    end
  module type S =
    sig
      type ('a, 'b) t
      val never : ('a, 'b) Reagents.S.t
      val constant : 'a -> ('b, 'a) Reagents.S.t
      val post_commit : ('a -> unit) -> ('a, 'a) Reagents.S.t
      val lift : ('a -> 'b) -> ('a, 'b) Reagents.S.t
      val lift_blocking : ('a -> 'b option) -> ('a, 'b) Reagents.S.t
      val return : ('a -> (unit, 'b) Reagents.S.t) -> ('a, 'b) Reagents.S.t
      val ( >>= ) :
        ('a, 'b) Reagents.S.t ->
        ('b -> (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 -> 'a -> 'b
      module Ref :
        sig
          type 'a ref
          type ('a, 'b) reagent = ('a, 'b) t
          val mk_ref : 'a -> 'a ref
          val read : 'a ref -> (unit, 'a) reagent
          val read_imm : 'a ref -> 'a
          val cas : 'a ref -> 'a -> 'a -> (unit, unit) reagent
          val cas_imm : 'a ref -> 'a -> 'a -> bool
          val upd :
            'a ref -> ('a -> 'b -> ('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