sig
  val bind_data_type_group_in_toplevel_items :
    TypeCore.env ->
    TypeCore.data_type_group ->
    ExpressionsCore.toplevel_item list ->
    TypeCore.env * ExpressionsCore.toplevel_item list * TypeCore.var list *
    (TypeCore.var * Datacon.name * SurfaceSyntax.datacon_info) list
  val bind_data_type_group_in_expr :
    TypeCore.env ->
    TypeCore.data_type_group ->
    ExpressionsCore.expression ->
    TypeCore.env * ExpressionsCore.expression * TypeCore.var list *
    (TypeCore.var * Datacon.name * SurfaceSyntax.datacon_info) list
  val resolve_branch : TypeCore.var -> TypeCore.branch -> TypeCore.branch
  val e_unit : ExpressionsCore.expression
  val p_unit : ExpressionsCore.pattern
  val eunloc : ExpressionsCore.expression -> ExpressionsCore.expression
  val tsubst_expr :
    TypeCore.typ ->
    int -> ExpressionsCore.expression -> ExpressionsCore.expression
  type substitution_kit = {
    subst_type : TypeCore.typ -> TypeCore.typ;
    subst_expr : ExpressionsCore.expression -> ExpressionsCore.expression;
    subst_def : ExpressionsCore.definitions -> ExpressionsCore.definitions;
    subst_toplevel :
      ExpressionsCore.toplevel_item list ->
      ExpressionsCore.toplevel_item list;
    subst_pat : ExpressionsCore.pattern list -> ExpressionsCore.pattern list;
    vars : TypeCore.var list;
    names : Variable.name list;
  }
  val bind_evars :
    TypeCore.env ->
    TypeCore.type_binding list -> TypeCore.env * Expressions.substitution_kit
  val bind_vars :
    TypeCore.env ->
    SurfaceSyntax.type_binding list ->
    TypeCore.env * Expressions.substitution_kit
  val bind_patexprs :
    TypeCore.env ->
    ExpressionsCore.rec_flag ->
    (ExpressionsCore.pattern * ExpressionsCore.expression) list ->
    TypeCore.env *
    (ExpressionsCore.pattern * ExpressionsCore.expression) list *
    Expressions.substitution_kit
  module ExprPrinter :
    sig
      val print_maybe_qualified_datacon :
        Datacon.name SurfaceSyntax.maybe_qualified -> MzPprint.document
      val pmaybe_qualified_datacon :
        Buffer.t -> Datacon.name SurfaceSyntax.maybe_qualified -> unit
      val print_datacon_reference :
        SurfaceSyntax.datacon_reference -> MzPprint.document
      val print_patexpr :
        TypeCore.env ->
        ExpressionsCore.pattern * ExpressionsCore.expression ->
        MzPprint.document
      val print_patexprs :
        TypeCore.env ->
        (ExpressionsCore.pattern * ExpressionsCore.expression) list ->
        MzPprint.document
      val print_pat :
        TypeCore.env -> ExpressionsCore.pattern -> MzPprint.document
      val print_tapp :
        TypeCore.env -> ExpressionsCore.tapp -> MzPprint.document
      val print_expr :
        TypeCore.env -> ExpressionsCore.expression -> MzPprint.document
      val print_rec_flag : ExpressionsCore.rec_flag -> MzPprint.document
      val print_ebinder :
        TypeCore.env ->
        TypeCore.type_binding * TypeCore.flavor -> MzPprint.document
      val print_binder :
        TypeCore.env ->
        (Variable.name * Kind.kind * TypeCore.location) * TypeCore.flavor ->
        MzPprint.document
      val print_definitions :
        TypeCore.env -> ExpressionsCore.definitions -> MzPprint.document
      val print_sig_item :
        TypeCore.env -> Variable.name * TypeCore.typ -> MzPprint.document
      val psigitem :
        Buffer.t -> TypeCore.env * (Variable.name * TypeCore.typ) -> unit
      val pdefinitions :
        Buffer.t -> TypeCore.env * ExpressionsCore.definitions -> unit
      val pexpr :
        Buffer.t -> TypeCore.env * ExpressionsCore.expression -> unit
      val ppat : Buffer.t -> TypeCore.env * ExpressionsCore.pattern -> unit
    end
end