sig
  module type INPUT =
    sig
      type t
      val descr : Unmarshal.t
      val copy : Project.Datatype.INPUT.t -> Project.Datatype.INPUT.t
      val name : string
    end
  module type S =
    sig
      type t
      val descr : Unmarshal.t
      val copy : t -> t
      val name : string
      val register_comparable :
        ?compare:(Project.t -> Project.t -> int) ->
        ?equal:(Project.t -> Project.t -> bool) ->
        ?hash:(Project.t -> int) -> unit -> unit
      val is_comparable_set : unit -> bool
      val hash : Project.t -> int
      val equal : Project.t -> Project.t -> bool
      val compare : Project.t -> Project.t -> int
      val mem_project :
        ((Project.project -> bool) -> Project.t -> bool) option
        Pervasives.ref
    end
  module Register :
    functor (Datatype : INPUT->
      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
  module Imperative :
    functor
      (X : sig
             type t
             val copy :
               Project.Datatype.Imperative.t -> Project.Datatype.Imperative.t
             val name : string
           end->
      sig
        type t = X.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
  module Persistent :
    functor (X : sig type t val name : string end->
      sig
        type t = X.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
  module Own :
    sig
      type t = project
      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 extend_name : string -> string -> string
  val extend_name2 : string -> string -> string -> string
  val extend_name3 : string -> string -> string -> string -> string
end