functor (Datatype : Datatype.S->
  functor
    (State : sig
               type t = Datatype.t
               val create : unit -> t
               val clear : t -> unit
               val get : unit -> t
               val set : t -> unit
               val clear_if_project : project -> t -> bool
             end->
    functor (Info : INFO->
      sig
        val self : t
        val select : Kind.how -> selection -> selection
        val depend : t -> unit
        val mark_as_computed : ?project:project -> unit -> unit
        val is_computed : ?project:project -> unit -> bool
        val do_not_save : unit -> unit
        module Datatype :
          sig
            type t = Datatype.t
            val rehash : t -> t
            val descr : Unmarshal.t
            val copy : t -> t
            val name : string
            val register_comparable :
              ?compare:(t -> t -> int) ->
              ?equal:(t -> t -> bool) ->
              ?hash:(t -> int) -> ?physical_hash:(t -> int) -> unit -> unit
            val is_comparable_set : unit -> bool
            val hash : t -> int
            val physical_hash : t -> int
            val equal : t -> t -> bool
            val compare : t -> t -> int
            val contain_project : (project -> t -> bool) option ref
          end
        val name : string
      end