--- /dev/null
+package org.simantics.scl.compiler.environment;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+\r
+import org.simantics.scl.compiler.common.names.Name;\r
+import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
+import org.simantics.scl.compiler.elaboration.modules.TypeAlias;\r
+import org.simantics.scl.compiler.elaboration.modules.TypeClass;\r
+import org.simantics.scl.compiler.elaboration.modules.TypeClassInstance;\r
+import org.simantics.scl.compiler.elaboration.modules.TypeConstructor;\r
+import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;\r
+import org.simantics.scl.compiler.elaboration.relations.SCLRelation;\r
+import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;\r
+import org.simantics.scl.compiler.module.Module;\r
+import org.simantics.scl.compiler.types.TCon;\r
+\r
+public abstract class AbstractEnvironment implements Environment {\r
+ protected abstract Module getModule(String name);\r
+ protected abstract Collection<Module> getModules();\r
+ \r
+ @Override\r
+ public SCLValue getValue(Name name) {\r
+ Module module = getModule(name.module);\r
+ if(module == null)\r
+ return null;\r
+ return module.getValue(name.name);\r
+ }\r
+\r
+ @Override\r
+ public SCLRelation getRelation(Name name) {\r
+ Module module = getModule(name.module);\r
+ if(module == null)\r
+ return null;\r
+ return module.getRelation(name.name);\r
+ }\r
+\r
+ @Override\r
+ public SCLEntityType getEntityType(Name name) {\r
+ Module module = getModule(name.module);\r
+ if(module == null)\r
+ return null;\r
+ return module.getEntityType(name.name);\r
+ }\r
+\r
+ @Override\r
+ public TypeConstructor getTypeConstructor(TCon type) {\r
+ Module module = getModule(type.module);\r
+ if(module == null)\r
+ return null;\r
+ return module.getTypeConstructor(type.name);\r
+ }\r
+\r
+ @Override\r
+ public EffectConstructor getEffectConstructor(TCon type) {\r
+ Module module = getModule(type.module);\r
+ if(module == null)\r
+ return null;\r
+ return module.getEffectConstructor(type.name);\r
+ }\r
+\r
+ @Override\r
+ public TypeAlias getTypeAlias(TCon type) {\r
+ Module module = getModule(type.module);\r
+ if(module == null)\r
+ return null;\r
+ return module.getTypeAlias(type.name);\r
+ }\r
+\r
+ @Override\r
+ public TypeClass getTypeClass(TCon type) {\r
+ Module module = getModule(type.module);\r
+ if(module == null)\r
+ return null;\r
+ return module.getTypeClass(type.name);\r
+ }\r
+\r
+ @Override\r
+ public Collection<TypeClassInstance> getInstances(TCon typeClass) {\r
+ Collection<TypeClassInstance> result = Collections.emptyList();\r
+ int nonemptySubresults = 0;\r
+ for(Module module : getModules()) {\r
+ Collection<TypeClassInstance> instances = module.getInstances(typeClass);\r
+ if(!instances.isEmpty()) {\r
+ switch(nonemptySubresults) {\r
+ case 0:\r
+ result = instances;\r
+ break;\r
+ case 1: {\r
+ ArrayList<TypeClassInstance> temp =\r
+ new ArrayList<TypeClassInstance>(\r
+ ((result.size() + instances.size())*3) / 2);\r
+ temp.addAll(result);\r
+ result = temp;\r
+ }\r
+ default:\r
+ result.addAll(instances);\r
+ }\r
+ ++nonemptySubresults;\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+}\r