sig
  module type Basic =
    sig
      type 'a t
      val bind : 'a t -> ('-> 'b t) -> 'b t
      val return : '-> 'a t
    end
  module type Infix =
    sig
      type 'a t
      val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
      val ( >>| ) : 'a t -> ('-> 'b) -> 'b t
    end
  module type S =
    sig
      type 'a t
      val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
      val ( >>| ) : 'a t -> ('-> 'b) -> 'b t
      module Monad_infix :
        sig
          val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
          val ( >>| ) : 'a t -> ('-> 'b) -> 'b t
        end
      val bind : 'a t -> ('-> 'b t) -> 'b t
      val return : '-> 'a t
      val map : 'a t -> f:('-> 'b) -> 'b t
      val join : 'a t t -> 'a t
      val ignore : 'a t -> unit t
      val all : 'a t list -> 'a list t
      val all_ignore : unit t list -> unit t
    end
  module Make :
    functor (M : Basic->
      sig
        val ( >>= ) : 'M.t -> ('-> 'M.t) -> 'M.t
        val ( >>| ) : 'M.t -> ('-> 'b) -> 'M.t
        module Monad_infix :
          sig
            val ( >>= ) : 'M.t -> ('-> 'M.t) -> 'M.t
            val ( >>| ) : 'M.t -> ('-> 'b) -> 'M.t
          end
        val bind : 'M.t -> ('-> 'M.t) -> 'M.t
        val return : '-> 'M.t
        val map : 'M.t -> f:('-> 'b) -> 'M.t
        val join : 'M.t M.t -> 'M.t
        val ignore : 'M.t -> unit M.t
        val all : 'M.t list -> 'a list M.t
        val all_ignore : unit M.t list -> unit M.t
      end
  module type Basic2 =
    sig
      type ('a, 'd) t
      val bind : ('a, 'd) t -> ('-> ('b, 'd) t) -> ('b, 'd) t
      val return : '-> ('a, 'b) t
    end
  module type Infix2 =
    sig
      type ('a, 'd) t
      val ( >>= ) : ('a, 'd) t -> ('-> ('b, 'd) t) -> ('b, 'd) t
      val ( >>| ) : ('a, 'd) t -> ('-> 'b) -> ('b, 'd) t
    end
  module type S2 =
    sig
      type ('a, 'd) t
      val ( >>= ) : ('a, 'd) t -> ('-> ('b, 'd) t) -> ('b, 'd) t
      val ( >>| ) : ('a, 'd) t -> ('-> 'b) -> ('b, 'd) t
      module Monad_infix :
        sig
          type ('a, 'd) t = ('a, 'd) t
          val ( >>= ) : ('a, 'd) t -> ('-> ('b, 'd) t) -> ('b, 'd) t
          val ( >>| ) : ('a, 'd) t -> ('-> 'b) -> ('b, 'd) t
        end
      val bind : ('a, 'd) t -> ('-> ('b, 'd) t) -> ('b, 'd) t
      val return : '-> ('a, 'b) t
      val map : ('a, 'd) t -> f:('-> 'b) -> ('b, 'd) t
      val join : (('a, 'd) t, 'd) t -> ('a, 'd) t
      val ignore : ('a, 'd) t -> (unit, 'd) t
      val all : ('a, 'd) t list -> ('a list, 'd) t
      val all_ignore : (unit, 'd) t list -> (unit, 'd) t
    end
  module Check_S2_refines_S :
    functor (X : S->
      sig
        type ('a, 'd) t = 'X.t
        val ( >>= ) : ('a, 'd) t -> ('-> ('b, 'd) t) -> ('b, 'd) t
        val ( >>| ) : ('a, 'd) t -> ('-> 'b) -> ('b, 'd) t
        module Monad_infix :
          sig
            type ('a, 'd) t = ('a, 'd) t
            val ( >>= ) : ('a, 'd) t -> ('-> ('b, 'd) t) -> ('b, 'd) t
            val ( >>| ) : ('a, 'd) t -> ('-> 'b) -> ('b, 'd) t
          end
        val bind : ('a, 'd) t -> ('-> ('b, 'd) t) -> ('b, 'd) t
        val return : '-> ('a, 'b) t
        val map : ('a, 'd) t -> f:('-> 'b) -> ('b, 'd) t
        val join : (('a, 'd) t, 'd) t -> ('a, 'd) t
        val ignore : ('a, 'd) t -> (unit, 'd) t
        val all : ('a, 'd) t list -> ('a list, 'd) t
        val all_ignore : (unit, 'd) t list -> (unit, 'd) t
      end
  module Make2 :
    functor (M : Basic2->
      sig
        val ( >>= ) : ('a, 'd) M.t -> ('-> ('b, 'd) M.t) -> ('b, 'd) M.t
        val ( >>| ) : ('a, 'd) M.t -> ('-> 'b) -> ('b, 'd) M.t
        module Monad_infix :
          sig
            type ('a, 'd) t = ('a, 'd) M.t
            val ( >>= ) : ('a, 'd) t -> ('-> ('b, 'd) t) -> ('b, 'd) t
            val ( >>| ) : ('a, 'd) t -> ('-> 'b) -> ('b, 'd) t
          end
        val bind : ('a, 'd) M.t -> ('-> ('b, 'd) M.t) -> ('b, 'd) M.t
        val return : '-> ('a, 'b) M.t
        val map : ('a, 'd) M.t -> f:('-> 'b) -> ('b, 'd) M.t
        val join : (('a, 'd) M.t, 'd) M.t -> ('a, 'd) M.t
        val ignore : ('a, 'd) M.t -> (unit, 'd) M.t
        val all : ('a, 'd) M.t list -> ('a list, 'd) M.t
        val all_ignore : (unit, 'd) M.t list -> (unit, 'd) M.t
      end
  val ounit_tests : unit -> OUnit.test
end