functor (G : Graph->
  functor (K : Key->
    functor (D : Data->
      functor (Info : sig val name : string end->
        sig
          type t
          val ty : t Type.t
          val name : string
          val descr : t Descr.t
          val packed_descr : Structural_descr.pack
          val reprs : t list
          val equal : t -> t -> bool
          val compare : t -> t -> int
          val hash : t -> int
          val pretty_code : Format.formatter -> t -> unit
          val internal_pretty_code :
            Type.precedence -> Format.formatter -> t -> unit
          val pretty : Format.formatter -> t -> unit
          val varname : t -> string
          val mem_project : (Project_skeleton.t -> bool) -> t -> bool
          val copy : t -> t
          type key = K.t
          type data = D.t
          val create : int -> t
          val add : t -> string -> key -> State.t list -> data -> unit
          val replace :
            reset:bool -> t -> string -> key -> State.t list -> data -> unit
          val memo :
            reset:bool ->
            (data list -> data) -> t -> string -> key -> State.t list -> data
          val clear : reset:bool -> t -> unit
          val remove : reset:bool -> t -> key -> State.t -> unit
          val remove_all : reset:bool -> t -> key -> unit
          val filter :
            reset:bool ->
            (key -> State.t option -> data -> bool) -> t -> key -> unit
          val mem : t -> key -> bool
          val is_local : t -> State.t -> bool
          val find :
            ?who:State.t list -> t -> key -> State.t -> data * State.t
          val find_key : t -> State.t -> (key * State.t) list
          val find_data : ?who:State.t list -> t -> key -> State.t -> data
          val find_state :
            ?who:State.t list -> t -> key -> State.t -> State.t
          val find_all_local :
            ?who:State.t list -> t -> key -> State.t -> (data * State.t) list
          val find_all_local_data :
            ?who:State.t list -> t -> key -> State.t -> data list
          val find_all_local_states :
            ?who:State.t list -> t -> key -> State.t -> State.t list
          val find_all :
            ?who:State.t list -> t -> key -> (data * State.t) list
          val find_all_data : ?who:State.t list -> t -> key -> data list
          val find_all_states : ?who:State.t list -> t -> key -> State.t list
          val iter :
            (key -> State.t option -> data * State.t -> unit) -> t -> unit
          val iter_key :
            (State.t option -> data * State.t -> unit) -> t -> key -> unit
          val fold :
            (key -> State.t option -> data * State.t -> '-> 'a) ->
            t -> '-> 'a
          val fold_key :
            (State.t option -> data * State.t -> '-> 'a) ->
            t -> key -> '-> 'a
          val length : t -> int
          type marshaled
          val marshaler : (t -> marshaled) * (marshaled -> t)
        end