sig
  module type MONAD_MINIMAL =
    sig
      type 'a t
      val bind :
        'Monad.MONAD_MINIMAL.t ->
        ('-> 'Monad.MONAD_MINIMAL.t) -> 'Monad.MONAD_MINIMAL.t
      val unit : '-> 'Monad.MONAD_MINIMAL.t
    end
  module type MONAD =
    sig
      type 'a t
      val ( >>= ) :
        'Monad.MONAD.t -> ('-> 'Monad.MONAD.t) -> 'Monad.MONAD.t
      val ( >> ) : 'Monad.MONAD.t -> 'Monad.MONAD.t -> 'Monad.MONAD.t
      val return : '-> 'Monad.MONAD.t
      val run : 'Monad.MONAD.t -> 'a
    end
  module type TYPEWRAPPER = sig type t val init : Monad.TYPEWRAPPER.t end
  module Identity :
    sig
      type 'a t
      val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
      val ( >> ) : 'a t -> 'b t -> 'b t
      val return : '-> 'a t
      val run : 'a t -> 'a
    end
  module Option :
    sig
      type 'a t
      val ( >>= ) :
        'Monad.Option.t -> ('-> 'Monad.Option.t) -> 'Monad.Option.t
      val ( >> ) :
        'Monad.Option.t -> 'Monad.Option.t -> 'Monad.Option.t
      val return : '-> 'Monad.Option.t
      val run : 'Monad.Option.t -> 'a
      val fail : 'Monad.Option.t
      val on_fail :
        'Monad.Option.t -> 'Monad.Option.t -> 'Monad.Option.t
    end
  module Exception :
    sig
      type 'a t
      val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
      val ( >> ) : 'a t -> 'b t -> 'b t
      val return : '-> 'a t
      val run : 'a t -> 'a
      val raise : string -> 'a t
      val failed : 'a t -> bool
      val trywith : 'a t -> (string -> 'a t) -> 'a t
    end
  module State :
    functor (S : TYPEWRAPPER->
      sig
        type 'a t
        val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
        val ( >> ) : 'a t -> 'b t -> 'b t
        val return : '-> 'a t
        val run : 'a t -> 'a
        val read_state : S.t t
        val write_state : S.t -> unit t
        val run_with : 'a t -> S.t -> 'a
      end
  module IO :
    sig
      type 'a t
      val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
      val ( >> ) : 'a t -> 'b t -> 'b t
      val return : '-> 'a t
      val run : 'a t -> 'a
      val write : string -> unit t
      val write_line : string -> unit t
      val read_line : string t
      val file_exists : string -> bool t
      val read_file : string -> string Lst.t t
      val write_file : string -> char Lst.t -> bool t
    end
end