sig
  type tyvar = string Location.loc
  type deriver = {
    name : string;
    core_type : (Parsetree.core_type -> Parsetree.expression) option;
    type_decl_str :
      options:(string * Parsetree.expression) list ->
      path:string list ->
      Parsetree.type_declaration list -> Parsetree.structure;
    type_ext_str :
      options:(string * Parsetree.expression) list ->
      path:string list -> Parsetree.type_extension -> Parsetree.structure;
    module_type_decl_str :
      options:(string * Parsetree.expression) list ->
      path:string list ->
      Parsetree.module_type_declaration -> Parsetree.structure;
    type_decl_sig :
      options:(string * Parsetree.expression) list ->
      path:string list ->
      Parsetree.type_declaration list -> Parsetree.signature;
    type_ext_sig :
      options:(string * Parsetree.expression) list ->
      path:string list -> Parsetree.type_extension -> Parsetree.signature;
    module_type_decl_sig :
      options:(string * Parsetree.expression) list ->
      path:string list ->
      Parsetree.module_type_declaration -> Parsetree.signature;
  }
  val register : Ppx_deriving.deriver -> unit
  val add_register_hook : (Ppx_deriving.deriver -> unit) -> unit
  val derivers : unit -> Ppx_deriving.deriver list
  val create :
    string ->
    ?core_type:(Parsetree.core_type -> Parsetree.expression) ->
    ?type_ext_str:(options:(string * Parsetree.expression) list ->
                   path:string list ->
                   Parsetree.type_extension -> Parsetree.structure) ->
    ?type_ext_sig:(options:(string * Parsetree.expression) list ->
                   path:string list ->
                   Parsetree.type_extension -> Parsetree.signature) ->
    ?type_decl_str:(options:(string * Parsetree.expression) list ->
                    path:string list ->
                    Parsetree.type_declaration list -> Parsetree.structure) ->
    ?type_decl_sig:(options:(string * Parsetree.expression) list ->
                    path:string list ->
                    Parsetree.type_declaration list -> Parsetree.signature) ->
    ?module_type_decl_str:(options:(string * Parsetree.expression) list ->
                           path:string list ->
                           Parsetree.module_type_declaration ->
                           Parsetree.structure) ->
    ?module_type_decl_sig:(options:(string * Parsetree.expression) list ->
                           path:string list ->
                           Parsetree.module_type_declaration ->
                           Parsetree.signature) ->
    unit -> Ppx_deriving.deriver
  val lookup : string -> Ppx_deriving.deriver option
  val raise_errorf :
    ?sub:Location.error list ->
    ?if_highlight:string ->
    ?loc:Location.t -> ('a, unit, string, 'b) Pervasives.format4 -> 'a
  val string_of_core_type : Parsetree.core_type -> string
  module Arg :
    sig
      type 'a conv = Parsetree.expression -> ('a, string) Result.result
      val expr : Parsetree.expression Ppx_deriving.Arg.conv
      val bool : bool Ppx_deriving.Arg.conv
      val int : int Ppx_deriving.Arg.conv
      val string : string Ppx_deriving.Arg.conv
      val char : char Ppx_deriving.Arg.conv
      val enum : string list -> string Ppx_deriving.Arg.conv
      val list : 'Ppx_deriving.Arg.conv -> 'a list Ppx_deriving.Arg.conv
      val get_attr :
        deriver:string ->
        'Ppx_deriving.Arg.conv -> Parsetree.attribute option -> 'a option
      val get_flag : deriver:string -> Parsetree.attribute option -> bool
      val get_expr :
        deriver:string ->
        'Ppx_deriving.Arg.conv -> Parsetree.expression -> 'a
    end
  type quoter
  val create_quoter : unit -> Ppx_deriving.quoter
  val quote :
    quoter:Ppx_deriving.quoter ->
    Parsetree.expression -> Parsetree.expression
  val sanitize :
    ?module_:Longident.t ->
    ?quoter:Ppx_deriving.quoter ->
    Parsetree.expression -> Parsetree.expression
  val with_quoter :
    (Ppx_deriving.quoter -> '-> Parsetree.expression) ->
    '-> Parsetree.expression
  val expand_path : path:string list -> string -> string
  val path_of_type_decl :
    path:string list -> Parsetree.type_declaration -> string list
  val mangle_type_decl :
    ?fixpoint:string ->
    [ `Prefix of string
    | `PrefixSuffix of string * string
    | `Suffix of string ] -> Parsetree.type_declaration -> string
  val mangle_lid :
    ?fixpoint:string ->
    [ `Prefix of string
    | `PrefixSuffix of string * string
    | `Suffix of string ] -> Longident.t -> Longident.t
  val attr :
    deriver:string ->
    string -> Parsetree.attributes -> Parsetree.attribute option
  val attr_warning : Parsetree.expression -> Parsetree.attribute
  val free_vars_in_core_type : Parsetree.core_type -> Ppx_deriving.tyvar list
  val remove_pervasives :
    deriver:string -> Parsetree.core_type -> Parsetree.core_type
  val fresh_var : string list -> string
  val fold_left_type_decl :
    ('-> Ppx_deriving.tyvar -> 'a) ->
    '-> Parsetree.type_declaration -> 'a
  val fold_right_type_decl :
    (Ppx_deriving.tyvar -> '-> 'a) ->
    Parsetree.type_declaration -> '-> 'a
  val fold_left_type_ext :
    ('-> Ppx_deriving.tyvar -> 'a) -> '-> Parsetree.type_extension -> 'a
  val fold_right_type_ext :
    (Ppx_deriving.tyvar -> '-> 'a) -> Parsetree.type_extension -> '-> 'a
  val poly_fun_of_type_decl :
    Parsetree.type_declaration ->
    Parsetree.expression -> Parsetree.expression
  val poly_fun_of_type_ext :
    Parsetree.type_extension -> Parsetree.expression -> Parsetree.expression
  val poly_apply_of_type_decl :
    Parsetree.type_declaration ->
    Parsetree.expression -> Parsetree.expression
  val poly_apply_of_type_ext :
    Parsetree.type_extension -> Parsetree.expression -> Parsetree.expression
  val poly_arrow_of_type_decl :
    (Parsetree.core_type -> Parsetree.core_type) ->
    Parsetree.type_declaration -> Parsetree.core_type -> Parsetree.core_type
  val poly_arrow_of_type_ext :
    (Parsetree.core_type -> Parsetree.core_type) ->
    Parsetree.type_extension -> Parsetree.core_type -> Parsetree.core_type
  val core_type_of_type_decl :
    Parsetree.type_declaration -> Parsetree.core_type
  val core_type_of_type_ext : Parsetree.type_extension -> Parsetree.core_type
  val instantiate :
    string list ->
    Parsetree.type_declaration ->
    Parsetree.core_type * string list * string list
  val fold_exprs :
    ?unit:Parsetree.expression ->
    (Parsetree.expression -> Parsetree.expression -> Parsetree.expression) ->
    Parsetree.expression list -> Parsetree.expression
  val seq_reduce :
    ?sep:Parsetree.expression ->
    Parsetree.expression -> Parsetree.expression -> Parsetree.expression
  val binop_reduce :
    Parsetree.expression ->
    Parsetree.expression -> Parsetree.expression -> Parsetree.expression
  val strong_type_of_type : Parsetree.core_type -> Parsetree.core_type
  val mapper : Ast_mapper.mapper
  val hash_variant : string -> int
end