sig
  val fst3 : 'a * 'b * '-> 'a
  val snd3 : 'a * 'b * '-> 'b
  val thd3 : 'a * 'b * '-> 'c
  val ( !! ) : TypeCore.typ -> TypeCore.var
  val ( !!= ) : TypeCore.typ -> TypeCore.var
  val ( !* ) : 'Lazy.t -> 'a
  val ( >>= ) : 'a option -> ('-> 'b option) -> 'b option
  val ( ||| ) : 'a option -> 'a option -> 'a option
  val ( ^=> ) : bool -> bool -> bool
  val ( |> ) : '-> ('-> 'b) -> 'b
  val expand_if_one_branch : TypeCore.env -> TypeCore.typ -> TypeCore.typ
  val collect : TypeCore.typ -> TypeCore.typ * TypeCore.typ list
  val branches_for_branch :
    TypeCore.env -> TypeCore.branch -> TypeCore.typ list
  val branches_for_datacon :
    TypeCore.env -> TypeCore.resolved_datacon -> TypeCore.typ list
  val branch_for_datacon :
    TypeCore.env -> TypeCore.resolved_datacon -> TypeCore.typ
  val fields_for_datacon :
    TypeCore.env -> TypeCore.resolved_datacon -> TypeCore.Field.name list
  val flavor_for_datacon :
    TypeCore.env -> TypeCore.resolved_datacon -> DataTypeFlavor.flavor
  val ty_unit : TypeCore.typ
  val ty_tuple : TypeCore.typ list -> TypeCore.typ
  val ( @-> ) : TypeCore.typ -> TypeCore.typ -> TypeCore.typ
  val ty_bar : TypeCore.typ -> TypeCore.typ -> TypeCore.typ
  val ty_app : TypeCore.typ -> TypeCore.typ list -> TypeCore.typ
  val ty_equals : TypeCore.var -> TypeCore.typ
  val ty_open : TypeCore.var -> TypeCore.typ
  val is_tyapp : TypeCore.typ -> (TypeCore.var * TypeCore.typ list) option
  val is_star : TypeCore.env -> TypeCore.typ -> bool
  val is_concrete : TypeCore.typ -> bool
  val assert_concrete : TypeCore.typ -> TypeCore.branch
  val is_tyopen : TypeCore.typ -> bool
  val is_abbrev : TypeCore.env -> TypeCore.var -> bool
  val is_term : TypeCore.env -> TypeCore.var -> bool
  val is_perm : TypeCore.env -> TypeCore.var -> bool
  val is_type : TypeCore.env -> TypeCore.var -> bool
  val is_user : TypeCore.name -> bool
  val flatten_star : TypeCore.env -> TypeCore.typ -> TypeCore.typ list
  val fold_star : TypeCore.typ list -> TypeCore.typ
  val fold_forall :
    (TypeCore.type_binding * TypeCore.flavor) list ->
    TypeCore.typ -> TypeCore.typ
  val fold_exists :
    (TypeCore.type_binding * TypeCore.flavor) list ->
    TypeCore.typ -> TypeCore.typ
  val mark_reachable : TypeCore.env -> TypeCore.typ -> TypeCore.env
  val bind_datacon_parameters :
    TypeCore.env ->
    Kind.kind ->
    TypeCore.typ list -> TypeCore.env * TypeCore.var list * TypeCore.typ list
  val instantiate_type : TypeCore.typ -> TypeCore.typ list -> TypeCore.typ
  val find_and_instantiate_branch :
    TypeCore.env ->
    TypeCore.var -> Datacon.name -> TypeCore.typ list -> TypeCore.typ
  val get_location : TypeCore.env -> TypeCore.var -> TypeCore.location
  val get_adopts_clause : TypeCore.env -> TypeCore.var -> TypeCore.typ
  val get_arity : TypeCore.env -> TypeCore.var -> int
  val get_kind_for_type : TypeCore.env -> TypeCore.typ -> Kind.kind
  val variance : TypeCore.env -> TypeCore.var -> int -> TypeCore.variance
  val fresh_auto_name : string -> TypeCore.name
  val make_datacon_letters :
    TypeCore.env -> Kind.kind -> bool -> TypeCore.env * TypeCore.var list
  module TypePrinter :
    sig
      val print_var : TypeCore.env -> TypeCore.name -> MzPprint.document
      val pvar : Buffer.t -> TypeCore.env * TypeCore.name -> unit
      val print_datacon : Datacon.name -> MzPprint.document
      val print_field_name : TypeCore.Field.name -> MzPprint.document
      val print_field : SurfaceSyntax.field -> MzPprint.document
      val p_kind : Buffer.t -> Kind.kind -> unit
      val print_names :
        TypeCore.env -> TypeCore.name list -> MzPprint.document
      val pnames : Buffer.t -> TypeCore.env * TypeCore.name list -> unit
      val pname : Buffer.t -> TypeCore.env * TypeCore.var -> unit
      val print_quantified :
        TypeCore.env ->
        string ->
        TypeCore.name -> Kind.kind -> TypeCore.typ -> MzPprint.document
      val print_point : TypeCore.env -> TypeCore.var -> MzPprint.document
      val print_type : TypeCore.env -> TypeCore.typ -> MzPprint.document
      val print_constraint :
        TypeCore.env -> TypeCore.mode_constraint -> MzPprint.document
      val print_data_field_def :
        TypeCore.env -> TypeCore.data_field_def -> MzPprint.document
      val print_branch : TypeCore.env -> TypeCore.branch -> MzPprint.document
      val pfact : Buffer.t -> Fact.fact -> unit
      val print_facts : TypeCore.env -> MzPprint.document
      val print_permission_list :
        TypeCore.env * TypeCore.typ list -> MzPprint.document
      val ppermission_list : Buffer.t -> TypeCore.env * TypeCore.var -> unit
      val print_permissions : TypeCore.env -> MzPprint.document
      val ppermissions : Buffer.t -> TypeCore.env -> unit
      val ptype : Buffer.t -> TypeCore.env * TypeCore.typ -> unit
      val penv : Buffer.t -> TypeCore.env -> unit
      val pconstraint :
        Buffer.t -> TypeCore.env * TypeCore.mode_constraint -> unit
      val print_binders : TypeCore.env -> MzPprint.document
    end
end