sig
  type 'a key
  val create_key : string -> 'a key
  val eq_type : 'a key -> 'b key -> ('a, 'b) eq option
  val print : 'a key Pretty_utils.formatter
  val compare : 'a key -> 'b key -> int
  val equal : 'a key -> 'b key -> bool
  val hash : 'a key -> int
  val tag : 'a key -> int
  type 'a data
  type 'a structure =
      Unit : unit Structure.Shape.structure
    | Leaf : 'a key * 'Structure.Shape.data -> 'Structure.Shape.structure
    | Node : 'Structure.Shape.structure *
        'Structure.Shape.structure -> ('a * 'b) Structure.Shape.structure
  val eq_structure :
    'Structure.Shape.structure ->
    'Structure.Shape.structure -> ('a, 'b) Structure.eq option
end