functor (Generator : Pa_deriving_common.Defs.Generator->
  sig
    module Helpers :
      sig
        module Untranslate :
          sig
            val param :
              string * [< `Minus | `Plus ] option -> Camlp4.PreCast.Ast.ctyp
            val qname : string list -> Camlp4.PreCast.Ast.ident
            val qName : string list -> Camlp4.PreCast.Ast.ident
            val expr :
              Pa_deriving_common.Type.expr -> Camlp4.PreCast.Ast.ctyp
            val poly :
              Pa_deriving_common.Type.param list *
              Pa_deriving_common.Type.expr -> Camlp4.PreCast.Ast.ctyp
            val rhs : Pa_deriving_common.Type.rhs -> Camlp4.PreCast.Ast.ctyp
            val tagspec :
              Pa_deriving_common.Type.tagspec -> Camlp4.PreCast.Ast.ctyp
            val summand :
              Pa_deriving_common.Type.summand -> Camlp4.PreCast.Ast.ctyp
            val field :
              Pa_deriving_common.Type.field -> Camlp4.PreCast.Ast.ctyp
            val repr :
              Pa_deriving_common.Type.repr -> Camlp4.PreCast.Ast.ctyp
            val constraint_ :
              Pa_deriving_common.Type.expr * Pa_deriving_common.Type.expr ->
              Camlp4.PreCast.Ast.ctyp * Camlp4.PreCast.Ast.ctyp
            val decl :
              Pa_deriving_common.Type.decl -> Camlp4.PreCast.Ast.ctyp
            val sigdecl :
              Pa_deriving_common.Type.decl -> Camlp4.PreCast.Ast.ctyp list
          end
        val seq :
          Camlp4.PreCast.Ast.expr ->
          Camlp4.PreCast.Ast.expr -> Camlp4.PreCast.Ast.expr
        val seq_list :
          Camlp4.PreCast.Ast.expr list -> Camlp4.PreCast.Ast.expr
        val record_pattern :
          ?prefix:string ->
          Pa_deriving_common.Type.field list -> Camlp4.PreCast.Ast.patt
        val record_expr :
          (string * Camlp4.PreCast.Ast.expr) list -> Camlp4.PreCast.Ast.expr
        val record_expression :
          ?prefix:string ->
          Pa_deriving_common.Type.field list -> Camlp4.PreCast.Ast.expr
        val expr_list :
          Camlp4.PreCast.Ast.expr list -> Camlp4.PreCast.Ast.expr
        val patt_list :
          Camlp4.PreCast.Ast.patt list -> Camlp4.PreCast.Ast.patt
        val tuple_expr :
          Camlp4.PreCast.Ast.expr list -> Camlp4.PreCast.Ast.expr
        val tuple :
          ?param:string ->
          int ->
          string list * Camlp4.PreCast.Ast.patt * Camlp4.PreCast.Ast.expr
        val cast_pattern :
          Pa_deriving_common.Type.qname Pa_deriving_common.Type.NameMap.t ->
          ?param:string ->
          Pa_deriving_common.Type.expr ->
          Camlp4.PreCast.Ast.patt * Camlp4.PreCast.Ast.expr *
          Camlp4.PreCast.Ast.expr
        val modname_from_qname :
          qname:string list -> classname:string -> Camlp4.PreCast.Ast.ident
      end
    type context = {
      argmap :
        Pa_deriving_common.Type.qname Pa_deriving_common.Type.NameMap.t;
      params : Pa_deriving_common.Type.param list;
    }
    val substitute :
      Pa_deriving_common.Type.name Pa_deriving_common.Type.NameMap.t ->
      Pa_deriving_common.Type.expr -> Pa_deriving_common.Type.expr
    val setup_context :
      Pa_deriving_common.Type.decl -> Functor_class.Builder.context
    val param_map :
      Functor_class.Builder.context ->
      string Pa_deriving_common.Type.NameMap.t
    val tdec :
      context -> Pa_deriving_common.Type.name -> Camlp4.PreCast.Ast.ctyp
    val sigdec :
      context -> Pa_deriving_common.Type.name -> Camlp4.PreCast.Ast.ctyp list
    val wrapper :
      Functor_class.Builder.context ->
      Pa_deriving_common.Type.name ->
      Camlp4.PreCast.Ast.expr -> Camlp4.PreCast.Ast.module_expr
    val polycase :
      Functor_class.Builder.context ->
      Pa_deriving_common.Type.tagspec -> Camlp4.PreCast.Ast.match_case
    val expr :
      Functor_class.Builder.context ->
      Pa_deriving_common.Type.expr -> Camlp4.PreCast.Ast.expr
    val tup :
      Functor_class.Builder.context ->
      Pa_deriving_common.Type.expr list -> Camlp4.PreCast.Ast.expr
    val case :
      Functor_class.Builder.context ->
      string * Pa_deriving_common.Type.expr list ->
      Camlp4.PreCast.Ast.match_case
    val field :
      Functor_class.Builder.context ->
      string * ('a * Pa_deriving_common.Type.expr) * '->
      Camlp4.PreCast.Ast.expr
    val rhs :
      Functor_class.Builder.context ->
      Pa_deriving_common.Type.rhs -> Camlp4.PreCast.Ast.expr
    val maptype :
      Functor_class.Builder.context ->
      Pa_deriving_common.Type.name -> Camlp4.PreCast.Ast.ctyp
    val signature :
      Functor_class.Builder.context ->
      Pa_deriving_common.Type.name -> Camlp4.PreCast.Ast.sig_item list
    val decl :
      Pa_deriving_common.Type.name * Pa_deriving_common.Type.param list *
      Pa_deriving_common.Type.rhs *
      Pa_deriving_common.Type.constraint_ list * bool ->
      Camlp4.PreCast.Ast.module_binding
    val gen_sig :
      Pa_deriving_common.Type.name * Pa_deriving_common.Type.param list *
      Pa_deriving_common.Type.rhs *
      Pa_deriving_common.Type.constraint_ list * bool ->
      Camlp4.PreCast.Ast.sig_item
    val generate :
      (Pa_deriving_common.Type.name * Pa_deriving_common.Type.param list *
       Pa_deriving_common.Type.rhs *
       Pa_deriving_common.Type.constraint_ list * bool)
      list -> Camlp4.PreCast.Ast.str_item
    val generate_sigs :
      (Pa_deriving_common.Type.name * Pa_deriving_common.Type.param list *
       Pa_deriving_common.Type.rhs *
       Pa_deriving_common.Type.constraint_ list * bool)
      list -> Camlp4.PreCast.Ast.sig_item
  end