fcn nestToIndent(nestTree){ fcn(out,node,level){ out.append(List(level,node[0])); // (n,name) or ("..",name) if(node.len()>1){ // (name children), (name, (tree)) level+=1; foreach child in (node[1,*]){ if(String.isType(child)) out.append(List(level,child)); else self.fcn(out,child,level) } } out }(List(),nestTree,0) } fcn nestToString(nestTree,dot="."){ fcn(out,dot,node,level){ out.writeln(dot*level,node[0]); // (name) if(node.len()>1){ // (name children), (name, (tree)) level+=1; foreach child in (node[1,*]){ if(String.isType(child)) out.writeln(dot*level,child); else self.fcn(out,dot,child,level) } } out }(Data(),dot,nestTree,0).text } fcn indentToNest(iTree,depth=0,nTree=List()){ while(iTree){ // (n,name) d, name := iTree[0]; if(d==depth){ nTree.append(name); iTree.pop(0); } else if(d>depth){ // assume can't skip levels down if(nTree.len()>1 and not List.isType((nm:=nTree[-1]))){ nTree[-1]=(children:=List(nm)); indentToNest(iTree,d,children); }else{ nTree.append(children:=List(name)); iTree.pop(0); indentToNest(iTree,d+1,children); } } else break; // d