sig
  module type T =
    sig
      type 'a t
      val bind :
        'a Xml_wrap.T.t -> ('a -> 'b Xml_wrap.T.t) -> 'b Xml_wrap.T.t
      val return : 'a -> 'a Xml_wrap.T.t
      val fmap : ('a -> 'b) -> 'a Xml_wrap.T.t -> 'b Xml_wrap.T.t
      val fmap2 :
        ('a -> 'b -> 'c) ->
        'a Xml_wrap.T.t -> 'b Xml_wrap.T.t -> 'c Xml_wrap.T.t
      val fmap3 :
        ('a -> 'b -> 'c -> 'd) ->
        'a Xml_wrap.T.t ->
        'b Xml_wrap.T.t -> 'c Xml_wrap.T.t -> 'd Xml_wrap.T.t
      val fmap4 :
        ('a -> 'b -> 'c -> 'd -> 'e) ->
        'a Xml_wrap.T.t ->
        'b Xml_wrap.T.t ->
        'c Xml_wrap.T.t -> 'd Xml_wrap.T.t -> 'e Xml_wrap.T.t
      val fmap5 :
        ('a -> 'b -> 'c -> 'd -> 'e -> 'f) ->
        'a Xml_wrap.T.t ->
        'b Xml_wrap.T.t ->
        'c Xml_wrap.T.t ->
        'd Xml_wrap.T.t -> 'e Xml_wrap.T.t -> 'f Xml_wrap.T.t
    end
  module NoWrap :
    sig
      type 'a t = 'a
      val bind : 'a t -> ('a -> 'b t) -> 'b t
      val return : 'a -> 'a t
      val fmap : ('a -> 'b) -> 'a t -> 'b t
      val fmap2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
      val fmap3 : ('a -> 'b -> 'c -> 'd) -> 'a t -> 'b t -> 'c t -> 'd t
      val fmap4 :
        ('a -> 'b -> 'c -> 'd -> 'e) -> 'a t -> 'b t -> 'c t -> 'd t -> 'e t
      val fmap5 :
        ('a -> 'b -> 'c -> 'd -> 'e -> 'f) ->
        'a t -> 'b t -> 'c t -> 'd t -> 'e t -> 'f t
    end
end