sig
  module type StringType =
    sig
      type t
      val length : t -> int
      type tchar
      val get : t -> int -> tchar
      val lift_char : char -> tchar
      val lift : string -> t
      val to_string : t -> string
      val concat_with_separators : t -> t list -> t
      val compare : t -> t -> int
      val iter : (tchar -> unit) -> t -> unit
      val iteri : (int -> tchar -> unit) -> t -> unit
      val sub : t -> int -> int -> t
      val rindex : t -> char -> int
      module Parse :
        sig
          val source :
            t -> (tchar, BatCharParser.position) BatParserCo.Source.t
          val letter : (tchar, tchar, BatCharParser.position) BatParserCo.t
        end
    end
  module type PathType =
    sig
      type ustring
      type uchar
      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 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