+
+ @Override
+ public int hashCode(int hash) {
+ hash = HashCodeUtils.updateWithPreprocessedValue(hash, APPLY_HASH);
+ hash = function.hashCode(hash);
+ hash = parameter.hashCode(hash);
+ return hash;
+ }
+
+ @Override
+ public int hashCode(int hash, TVar[] boundVars) {
+ hash = HashCodeUtils.updateWithPreprocessedValue(hash, APPLY_HASH);
+ hash = function.hashCode(hash, boundVars);
+ hash = parameter.hashCode(hash, boundVars);
+ return hash;
+ }
+
+ public Type getCanonicalFunction() {
+ if(function instanceof TMetaVar)
+ function = function.canonical();
+ return function;
+ }
+
+ public Type getCanonicalParameter() {
+ if(parameter instanceof TMetaVar)
+ parameter = parameter.canonical();
+ return parameter;
+ }
+
+ @Override
+ public boolean equalsCanonical(Type other) {
+ if(this == other)
+ return true;
+ if(!other.getClass().equals(TApply.class))
+ return false;
+ TApply apply = (TApply)other;
+ return getCanonicalFunction().equalsCanonical(apply.getCanonicalFunction())
+ && getCanonicalParameter().equalsCanonical(apply.getCanonicalParameter());
+ }