functor (S : Monad.TYPEWRAPPER->
  functor (M : Monad.MONAD->
    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
      val lift : 'M.t -> 'a t
    end