NAME

Code::Includable::Tree::NodeMethods - Tree node routines

VERSION

This document describes version 0.129 of Code::Includable::Tree::NodeMethods (from Perl distribution RoleBundle-TinyCommons-Tree), released on 2021-10-07.

DESCRIPTION

The routines in this module can be imported manually to your tree class/role. The only requirement is that your tree class supports parent and children methods.

The routines can also be called as a normal function call, with your tree node object as the first argument, e.g.:

next_siblings($node)

VARIABLES

$IGNORE_NO_CHILDREN_METHOD => bool (default: 1)

If set to true (the default), when a node object does not support a "get children" method, we do not die and assume it does not have children.

$GET_PARENT_METHOD => str (default: parent)

The method names parent can actually be customized by (locally) setting this variable and/or $SET_PARENT_METHOD.

$SET_PARENT_METHOD => str (default: parent)

The method names parent can actually be customized by (locally) setting this variable and/or $GET_PARENT_METHOD.

$GET_CHILDREN_METHOD => str (default: children)

The method names children can actually be customized by (locally) setting this variable and $SET_CHILDREN_METHOD.

$SET_CHILDREN_METHOD => str (default: children)

The method names children can actually be customized by (locally) setting this variable and $GET_CHILDREN_METHOD.

FUNCTIONS

ancestors

Return a list of ancestors, from the direct parent upwards to the root.

retrieve_parent

Return direct parent. Basically a standard way to call "get parent" method, as the latter can be customized.

check

Usage:

$node->check(\%opts)

Check references in a tree: that all children refers back to the parent. Options:

  • recurse => bool

  • check_root => bool

    If set to true, will also check that parent is undef (meaning this node is a root node).

descendants

Return a list of descendents, from the direct children, to their children's children, and so on until all the leaf nodes.

For example, for this tree:

A
|-- B
|   |-- D
|   |-- E
|   `-- F
`-- C
    |-- G
    |   `-- I
    `-- H

the nodes returned for descendants(A) would be:

B C D E F G H I

descendants_depth_first

Like "descendants", except will return in depth-first order. For example, using the same object in the "descendants" example, descendants_depth_first(A) will return:

B D E F C G I H

first_node

Usage:

$node->first_node($coderef)

Much like List::Util's first. Will "walk" the descendant nodes until the first coderef returns true, and return that.

is_first_child

is_first_child_of_type

is_last_child

is_last_child_of_type

is_nth_child

is_nth_child_of_type

is_nth_last_child

is_nth_last_child_of_type

is_only_child

is_only_child_of_type

next_sibling

Return the sibling node directly after this node.

next_siblings

Return all the next siblings of this node, from the one directly after to the last.

prev_sibling

Return the sibling node directly before this node.

prev_siblings

Return all the previous siblings of this node, from the first to the one directly before.

is_root

has_min_children(m)

Only select nodes that have at least m direct children.

has_max_children(n)

Only select nodes that have at most n direct children.

has_children_between(m, n)

Only select nodes that have between m and n direct children.

remove

Detach this node from its parent. Also set the parent of this node to undef.

walk

Usage:

$node->walk($coderef);

Call $coderef for all descendants (this means the self node is not included). $coderef will be passed the node.

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/RoleBundle-TinyCommons-Tree.

SOURCE

Source repository is at https://github.com/perlancar/perl-RoleBundle-TinyCommons-Tree.

SEE ALSO

Role::TinyCommons::Tree::NodeMethods if you want to use the routines in this module via consuming role.

AUTHOR

perlancar <perlancar@cpan.org>

CONTRIBUTING

To contribute, you can send patches by email/via RT, or send pull requests on GitHub.

Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via:

% prove -l

If you want to build the distribution (e.g. to try to install it locally on your system), you can install Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, and sometimes one or two other Dist::Zilla plugin and/or Pod::Weaver::Plugin. Any additional steps required beyond that are considered a bug and can be reported to me.

COPYRIGHT AND LICENSE

This software is copyright (c) 2021, 2020, 2016 by perlancar <perlancar@cpan.org>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=RoleBundle-TinyCommons-Tree

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.