/ general tree diagram \d .general gl:{:[~#x;,"";@x;at x;@*x 1;ap ._f'x;ap[_f@*x]ab@_f'x 1]} / general tree diagram from list at:{,:[1=#s:$x;s;" ",s]} / count of atom ab:{w:(#*:)'x;hl[+/w]@,'/cd@{cm[vl[x]y;y]z}'[x;w;w]} / fuse over cd:{w:#:'x;c:|/w;em'[x;w;c]} / max rows take each ap:{a:#*x;b:#*y;c:a|b;cm[x;a;c],cm[vl[y]b;b;c]} / append to parent em:{x,((z-y),#*x)#""} / extend matrix (add rows) vl:{:[y;cm[,,"|";1;y],x;x]} / vertical line hl:{b:"|"=*y;-1!y,,@[@[x#"";&(|\b)&||\|b;:;"-"];(_.5*x),&b;:;"+"]} / horizontal line cm:{(_.5*k)!'((k:z-y)#""),/:x} / center matrix rows lt:{b:{(x;())}'(!#x),'y;rl al@nl/[*b;1_ x;1_ b]} / list from tree = parent vector + symbols nl:{:[y=**x;(*x;x[1],,z);#x 1;(*x;_f[;y;z]'x 1);x]} / nest list al:{:[~#x;x;4:x;x;1=#x;_f@*x;_f'x]} / atomize nodes rl:{:[~#x;x;1=4:**x;(x[0;1];_f x 1);_f'x]} / remove indices tree:{-1_ gl lt[x]y} / general tree show:{`0:tree[x]y} / show general tree \ \d ^ o:(0 0 1 2 3 3 3 6 6 6 6 8 8 `zero`one`two`three`four`five`six`seven`eight`nine`ten`eleven`twelve) .general.show . o p:(0 0 1 2 2 4 4 `zero`one`two`three`four`seven`eight) .general.show . p \ zero | one | two | three | +----+-----------+----+ | | | four five six | +---------++-------+----+ | | | | seven eight nine ten | +---+--+ | | eleven twelve zero | one | two | +-----+--+ | | three four | +--+--+ | | seven eight