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 : 'Structure.Shape.structure
    | Leaf : 'a k -> 'Structure.Shape.structure
    | Node : 'Structure.Shape.structure *
        'Structure.Shape.structure -> ('a * 'b) Structure.Shape.structure
end