sig
  module type StringType =
    sig
      type t
      val length : BatPathGen.StringType.t -> int
      type tchar
      val get : BatPathGen.StringType.t -> int -> BatPathGen.StringType.tchar
      val lift_char : char -> BatPathGen.StringType.tchar
      val lift : string -> BatPathGen.StringType.t
      val to_string : BatPathGen.StringType.t -> string
      val concat_with_separators :
        BatPathGen.StringType.t ->
        BatPathGen.StringType.t list -> BatPathGen.StringType.t
      val compare : BatPathGen.StringType.t -> BatPathGen.StringType.t -> int
      val iter :
        (BatPathGen.StringType.tchar -> unit) ->
        BatPathGen.StringType.t -> unit
      val iteri :
        (int -> BatPathGen.StringType.tchar -> unit) ->
        BatPathGen.StringType.t -> unit
      val sub :
        BatPathGen.StringType.t -> int -> int -> BatPathGen.StringType.t
      val rindex : BatPathGen.StringType.t -> char -> int
      module Parse :
        sig
          val source :
            BatPathGen.StringType.t ->
            (BatPathGen.StringType.tchar, BatCharParser.position)
            BatParserCo.Source.t
          val letter :
            (BatPathGen.StringType.tchar, BatPathGen.StringType.tchar,
             BatCharParser.position)
            BatParserCo.t
        end
    end
  module type PathType =
    sig
      type ustring
      type uchar
      module OperatorLift :
        sig val ( !! ) : string -> BatPathGen.PathType.ustring end
      type t = BatPathGen.PathType.ustring list
      val is_relative : BatPathGen.PathType.t -> bool
      val is_absolute : BatPathGen.PathType.t -> bool
      val root : BatPathGen.PathType.t
      val append :
        BatPathGen.PathType.t ->
        BatPathGen.PathType.ustring -> BatPathGen.PathType.t
      val concat :
        BatPathGen.PathType.t ->
        BatPathGen.PathType.t -> BatPathGen.PathType.t
      module Operators :
        sig
          val ( /: ) :
            BatPathGen.PathType.t ->
            BatPathGen.PathType.ustring -> BatPathGen.PathType.t
          val ( //@ ) :
            BatPathGen.PathType.t ->
            BatPathGen.PathType.t -> BatPathGen.PathType.t
        end
      exception Malformed_path
      val normalize : BatPathGen.PathType.t -> BatPathGen.PathType.t
      val parent : BatPathGen.PathType.t -> BatPathGen.PathType.t
      val belongs : BatPathGen.PathType.t -> BatPathGen.PathType.t -> bool
      val relative_to_any :
        BatPathGen.PathType.t ->
        BatPathGen.PathType.t -> BatPathGen.PathType.t
      exception Not_parent
      val relative_to_parent :
        BatPathGen.PathType.t ->
        BatPathGen.PathType.t -> BatPathGen.PathType.t
      exception Illegal_char
      type validator = BatPathGen.PathType.ustring -> bool
      val default_validator : BatPathGen.PathType.validator Pervasives.ref
      val to_ustring : BatPathGen.PathType.t -> BatPathGen.PathType.ustring
      val to_string : BatPathGen.PathType.t -> string
      val of_string : BatPathGen.PathType.ustring -> BatPathGen.PathType.t
      val s : BatPathGen.PathType.t -> string
      val p : BatPathGen.PathType.ustring -> BatPathGen.PathType.t
      val name : BatPathGen.PathType.t -> BatPathGen.PathType.ustring
      val map_name :
        (BatPathGen.PathType.ustring -> BatPathGen.PathType.ustring) ->
        BatPathGen.PathType.t -> BatPathGen.PathType.t
      val ext : BatPathGen.PathType.t -> BatPathGen.PathType.ustring option
      val map_ext :
        (BatPathGen.PathType.ustring option ->
         BatPathGen.PathType.ustring option) ->
        BatPathGen.PathType.t -> BatPathGen.PathType.t
      val name_core : BatPathGen.PathType.t -> BatPathGen.PathType.ustring
      type components =
          BatPathGen.PathType.t * BatPathGen.PathType.ustring *
          BatPathGen.PathType.ustring option
      val split : BatPathGen.PathType.t -> BatPathGen.PathType.components
      val join : BatPathGen.PathType.components -> BatPathGen.PathType.t
      val map :
        (BatPathGen.PathType.components -> BatPathGen.PathType.components) ->
        BatPathGen.PathType.t -> BatPathGen.PathType.t
      val drive_letter :
        BatPathGen.PathType.t -> BatPathGen.PathType.uchar option
    end
  module Make :
    functor (S : StringType->
      sig
        type ustring = S.t
        type uchar = S.tchar
        module OperatorLift : sig val ( !! ) : string -> ustring end
        type t = ustring list
        val is_relative : t -> bool
        val is_absolute : t -> bool
        val root : t
        val append : t -> ustring -> t
        val concat : t -> t -> t
        module Operators :
          sig val ( /: ) : t -> ustring -> t val ( //@ ) : t -> t -> t end
        exception Malformed_path
        val normalize : t -> t
        val parent : t -> t
        val belongs : t -> t -> bool
        val relative_to_any : t -> t -> t
        exception Not_parent
        val relative_to_parent : t -> t -> t
        exception Illegal_char
        type validator = ustring -> bool
        val default_validator : validator ref
        val to_ustring : t -> ustring
        val to_string : t -> string
        val of_string : ustring -> t
        val s : t -> string
        val p : ustring -> t
        val name : t -> ustring
        val map_name : (ustring -> ustring) -> t -> t
        val ext : t -> ustring option
        val map_ext : (ustring option -> ustring option) -> t -> t
        val name_core : t -> ustring
        type components = t * ustring * ustring option
        val split : t -> components
        val join : components -> t
        val map : (components -> components) -> t -> t
        val drive_letter : t -> uchar option
      end
  module OfString :
    sig
      type ustring = string
      type uchar = char
      module OperatorLift : sig val ( !! ) : string -> ustring end
      type t = ustring list
      val is_relative : t -> bool
      val is_absolute : t -> bool
      val root : t
      val append : t -> ustring -> t
      val concat : t -> t -> t
      module Operators :
        sig val ( /: ) : t -> ustring -> t val ( //@ ) : t -> t -> t end
      exception Malformed_path
      val normalize : t -> t
      val parent : t -> t
      val belongs : t -> t -> bool
      val relative_to_any : t -> t -> t
      exception Not_parent
      val relative_to_parent : t -> t -> t
      exception Illegal_char
      type validator = ustring -> bool
      val default_validator : validator ref
      val to_ustring : t -> ustring
      val to_string : t -> string
      val of_string : ustring -> t
      val s : t -> string
      val p : ustring -> t
      val name : t -> ustring
      val map_name : (ustring -> ustring) -> t -> t
      val ext : t -> ustring option
      val map_ext : (ustring option -> ustring option) -> t -> t
      val name_core : t -> ustring
      type components = t * ustring * ustring option
      val split : t -> components
      val join : components -> t
      val map : (components -> components) -> t -> t
      val drive_letter : t -> uchar option
    end
end