private static Map<Node, Node> compact(Map<Node, Node> replacements) { Set<Node> nodes=replacements.keySet(); Collection<Node> values=replacements.values(); Set<Node> rewrites=new HashSet<Node>(nodes); rewrites.retainAll(values); trace("- Replacements...: "+replacements); trace("- Rewriting nodes: "+rewrites); Map<Node, Node> result=new HashMap<Node,Node>(); for(Node node:nodes) { trace("- Compacting '%s'...",node); Node newNode=resolve(1,node, replacements, rewrites, result); trace("- Compacted '%s' to '%s' from '%s'...",node,newNode,replacements.get(node)); result.put(node, newNode); } return result; }
private static Node resolve(int i, Node node, Map<Node, Node> original, Set<Node> rewrites, Map<Node, Node> compacted) { Node newNode=original.get(node); if(rewrites.contains(newNode)) { Node tmp=compacted.get(newNode); if(tmp==null) { String prefix=indent(i); trace("%s+ Resolving rewrite '%s' for node '%s'...",prefix,newNode,node); tmp=resolve(i+1,newNode,original,rewrites,compacted); trace("%s+ Rewrite '%s' resolved to '%s'",prefix,newNode,tmp); compacted.put(newNode, tmp); } newNode=tmp; } return newNode; }