use itertools::Itertools; use std::borrow::Cow; use std::cmp::max; use std::collections::HashMap; use crate::error::{ErrorBuilder, TypeError}; use crate::semantics::{ merge_maps, mk_span_err, mkerr, ret_kind, ret_op, ret_ref, Binder, Closure, Hir, HirKind, Nir, NirKind, Ret, TextLit, Tir, TyEnv, Type, }; use crate::syntax::map::DupTreeSet; use crate::syntax::{ trivial_result, BinOp, Builtin, Const, ExprKind, Label, NumKind, Span, }; /// Operations #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum OpKind { /// `f a` App(SubExpr, SubExpr), /// Binary operations BinOp(BinOp, SubExpr, SubExpr), /// `if x then y else z` BoolIf(SubExpr, SubExpr, SubExpr), /// `merge x y : t` Merge(SubExpr, SubExpr, Option), /// `toMap x : t` ToMap(SubExpr, Option), /// `e.x` Field(SubExpr, Label), /// `e.{ x, y, z }` Projection(SubExpr, DupTreeSet