sig
  type filename = string
  type rel
  type abs
  type t
  val root : Assemblage.Path.t
  val empty : Assemblage.Path.t
  val dash : Assemblage.Path.t
  val add : Assemblage.Path.t -> string -> Assemblage.Path.t
  val concat : Assemblage.Path.t -> Assemblage.Path.rel -> Assemblage.Path.t
  val ( / ) : Assemblage.Path.t -> string -> Assemblage.Path.t
  val ( // ) : Assemblage.Path.t -> Assemblage.Path.rel -> Assemblage.Path.t
  val file : Assemblage.Path.filename -> Assemblage.Path.t
  val base : string -> Assemblage.Path.t
  val basename : Assemblage.Path.t -> string
  val dirname : Assemblage.Path.t -> Assemblage.Path.t
  val rem_prefix :
    Assemblage.Path.t -> Assemblage.Path.t -> Assemblage.Path.rel option
  val find_prefix :
    Assemblage.Path.t -> Assemblage.Path.t -> Assemblage.Path.t option
  val is_root : Assemblage.Path.t -> bool
  val is_empty : Assemblage.Path.t -> bool
  val is_dash : Assemblage.Path.t -> bool
  val is_rel : Assemblage.Path.t -> bool
  val is_abs : Assemblage.Path.t -> bool
  val is_prefix : Assemblage.Path.t -> Assemblage.Path.t -> bool
  val equal : Assemblage.Path.t -> Assemblage.Path.t -> bool
  val compare : Assemblage.Path.t -> Assemblage.Path.t -> int
  val to_rel : Assemblage.Path.t -> Assemblage.Path.rel option
  val of_rel : Assemblage.Path.rel -> Assemblage.Path.t
  val to_abs : Assemblage.Path.t -> Assemblage.Path.abs option
  val of_abs : Assemblage.Path.abs -> Assemblage.Path.t
  val to_segs :
    Assemblage.Path.t -> [ `Abs of string list | `Rel of string list ]
  val of_segs :
    [ `Abs of string list | `Rel of string list ] -> Assemblage.Path.t
  val to_string : Assemblage.Path.t -> string
  val of_string : string -> Assemblage.Path.t
  val quote : Assemblage.Path.t -> string
  val pp : Format.formatter -> Assemblage.Path.t -> unit
  type ext =
      [ `A
      | `Byte
      | `C
      | `Cma
      | `Cmi
      | `Cmo
      | `Cmt
      | `Cmti
      | `Cmx
      | `Cmxa
      | `Cmxs
      | `Css
      | `Dll
      | `Exe
      | `Ext of string
      | `Gif
      | `H
      | `Html
      | `Img
      | `Install
      | `Jpeg
      | `Js
      | `Json
      | `Lib
      | `Md
      | `Ml
      | `Ml_dep
      | `Ml_pp
      | `Mli
      | `Mli_dep
      | `Mli_pp
      | `Native
      | `O
      | `Opt
      | `Png
      | `Sh
      | `So
      | `Tar
      | `Tbz
      | `Xml
      | `Zip ]
  val ext_to_string : Assemblage.Path.ext -> string
  val ext_of_string : string -> Assemblage.Path.ext
  val pp_ext : Format.formatter -> Assemblage.Path.ext -> unit
  val ext : Assemblage.Path.t -> Assemblage.Path.ext option
  val get_ext : Assemblage.Path.t -> Assemblage.Path.ext
  val add_ext : Assemblage.Path.t -> Assemblage.Path.ext -> Assemblage.Path.t
  val rem_ext : Assemblage.Path.t -> Assemblage.Path.t
  val change_ext :
    Assemblage.Path.t -> Assemblage.Path.ext -> Assemblage.Path.t
  val ( + ) : Assemblage.Path.t -> Assemblage.Path.ext -> Assemblage.Path.t
  val has_ext : Assemblage.Path.ext -> Assemblage.Path.t -> bool
  val ext_matches : Assemblage.Path.ext list -> Assemblage.Path.t -> bool
  module Rel :
    sig
      type path = Assemblage.Path.t
      type t = Assemblage.Path.rel
      val empty : Assemblage.Path.rel
      val dash : Assemblage.Path.rel
      val add : Assemblage.Path.rel -> string -> Assemblage.Path.rel
      val concat :
        Assemblage.Path.rel -> Assemblage.Path.rel -> Assemblage.Path.rel
      val file : Assemblage.Path.filename -> Assemblage.Path.rel
      val base : string -> Assemblage.Path.rel
      val ( / ) : Assemblage.Path.rel -> string -> Assemblage.Path.rel
      val ( // ) :
        Assemblage.Path.rel -> Assemblage.Path.rel -> Assemblage.Path.rel
      val basename : Assemblage.Path.rel -> string
      val dirname : Assemblage.Path.rel -> Assemblage.Path.rel
      val rem_prefix :
        Assemblage.Path.rel ->
        Assemblage.Path.rel -> Assemblage.Path.rel option
      val find_prefix :
        Assemblage.Path.rel -> Assemblage.Path.rel -> Assemblage.Path.rel
      val is_empty : Assemblage.Path.rel -> bool
      val is_dash : Assemblage.Path.rel -> bool
      val is_prefix : Assemblage.Path.rel -> Assemblage.Path.rel -> bool
      val equal : Assemblage.Path.rel -> Assemblage.Path.rel -> bool
      val compare : Assemblage.Path.rel -> Assemblage.Path.rel -> int
      val to_segs : Assemblage.Path.rel -> string list
      val of_segs : string list -> Assemblage.Path.rel
      val to_string : Assemblage.Path.rel -> string
      val quote : Assemblage.Path.rel -> string
      val pp : Format.formatter -> Assemblage.Path.rel -> unit
      val ext : Assemblage.Path.rel -> Assemblage.Path.ext option
      val get_ext : Assemblage.Path.rel -> Assemblage.Path.ext
      val add_ext :
        Assemblage.Path.rel -> Assemblage.Path.ext -> Assemblage.Path.rel
      val rem_ext : Assemblage.Path.rel -> Assemblage.Path.rel
      val change_ext :
        Assemblage.Path.rel -> Assemblage.Path.ext -> Assemblage.Path.rel
      val ( + ) :
        Assemblage.Path.rel -> Assemblage.Path.ext -> Assemblage.Path.rel
      val has_ext : Assemblage.Path.ext -> Assemblage.Path.rel -> bool
      val ext_matches :
        Assemblage.Path.ext list -> Assemblage.Path.rel -> bool
      module Set :
        sig
          type elt = rel
          type t
          val empty : t
          val is_empty : t -> bool
          val mem : elt -> t -> bool
          val add : elt -> t -> t
          val singleton : elt -> t
          val remove : elt -> t -> t
          val union : t -> t -> t
          val inter : t -> t -> t
          val diff : t -> t -> t
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val subset : t -> t -> bool
          val iter : (elt -> unit) -> t -> unit
          val fold : (elt -> '-> 'a) -> t -> '-> 'a
          val for_all : (elt -> bool) -> t -> bool
          val exists : (elt -> bool) -> t -> bool
          val filter : (elt -> bool) -> t -> t
          val partition : (elt -> bool) -> t -> t * t
          val cardinal : t -> int
          val elements : t -> elt list
          val min_elt : t -> elt
          val max_elt : t -> elt
          val choose : t -> elt
          val split : elt -> t -> t * bool * t
          val find : elt -> t -> elt
          val of_list : elt list -> Assemblage.Path.Rel.t
        end
      module Map :
        sig
          type key = rel
          type +'a t
          val empty : 'a t
          val is_empty : 'a t -> bool
          val mem : key -> 'a t -> bool
          val add : key -> '-> 'a t -> 'a t
          val singleton : key -> '-> 'a t
          val remove : key -> 'a t -> 'a t
          val merge :
            (key -> 'a option -> 'b option -> 'c option) ->
            'a t -> 'b t -> 'c t
          val compare : ('-> '-> int) -> 'a t -> 'a t -> int
          val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val for_all : (key -> '-> bool) -> 'a t -> bool
          val exists : (key -> '-> bool) -> 'a t -> bool
          val filter : (key -> '-> bool) -> 'a t -> 'a t
          val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
          val cardinal : 'a t -> int
          val bindings : 'a t -> (key * 'a) list
          val min_binding : 'a t -> key * 'a
          val max_binding : 'a t -> key * 'a
          val choose : 'a t -> key * 'a
          val split : key -> 'a t -> 'a t * 'a option * 'a t
          val find : key -> 'a t -> 'a
          val map : ('-> 'b) -> 'a t -> 'b t
          val mapi : (key -> '-> 'b) -> 'a t -> 'b t
          val dom : 'Assemblage.Path.Rel.t -> Assemblage.Path.Rel.Set.t
        end
    end
  module Abs :
    sig
      type path = Assemblage.Path.t
      type t = Assemblage.Path.abs
      val root : Assemblage.Path.abs
      val add : Assemblage.Path.abs -> string -> Assemblage.Path.abs
      val concat :
        Assemblage.Path.abs -> Assemblage.Path.rel -> Assemblage.Path.abs
      val ( / ) : Assemblage.Path.abs -> string -> Assemblage.Path.abs
      val ( // ) :
        Assemblage.Path.abs -> Assemblage.Path.rel -> Assemblage.Path.abs
      val basename : Assemblage.Path.abs -> string
      val dirname : Assemblage.Path.abs -> Assemblage.Path.abs
      val rem_prefix :
        Assemblage.Path.abs ->
        Assemblage.Path.abs -> Assemblage.Path.rel option
      val find_prefix :
        Assemblage.Path.abs -> Assemblage.Path.abs -> Assemblage.Path.abs
      val is_root : Assemblage.Path.abs -> bool
      val is_prefix : Assemblage.Path.abs -> Assemblage.Path.abs -> bool
      val equal : Assemblage.Path.abs -> Assemblage.Path.abs -> bool
      val compare : Assemblage.Path.abs -> Assemblage.Path.abs -> int
      val to_segs : Assemblage.Path.abs -> string list
      val of_segs : string list -> Assemblage.Path.abs
      val to_string : Assemblage.Path.abs -> string
      val quote : Assemblage.Path.abs -> string
      val pp : Format.formatter -> Assemblage.Path.abs -> unit
      val ext : Assemblage.Path.abs -> Assemblage.Path.ext option
      val get_ext : Assemblage.Path.abs -> Assemblage.Path.ext
      val add_ext :
        Assemblage.Path.abs -> Assemblage.Path.ext -> Assemblage.Path.abs
      val rem_ext : Assemblage.Path.abs -> Assemblage.Path.abs
      val change_ext :
        Assemblage.Path.abs -> Assemblage.Path.ext -> Assemblage.Path.abs
      val ( + ) :
        Assemblage.Path.abs -> Assemblage.Path.ext -> Assemblage.Path.abs
      val has_ext : Assemblage.Path.ext -> Assemblage.Path.abs -> bool
      val ext_matches :
        Assemblage.Path.ext list -> Assemblage.Path.abs -> bool
      module Set :
        sig
          type elt = abs
          type t
          val empty : t
          val is_empty : t -> bool
          val mem : elt -> t -> bool
          val add : elt -> t -> t
          val singleton : elt -> t
          val remove : elt -> t -> t
          val union : t -> t -> t
          val inter : t -> t -> t
          val diff : t -> t -> t
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val subset : t -> t -> bool
          val iter : (elt -> unit) -> t -> unit
          val fold : (elt -> '-> 'a) -> t -> '-> 'a
          val for_all : (elt -> bool) -> t -> bool
          val exists : (elt -> bool) -> t -> bool
          val filter : (elt -> bool) -> t -> t
          val partition : (elt -> bool) -> t -> t * t
          val cardinal : t -> int
          val elements : t -> elt list
          val min_elt : t -> elt
          val max_elt : t -> elt
          val choose : t -> elt
          val split : elt -> t -> t * bool * t
          val find : elt -> t -> elt
          val of_list : elt list -> Assemblage.Path.Abs.t
        end
      module Map :
        sig
          type key = abs
          type +'a t
          val empty : 'a t
          val is_empty : 'a t -> bool
          val mem : key -> 'a t -> bool
          val add : key -> '-> 'a t -> 'a t
          val singleton : key -> '-> 'a t
          val remove : key -> 'a t -> 'a t
          val merge :
            (key -> 'a option -> 'b option -> 'c option) ->
            'a t -> 'b t -> 'c t
          val compare : ('-> '-> int) -> 'a t -> 'a t -> int
          val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val for_all : (key -> '-> bool) -> 'a t -> bool
          val exists : (key -> '-> bool) -> 'a t -> bool
          val filter : (key -> '-> bool) -> 'a t -> 'a t
          val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
          val cardinal : 'a t -> int
          val bindings : 'a t -> (key * 'a) list
          val min_binding : 'a t -> key * 'a
          val max_binding : 'a t -> key * 'a
          val choose : 'a t -> key * 'a
          val split : key -> 'a t -> 'a t * 'a option * 'a t
          val find : key -> 'a t -> 'a
          val map : ('-> 'b) -> 'a t -> 'b t
          val mapi : (key -> '-> 'b) -> 'a t -> 'b t
          val dom : 'Assemblage.Path.Abs.t -> Assemblage.Path.Abs.Set.t
        end
    end
  module Set :
    sig
      type elt = t
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val of_list : elt list -> Assemblage.Path.t
    end
  module Map :
    sig
      type key = t
      type +'a t
      val empty : 'a t
      val is_empty : 'a t -> bool
      val mem : key -> 'a t -> bool
      val add : key -> '-> 'a t -> 'a t
      val singleton : key -> '-> 'a t
      val remove : key -> 'a t -> 'a t
      val merge :
        (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t
      val compare : ('-> '-> int) -> 'a t -> 'a t -> int
      val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val for_all : (key -> '-> bool) -> 'a t -> bool
      val exists : (key -> '-> bool) -> 'a t -> bool
      val filter : (key -> '-> bool) -> 'a t -> 'a t
      val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
      val cardinal : 'a t -> int
      val bindings : 'a t -> (key * 'a) list
      val min_binding : 'a t -> key * 'a
      val max_binding : 'a t -> key * 'a
      val choose : 'a t -> key * 'a
      val split : key -> 'a t -> 'a t * 'a option * 'a t
      val find : key -> 'a t -> 'a
      val map : ('-> 'b) -> 'a t -> 'b t
      val mapi : (key -> '-> 'b) -> 'a t -> 'b t
      val dom : 'Assemblage.Path.t -> Assemblage.Path.Set.t
    end
end