// Path: src/main/java/org/hummingbirdlang/types/CompositeType.java
// public abstract class CompositeType extends Type {
// }
// 
// Path: src/main/java/org/hummingbirdlang/types/Property.java
// public abstract class Property {
//   // The type of the thing of which this is a property. For example in
//   // `foo.bar` where `foo: Foo`, the parent would be the type `Foo`.
//   private final Type parent;
//   // The name of the property, in the previous example `bar`.
//   private final String name;
// 
//   protected Property(Type parent, String name) {
//     this.parent = parent;
//     this.name = name;
//   }
// 
//   // Returns the type of the property (right now just `MethodType`).
//   public abstract Type getType();
// }
// 
// Path: src/main/java/org/hummingbirdlang/types/PropertyNotFoundException.java
// public class PropertyNotFoundException extends TypeException {
//   public PropertyNotFoundException(String message) {
//     super(message);
//   }
// 
//   public PropertyNotFoundException(Type type, String name) {
//     super("Unknown property " + name + " of " + type.toString());
//   }
// }
// 
// Path: src/main/java/org/hummingbirdlang/types/Type.java
// public abstract class Type {
//   public abstract Property getProperty(String name) throws PropertyNotFoundException;
// 
//   public void assertEquals(Type otherType) throws TypeMismatchException {
//     // Rudimentary pointer comparison by default.
//     if (this != otherType) {
//       throw new TypeMismatchException(this, otherType);
//     }
//   }
// 
//   /**
//    * Returns whether or not this type is equal to another type.
//    */
//   public boolean equals(Type otherType) {
//     try {
//       this.assertEquals(otherType);
//     } catch (TypeMismatchException exception) {
//       return false;
//     }
//     return true;
//   }
// }


import org.hummingbirdlang.types.CompositeType;
import org.hummingbirdlang.types.Property;
import org.hummingbirdlang.types.PropertyNotFoundException;
import org.hummingbirdlang.types.Type;
package org.hummingbirdlang.types.composite;


public class TupleType extends CompositeType {
  private Type[] elements;

  public TupleType(Type[] elements) {
// Path: src/main/java/org/hummingbirdlang/types/CompositeType.java
// public abstract class CompositeType extends Type {
// }
// 
// Path: src/main/java/org/hummingbirdlang/types/Property.java
// public abstract class Property {
//   // The type of the thing of which this is a property. For example in
//   // `foo.bar` where `foo: Foo`, the parent would be the type `Foo`.
//   private final Type parent;
//   // The name of the property, in the previous example `bar`.
//   private final String name;
// 
//   protected Property(Type parent, String name) {
//     this.parent = parent;
//     this.name = name;
//   }
// 
//   // Returns the type of the property (right now just `MethodType`).
//   public abstract Type getType();
// }
// 
// Path: src/main/java/org/hummingbirdlang/types/PropertyNotFoundException.java
// public class PropertyNotFoundException extends TypeException {
//   public PropertyNotFoundException(String message) {
//     super(message);
//   }
// 
//   public PropertyNotFoundException(Type type, String name) {
//     super("Unknown property " + name + " of " + type.toString());
//   }
// }
// 
// Path: src/main/java/org/hummingbirdlang/types/Type.java
// public abstract class Type {
//   public abstract Property getProperty(String name) throws PropertyNotFoundException;
// 
//   public void assertEquals(Type otherType) throws TypeMismatchException {
//     // Rudimentary pointer comparison by default.
//     if (this != otherType) {
//       throw new TypeMismatchException(this, otherType);
//     }
//   }
// 
//   /**
//    * Returns whether or not this type is equal to another type.
//    */
//   public boolean equals(Type otherType) {
//     try {
//       this.assertEquals(otherType);
//     } catch (TypeMismatchException exception) {
//       return false;
//     }
//     return true;
//   }
// }


// Path: src/main/java/org/hummingbirdlang/types/composite/TupleType.java
import org.hummingbirdlang.types.CompositeType;
import org.hummingbirdlang.types.Property;
import org.hummingbirdlang.types.PropertyNotFoundException;
import org.hummingbirdlang.types.Type;

package org.hummingbirdlang.types.composite;


public class TupleType extends CompositeType {
  private Type[] elements;

  public TupleType(Type[] elements) {
    this.elements = elements;