// Path: src/main/java/litil/TypeScope.java
// public class TypeScope {
// 
//     private final Map<String, Type> scope;
//     private final TypeScope parent;
// 
//     private TypeScope(TypeScope parent, Map<String, Type> scope) {
//         this.parent = parent;
//         this.scope = scope;
//     }
// 
//     public TypeScope(TypeScope parent) {
//         this(parent, new HashMap<String, Type>());
//     }
// 
//     public TypeScope() {
//         this(null, new HashMap<String, Type>());
//     }
// 
//     public void define(String name, Type type) {
//         scope.put(name, type);
//     }
// 
//     public Type get(String name) {
//         Type res = scope.get(name);
//         if (res == null && parent != null) {
//             res = parent.get(name);
//         }
//         return res;
//     }
// 
//     public TypeScope child() {
//         return new TypeScope(this);
//     }
// 
//     @Override
//     public String toString() {
//         return scope + (parent == null ? "-|" : "->" + parent);
//     }
// }


import litil.TypeScope;
import litil.ast.*;
import java.util.*;
package litil.tc;



public class HMTypeChecker {
    private static int _id = 0;

// Path: src/main/java/litil/TypeScope.java
// public class TypeScope {
// 
//     private final Map<String, Type> scope;
//     private final TypeScope parent;
// 
//     private TypeScope(TypeScope parent, Map<String, Type> scope) {
//         this.parent = parent;
//         this.scope = scope;
//     }
// 
//     public TypeScope(TypeScope parent) {
//         this(parent, new HashMap<String, Type>());
//     }
// 
//     public TypeScope() {
//         this(null, new HashMap<String, Type>());
//     }
// 
//     public void define(String name, Type type) {
//         scope.put(name, type);
//     }
// 
//     public Type get(String name) {
//         Type res = scope.get(name);
//         if (res == null && parent != null) {
//             res = parent.get(name);
//         }
//         return res;
//     }
// 
//     public TypeScope child() {
//         return new TypeScope(this);
//     }
// 
//     @Override
//     public String toString() {
//         return scope + (parent == null ? "-|" : "->" + parent);
//     }
// }


// Path: src/main/java/litil/tc/HMTypeChecker.java
import litil.TypeScope;
import litil.ast.*;
import java.util.*;

package litil.tc;



public class HMTypeChecker {
    private static int _id = 0;

    public Type analyze(AstNode node, TypeScope env) {