#pragma once #include #include struct type { virtual ~type() = default; }; using type_ptr = std::shared_ptr; struct type_var : public type { std::string name; type_var(std::string n) : name(std::move(n)) {} }; struct type_id : public type { int id; type_id(int i) : id(i) {} }; struct type_arr : public type { type_ptr left; type_ptr right; type_arr(type_ptr l, type_ptr r) : left(std::move(l)), right(std::move(r)) {} }; struct type_mgr { int last_id = 0; std::string new_type_name(); type_ptr new_type(); type_ptr new_arrow_type(); };