Tree-Ops
view release on metacpan or search on metacpan
lib/Tree/Ops.pm view on Meta::CPAN
sub mostRecentCommonAncestor($$) # Find the most recent common ancestor of the specified children.
{my ($first, $second) = @_; # First child, second child
return $first if $first == $second; # Same first and second child
my @f = context $first; # Context of first child
my @s = context $second; # Context of second child
my $c; $c = pop @f, pop @s while @f and @s and $f[-1] == $s[-1]; # Remove common ancestors
$c
}
sub go($@) # Return the child at the end of the path starting at the specified parent. A path is a list of zero based children numbers. Return B<undef> if the path is not valid.
{my ($parent, @path) = @_; # Parent, list of zero based children numbers
my $p = $parent; # Start
my $q; defined($q = $p->children->[$_]) ? $p = $q : return undef for @path; # Down # Same first and second child
$p
}
#D1 Location # Verify the current location.
sub context($) # Get the context of the current child.
{my ($child) = @_; # Child
lib/Tree/Ops.pm view on Meta::CPAN
}
sub split($) # Make the specified parent a grandparent of each of its children by interposing a copy of the specified parent between the specified parent and each of its children. Ret...
{my ($parent) = @_; # Parent to make into a grand parent
wrap $_, $parent->key for $parent->children->@*; # Grandparent each child
$parent
}
#D1 Traverse # Traverse a tree.
sub by($;$) # Traverse a tree in post-order to process each child with the specified sub and return an array of the results of processing each child. If no sub sub is specified, the ...
{my ($tree, $sub) = @_; # Tree, optional sub to process each child
$sub //= sub{@_}; # Default sub
my @r; # Results
sub # Traverse
{my ($child) = @_; # Child
__SUB__->($_) for $child->children->@*; # Children of child
push @r, &$sub($child); # Process child saving result
}->($tree); # Start at root of tree
( run in 0.914 second using v1.01-cache-2.11-cpan-524268b4103 )