sig
  type t = Project_skeleton.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 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
  module Datatype :
    sig
      type t = Project_skeleton.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
    end
  type project =
    Project_skeleton.t = private {
    pid : int;
    mutable name : string;
    mutable unique_name : string;
  }
  val create : string -> t
  val register_create_hook : (t -> unit) -> unit
  exception NoProject
  val current : unit -> t
  val is_current : t -> bool
  val iter_on_projects : (t -> unit) -> unit
  val fold_on_projects : ('-> t -> 'a) -> '-> 'a
  val find_all : string -> t list
  val clear_all : unit -> unit
  val get_name : t -> string
  val get_unique_name : t -> string
  val set_name : t -> string -> unit
  exception Unknown_project
  val from_unique_name : string -> t
  val set_current : ?on:bool -> ?selection:State_selection.t -> t -> unit
  val register_after_set_current_hook : user_only:bool -> (t -> unit) -> unit
  val on : ?selection:State_selection.t -> t -> ('-> 'b) -> '-> 'b
  val copy : ?selection:State_selection.t -> ?src:t -> t -> unit
  val create_by_copy :
    ?selection:State_selection.t -> ?src:t -> last:bool -> string -> t
  val create_by_copy_hook : (t -> t -> unit) -> unit
  val clear : ?selection:State_selection.t -> ?project:t -> unit -> unit
  val register_todo_before_clear : (t -> unit) -> unit
  val register_todo_after_clear : (t -> unit) -> unit
  exception Cannot_remove of string
  val remove : ?project:t -> unit -> unit
  val register_before_remove_hook : (t -> unit) -> unit
  exception IOError of string
  val save : ?selection:State_selection.t -> ?project:t -> string -> unit
  val load : ?selection:State_selection.t -> ?name:string -> string -> t
  val save_all : ?selection:State_selection.t -> string -> unit
  val load_all : ?selection:State_selection.t -> string -> unit
  val register_before_load_hook : (unit -> unit) -> unit
  val register_after_load_hook : (unit -> unit) -> unit
  val register_after_global_load_hook : (unit -> unit) -> unit
  val get_current_selection : unit -> State_selection.t
  val compare : t -> t -> int
  val equal : t -> t -> bool
  val hash : t -> int
  module Undo :
    sig
      val breakpoint : unit -> unit
      val restore : unit -> unit
      val clear_breakpoint : unit -> unit
    end
end