Tree

Data::Tree

A Raku (rooted) tree data structure modelled on Haskell's Data.Tree.

Installation

Using zef: clone this repo and

  • run zef install <path-to-repo>;

  • or cd into it and run zef install ..

Usage

The examples below are run in a Raku REPL with access to this module. So assume you've run use Data::Tree successfully in your REPL session.

Construct a tree from a nested list structure (list-of-lists, or lol) and then draw it:

> [1,[2,4,[5,6,7,8]],3].&lol2tree.&drawTree
1
|
+-2
| |
| +-4
| |
| `-5
|   |
|   +-6
|   |
|   +-7
|   |
|   `-8
|
`-3

"Unfold" a tree using a function &f that produces leaves from a seed, and then draw it:

> sub f($x) {
* 2*$x+1 > 7 && return ($x, []);
* return ($x, [2*$x, 2*$x+1]);
* }
&f

> unfoldTree(&f,1).&drawTree
1
|
+-2
| |
| +-4
| |
| `-5
|
`-3
  |
  +-6
  |
  `-7

Show the levels of that same last tree, as a list of lists:

> unfoldTree(&f,1).&levels
[[1] [2 3] [4 5 6 7]]

Or flatten it into a pre-order-traversal list:

> unfoldTree(&f,1).&flatten
[1 2 4 5 3 6 7]

Or compute the sum of its vertex values, by folding it with a summation "folder" function:

> sub folder($head, @rest) { $head + @rest.sum }
&folder

> foldTree(&folder, unfoldTree(&f,1))
28

(sanity check: yes, 1+2+3+4+5+6+7 equals 7 * 8 / 2 = 28).

Finally, here is a list of exported (or exportable) functions, with links to their cousins' documentation from Haskell or Perl.

Creation

original inspiration

original inspiration

original inspiration

Reduction

original inspiration

original inspiration

original inspiration

Display

original inspiration

original inspiration

original inspiration

original inspiration

Data::Tree v0.1

rooted-tree data structure and utils for Raku

Authors

  • stuart-little

License

Artistic-2.0

Dependencies

Test Dependencies

Provides

  • Data::Tree

The Camelia image is copyright 2009 by Larry Wall. "Raku" is trademark of the Yet Another Society. All rights reserved.