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_some_projects : (project -> bool) -> t -> bool
             end->
    functor (Info : INFO->
      sig
        val self : t
        val select : Kind.how -> selection -> selection
        val depend : t -> unit
        val name : string
        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 descr : Unmarshal.t
            val copy : t -> t
            val name : string
            val register_comparable :
              ?compare:(t -> t -> int) ->
              ?equal:(t -> t -> bool) -> ?hash:(t -> int) -> unit -> unit
            val is_comparable_set : unit -> bool
            val hash : t -> int
            val equal : t -> t -> bool
            val compare : t -> t -> int
            val mem_project : ((project -> bool) -> t -> bool) option ref
          end
        val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      end