sig
  module Field = Generic_core_desc.Field
  module Fields = Generic_core_desc.Fields
  module Record = Generic_core_desc.Record
  module Con = Generic_core_desc.Con
  module Variant = Generic_core_desc.Variant
  module Ext = Generic_core_desc.Ext
  module Poly = Generic_core_desc.Poly
  module Method = Generic_core_desc.Method
  module Object = Generic_core_desc.Object
  module Class = Generic_core_desc.Class
  module Array = Generic_core_desc.Array
  module Custom = Generic_core_desc.Custom
  module T = Generic_core_desc.T
  type 'a desc =
    'T.desc =
      Array : 'Generic_core.Ty.T.ty *
        (module Array.intf with type elt = 'and type t = 'a) -> 'a desc
    | Product : 'ts Generic_core.Product.t *
        ('ts, 'p) Generic_util.Fun.iso -> 'p desc
    | Record : ('p, 'r) Record.t -> 'r desc
    | Synonym : 'Generic_core.Ty.T.ty *
        ('a, 'b) Generic_core.Equal.t -> 'b desc
    | Variant of 'Variant.t
    | Extensible of 'Ext.t
    | Custom of 'Custom.t
    | Class of 'Class.t
    | Abstract
    | NoDesc
  type 'a t = 'T.desc
  type desc_fun =
    Generic_core_desc_fun.desc_fun = {
    f : 'a. 'Generic_core.Ty.ty -> 'Generic_core.Desc.t;
  }
  val view : 'Generic_core.Ty.ty -> 'Generic_core.Desc.t
  val ext : 'Generic_core.Ty.pat -> desc_fun -> unit
  val ext_register : 'Generic_core.Ty.ty -> string -> unit
  val ext_add_con :
    'Generic_core.Ty.ty -> Generic_core.Desc.Ext.con -> unit
  val ext_conap :
    'Generic_core.Ty.ty -> '-> 'Generic_core.Desc.Con.conap
  val ext_iter :
    'Generic_core.Ty.ty -> ('Generic_core.Desc.Con.t -> unit) -> unit
  val ext_fold :
    'Generic_core.Ty.ty ->
    ('Generic_core.Desc.Con.t -> '-> 'b) -> '-> 'b
end