functor
  (Key : sig
           type t
           val equal : t -> t -> bool
           val hash : t -> int
           val to_string : Type.t -> string
         end->
  functor (Info : sig type 'a t end->
    sig
      type key = Key.t
      type 'a info = 'Info.t
      type t
      val create : int -> t
      val add : t -> key -> 'a ty -> 'a info -> unit
      exception Unbound_value of string
      exception Incompatible_type of string
      val find : t -> key -> 'a ty -> 'a info
      val iter : (key -> 'a ty -> 'a info -> unit) -> t -> unit
      val fold : (key -> 'a ty -> 'a info -> '-> 'b) -> t -> '-> 'b
    end