import com.seaofnodes.simple.type.*; import java.nio.file.*; import java.util.*; /** Draw the ordering of Chapter 24's representative types and their duals. */ public class RichLattice { static String quote(String s) { return "\""+s.replace("\\","\\\\").replace("\"","\\\"").replace("\n","\\n")+"\""; } static String color(Type t) { String name=t.getClass().getSimpleName(); if(t==Type.TOP || t==Type.BOTTOM) return "#172e35"; return switch(name) { case "TypeInteger" -> "#d3e7f5"; case "TypeFloat" -> "#c7eee9"; case "TypePtr", "TypeMemPtr" -> "#cce4d6"; case "TypeFunPtr" -> "#dfd0ef"; case "TypeMem" -> "#a9c9e5"; case "TypeStruct", "Field" -> "#e0ebc8"; case "TypeTuple" -> "#f2d7e4"; case "TypeRPC" -> "#f4d4b5"; default -> name.startsWith("TypeConAry") ? "#d9d5cc" : "#faedce"; }; } public static void main(String[] args) throws Exception { var types=new ArrayList<>(new LinkedHashSet<>(Arrays.asList(Type.gather()))); int size=types.size(); boolean[][] above=new boolean[size][size]; for(int i=0;i n").append(j).append(";\n");edges++;} } dot.append("}\n"); Files.writeString(Path.of("docs/2026_REBASE/assets/rich-lattice.gv"),dot); System.out.println(size+" representative types; "+edges+" order edges (transitively reduced)."); } }