sig
  module MakeNamespace :
    functor
      (I : sig
             type name
             val print : Namespace.MakeNamespace.name -> string
             module Map :
               sig
                 type key = name
                 type 'a t
                 val empty : 'a t
                 val lookup : key -> 'a t -> 'a
                 val find : key -> 'a t -> 'a
                 val add : key -> '-> 'a t -> 'a t
                 exception Unchanged
                 val strict_add : key -> '-> 'a t -> 'a t
                 type 'a decision = '-> '-> 'a
                 val fine_add : 'a decision -> key -> '-> 'a t -> 'a t
                 val mem : key -> 'a t -> bool
                 val singleton : key -> '-> 'a t
                 val is_empty : 'a t -> bool
                 val is_singleton : 'a t -> (key * 'a) option
                 val cardinal : 'a t -> int
                 val choose : 'a t -> key * 'a
                 val lookup_and_remove : key -> 'a t -> 'a * 'a t
                 val find_and_remove : key -> 'a t -> 'a * 'a t
                 val remove : key -> 'a t -> 'a t
                 val union : 'a t -> 'a t -> 'a t
                 val fine_union : 'a decision -> 'a t -> 'a t -> 'a t
                 val iter : (key -> '-> unit) -> 'a t -> unit
                 val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
                 val fold_rev : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
                 val iter2 :
                   (key -> '-> '-> unit) -> 'a t -> 'b t -> unit
                 val map : ('-> 'b) -> 'a t -> 'b t
                 val endo_map : ('-> 'a) -> 'a t -> 'a t
                 val compare : ('-> '-> int) -> 'a t -> 'a t -> int
                 module Domain :
                   sig
                     type element = key
                     type t
                     val empty : t
                     val is_empty : t -> bool
                     val singleton : element -> t
                     val cardinal : t -> int
                     val choose : t -> element
                     val mem : element -> t -> bool
                     val add : element -> t -> t
                     val remove : element -> t -> t
                     val union : t -> t -> t
                     val diff : t -> t -> t
                     val inter : t -> t -> t
                     val disjoint : t -> t -> bool
                     val iter : (element -> unit) -> t -> unit
                     val fold : (element -> '-> 'b) -> t -> '-> 'b
                     val elements : t -> element list
                     val compare : t -> t -> int
                     val equal : t -> t -> bool
                     val subset : t -> t -> bool
                   end
                 val domain : 'a t -> Domain.t
                 val lift : (key -> 'a) -> Domain.t -> 'a t
                 val corestrict : 'a t -> Domain.t -> 'a t
               end
           end->
      sig
        type name = I.name
        type 'a global_env
        val empty : 'a global_env
        val lookup_unqualified : name -> 'a global_env -> 'a
        val extend_unqualified : name -> '-> 'a global_env -> 'a global_env
        val lookup_qualified : Module.name -> name -> 'a global_env -> 'a
        val extend_qualified :
          Module.name -> name -> '-> 'a global_env -> 'a global_env
        val lookup_maybe_qualified :
          name SurfaceSyntax.maybe_qualified -> 'a global_env -> 'a
        val qualify : Module.name -> name -> 'a global_env -> 'a global_env
        val freeze : Module.name -> 'a global_env -> 'a global_env
        val unqualify : Module.name -> 'a global_env -> 'a global_env
        val zap : 'a global_env -> 'a global_env
        val unqualified_names : 'a global_env -> name list
        val print_global_env :
          ('-> PPrint.document) -> 'a global_env -> PPrint.document
      end
end