Module Sarek_tag_erasure

val is_variant_ty : Sarek_types.typ -> bool
val iter_children : (Sarek_typed_ast.texpr -> unit) -> Sarek_typed_ast.texpr -> unit
val is_slot_var : int -> Sarek_typed_ast.texpr -> bool
val is_reducible_payload : Sarek_typed_ast.tpattern option -> bool
val is_ctor_case : string -> (Sarek_typed_ast.tpattern * Sarek_typed_ast.texpr) -> bool
val arm_matches_ctor : string -> (Sarek_typed_ast.tpattern * Sarek_typed_ast.texpr) -> bool
val ctor_arm_reachable : string -> (Sarek_typed_ast.tpattern * Sarek_typed_ast.texpr) list -> bool
val uses_all_reducible : int -> string -> Sarek_typed_ast.texpr -> bool
val reduce_matches : int -> string -> (unit -> Sarek_typed_ast.texpr) option -> Sarek_typed_ast.texpr -> Sarek_typed_ast.texpr
val is_scalar_prim : Sarek_types.typ -> bool
val typ_tag : Sarek_types.typ -> string
val pos_field_name : int -> string
type field_plan =
  1. | FKeep of int * Sarek_types.typ
    (*

    kept scalar field -> positional slot, its type

    *)
  2. | FUnary of int * Sarek_types.typ * string
    (*

    erased unary field -> slot, payload type, constructor name

    *)
  3. | FNullary of string
    (*

    erased nullary field -> dropped, constructor name

    *)
val plan_fields : (string * Sarek_typed_ast.texpr) list -> (string * field_plan) list option
val variant_field_ctor : (string * field_plan) list -> string -> string option
val field_read_of : int -> Sarek_typed_ast.texpr -> string option
val record_body_eligible : int -> (string * field_plan) list -> Sarek_typed_ast.texpr -> bool
type rec_ctx = {
  1. rc_rid : int;
  2. rc_rname : string;
  3. rc_synth_ty : Sarek_types.typ;
  4. rc_plan : (string * field_plan) list;
  5. rc_loc : Sarek_ast.loc;
}
val mk_field_read : rec_ctx -> int -> Sarek_types.typ -> Sarek_typed_ast.texpr
val try_erase_record : rec_ctx list -> string -> int -> Sarek_typed_ast.texpr -> Sarek_typed_ast.texpr -> Sarek_ast.loc -> Sarek_typed_ast.texpr option
val erase_record_fields : Sarek_typed_ast.texpr -> Sarek_typed_ast.texpr