visualize_tree.sf 793 B

12345678910111213141516171819202122232425262728
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Visualize_a_tree
  4. #
  5. func visualize_tree(tree, label, children,
  6. indent = '',
  7. mids = ['├─', '│ '],
  8. ends = ['└─', ' '],
  9. ) {
  10. func visit(node, pre) {
  11. gather {
  12. take(pre[0] + label(node))
  13. var chldn = children(node)
  14. var end = chldn.end
  15. chldn.each_kv { |i, child|
  16. if (i == end) { take(visit(child, [pre[1]] ~X+ ends)) }
  17. else { take(visit(child, [pre[1]] ~X+ mids)) }
  18. }
  19. }
  20. }
  21. visit(tree, [indent] * 2)
  22. }
  23. var tree = 'root':['a':['a1':['a11':[]]],'b':['b1':['b11':[]],'b2':[],'b3':[]]]
  24. say visualize_tree(tree, { .first }, { .second }).flatten.join("\n")