sig
  type (_, _) eq = Eq : ('a, 'a) Structure.eq
  module type Key =
    sig
      type 'a k
      val create_key : string -> 'a Structure.Key.k
      val eq_type :
        'a Structure.Key.k ->
        'b Structure.Key.k -> ('a, 'b) Structure.eq option
      val print : 'a Structure.Key.k Pretty_utils.formatter
      val compare : 'a Structure.Key.k -> 'b Structure.Key.k -> int
      val equal : 'a Structure.Key.k -> 'b Structure.Key.k -> bool
      val hash : 'a Structure.Key.k -> int
      val tag : 'a Structure.Key.k -> int
    end
  module type Shape =
    sig
      type 'a k
      val create_key : string -> 'a k
      val eq_type : 'a k -> 'b k -> ('a, 'b) eq option
      val print : 'a k Pretty_utils.formatter
      val compare : 'a k -> 'b k -> int
      val equal : 'a k -> 'b k -> bool
      val hash : 'a k -> int
      val tag : 'a k -> int
      type 'a structure =
          Void : 'a Structure.Shape.structure
        | Leaf : 'a k -> 'a Structure.Shape.structure
        | Node : 'a Structure.Shape.structure *
            'b Structure.Shape.structure -> ('a * 'b)
                                            Structure.Shape.structure
    end
  module Make : functor (X : sig  end) -> Shape
  module Key_Value : Shape
  module Key_Location : Shape
  module Key_Domain : Shape
  module type Internal =
    sig
      type t
      type 'a structure
      val structure : Structure.Internal.t Structure.Internal.structure
    end
  module type External =
    sig
      type t
      type 'a key
      val mem : 'a Structure.External.key -> bool
      val get :
        'a Structure.External.key -> (Structure.External.t -> 'a) option
      val set :
        'a Structure.External.key ->
        'a -> Structure.External.t -> Structure.External.t
    end
  module Open :
    functor
      (Shape : Shape) (Data : sig
                                type t
                                val structure : t Shape.structure
                              end) ->
      sig
        val mem : 'a Shape.k -> bool
        val get : 'a Shape.k -> (Data.t -> 'a) option
        val set : 'a Shape.k -> 'a -> Data.t -> Data.t
      end
end