Name
Tree::Ops - Tree operations.
Synopsis
Create a tree:
my $t = Tree::Ops::new 'a';
for(1..2)
{$t->open ('b');
$t->single('c');
$t->close;
}
$t->single ('d');
Print the tree:
is_deeply $t->print(sub{@_}), <<END;
a
b
c
b
c
d
END
Locate a specific child in the tree and print it:
is_deeply [map {$_->user} $t->select('b')], ['b', 'b'];
Description
Tree operations.
Version 20200702.
The following sections describe the methods in each functional area of this module. For an alphabetic listing of all methods by name see Index.
Build
Create a tree.
new($user)
Create a new child recording the specified user data.
Parameter Description
1 $user User data to be recorded in the child
Example:
if (1)
{my $t = Tree::Ops::new 'a'; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
for(1..2)
{$t->open ('b');
$t->single('c');
$t->close;
}
$t->single ('d');
is_deeply $t->print, <<END;
a
b
c
b
c
d
END
is_deeply [map {$_->user} $t->select('b')], ['b', 'b'];
}
This is a static method and so should either be imported or invoked as:
Tree::Ops::new
open($tree, $user)
Add a child and make it the currently active scope into which new children will be added.
Parameter Description
1 $tree Tree
2 $user User data to be recorded in the interior child being opened
Example:
if (1)
{my $t = Tree::Ops::new 'a';
for(1..2)
{$t->open ('b'); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
$t->single('c');
$t->close;
}
$t->single ('d');
is_deeply $t->print, <<END;
a
b
c
b
c
d
END
is_deeply [map {$_->user} $t->select('b')], ['b', 'b'];
}
close($tree)
Close the current scope returning to the previous scope.
Parameter Description
1 $tree Tree
Example:
if (1)
{my $t = Tree::Ops::new 'a';
for(1..2)
{$t->open ('b');
$t->single('c');
$t->close; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
}
$t->single ('d');
is_deeply $t->print, <<END;
a
b
c
b
c
d
END
is_deeply [map {$_->user} $t->select('b')], ['b', 'b'];
}
single($tree, $user)
Add one child in the current scope.
Parameter Description
1 $tree Tree
2 $user User data to be recorded in the child being created
Example:
if (1)
{my $t = Tree::Ops::new 'a';
for(1..2)
{$t->open ('b');
$t->single('c'); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
$t->close;
}
$t->single ('d'); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $t->print, <<END;
a
b
c
b
c
d
END
is_deeply [map {$_->user} $t->select('b')], ['b', 'b'];
}
fromLetters($letters)
Create a tree from a string of letters - useful for testing.
Parameter Description
1 $letters String of letters and ( ).
Example:
ok fromLetters(q(bc(d)))->brackets eq q(a(bc(d))); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Navigation
Navigate through a tree.
first($parent)
Get the first child under the specified parent.
Parameter Description
1 $parent Parent
Example:
is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
is_deeply $c->parent, $b;
is_deeply $a->first, $b; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->last, $d;
is_deeply $e->next, $f;
is_deeply $f->prev, $e;
last($parent)
Get the last child under the specified parent.
Parameter Description
1 $parent Parent
Example:
is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
is_deeply $c->parent, $b;
is_deeply $a->first, $b;
is_deeply $a->last, $d; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $e->next, $f;
is_deeply $f->prev, $e;
next($child)
Get the next sibling following the specified child.
Parameter Description
1 $child Child
Example:
is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
is_deeply $c->parent, $b;
is_deeply $a->first, $b;
is_deeply $a->last, $d;
is_deeply $e->next, $f; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $f->prev, $e;
prev($child)
Get the previous sibling of the specified child.
Parameter Description
1 $child Child
Example:
is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
is_deeply $c->parent, $b;
is_deeply $a->first, $b;
is_deeply $a->last, $d;
is_deeply $e->next, $f;
is_deeply $f->prev, $e; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
firstMost($parent)
Return the first most descendant child in the tree starting at this parent or else return undef if this parent has no children.
Parameter Description
1 $parent Child
Example:
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
is_deeply $a->print(sub{@_}), <<END;
a
b
c
y
x
y
x
d
e
f
g
h
i
j
END
is_deeply $a->firstMost->brackets, 'c'; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a-> lastMost->brackets, 'j';
lastMost($parent)
Return the last most descendant child in the tree starting at this parent or else return undef if this parent has no children.
Parameter Description
1 $parent Child
Example:
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
is_deeply $a->print(sub{@_}), <<END;
a
b
c
y
x
y
x
d
e
f
g
h
i
j
END
is_deeply $a->firstMost->brackets, 'c';
is_deeply $a-> lastMost->brackets, 'j'; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Location
Verify the current location.
context($child)
Get the context of the current child.
Parameter Description
1 $child Child
Example:
is_deeply $a->brackets, 'a(b(c)y(x)z(st)d(efgh(i(j))))';
is_deeply [map {$_->user} $x->context], [qw(x y a)]; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply join(' ', $a->by(sub{$_[0]->user})), "c b x y s t z e f g j i h d a";
is_deeply join(' ', map{$_->user} $a->by), "c b x y s t z e f g j i h d a";
$z->cut;
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->unwrap;
is_deeply $a->brackets, 'a(b(c)xd(efgh(i(j))))';
$y = $x->wrap('y');
is_deeply $y->brackets, 'y(x)';
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->putNext($y->dup);
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
isFirst($child)
Return the specified child if that child is first under its parent, else return undef.
Parameter Description
1 $child Child
Example:
if (1)
{is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
is_deeply $b->singleChildOfParent, $c;
is_deeply $e->isFirst, $e; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
ok !$f->isFirst; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
ok !$g->isLast;
is_deeply $h->isLast, $h;
}
isLast($child)
Return the specified child if that child is last under its parent, else return undef.
Parameter Description
1 $child Child
Example:
if (1)
{is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
is_deeply $b->singleChildOfParent, $c;
is_deeply $e->isFirst, $e;
ok !$f->isFirst;
ok !$g->isLast; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $h->isLast, $h; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
}
singleChildOfParent($parent)
Return the only child of this parent if the parent has an only child, else undef
Parameter Description
1 $parent Parent
Example:
if (1)
{is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
is_deeply $b->singleChildOfParent, $c; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $e->isFirst, $e;
ok !$f->isFirst;
ok !$g->isLast;
is_deeply $h->isLast, $h;
}
Put
Insert children into a tree.
putFirst($parent, $child)
Place a new child first under the specified parent and return the child.
Parameter Description
1 $parent Parent
2 $child Child
Example:
is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
my $z = $b->putNext(new 'z');
is_deeply $z->brackets, 'z';
is_deeply $a->brackets, 'a(b(c)zd(efgh(i(j))))';
my $y = $d->putPrev(new 'y');
is_deeply $y->brackets, 'y';
is_deeply $a->brackets, 'a(b(c)zyd(efgh(i(j))))';
$z->putLast(new 't');
is_deeply $z->brackets, 'z(t)';
is_deeply $a->brackets, 'a(b(c)z(t)yd(efgh(i(j))))';
$z->putFirst(new 's'); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)z(st)yd(efgh(i(j))))';
putLast($parent, $child)
Place a new child last under the specified parent and return the child.
Parameter Description
1 $parent Parent
2 $child Child
Example:
is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
my $z = $b->putNext(new 'z');
is_deeply $z->brackets, 'z';
is_deeply $a->brackets, 'a(b(c)zd(efgh(i(j))))';
my $y = $d->putPrev(new 'y');
is_deeply $y->brackets, 'y';
is_deeply $a->brackets, 'a(b(c)zyd(efgh(i(j))))';
$z->putLast(new 't'); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $z->brackets, 'z(t)';
is_deeply $a->brackets, 'a(b(c)z(t)yd(efgh(i(j))))';
$z->putFirst(new 's');
is_deeply $a->brackets, 'a(b(c)z(st)yd(efgh(i(j))))';
putNext($child, $new)
Place a new child after the specified child.
Parameter Description
1 $child Existing child
2 $new New child
Example:
is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
my $z = $b->putNext(new 'z'); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $z->brackets, 'z';
is_deeply $a->brackets, 'a(b(c)zd(efgh(i(j))))';
my $y = $d->putPrev(new 'y');
is_deeply $y->brackets, 'y';
is_deeply $a->brackets, 'a(b(c)zyd(efgh(i(j))))';
$z->putLast(new 't');
is_deeply $z->brackets, 'z(t)';
is_deeply $a->brackets, 'a(b(c)z(t)yd(efgh(i(j))))';
$z->putFirst(new 's');
is_deeply $a->brackets, 'a(b(c)z(st)yd(efgh(i(j))))';
putPrev($child, $new)
Place a new child before the specified child.
Parameter Description
1 $child Child
2 $new New child
Example:
is_deeply $a->brackets, 'a(b(c)d(efgh(i(j))))';
my $z = $b->putNext(new 'z');
is_deeply $z->brackets, 'z';
is_deeply $a->brackets, 'a(b(c)zd(efgh(i(j))))';
my $y = $d->putPrev(new 'y'); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $y->brackets, 'y';
is_deeply $a->brackets, 'a(b(c)zyd(efgh(i(j))))';
$z->putLast(new 't');
is_deeply $z->brackets, 'z(t)';
is_deeply $a->brackets, 'a(b(c)z(t)yd(efgh(i(j))))';
$z->putFirst(new 's');
is_deeply $a->brackets, 'a(b(c)z(st)yd(efgh(i(j))))';
Steps
Move the start or end of a scope forwards or backwards as suggested by Alex Monroe.
step($parent)
Make the first child of the specified parent the parents previous sibling and return the parent. In effect this moves the start of the parent one step forwards.
Parameter Description
1 $parent Parent
Example:
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$d->step; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)y(x)y(x)ed(fgh(i(j))))';
$d->stepBack; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$b->stepEnd; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(cy(x))y(x)d(efgh(i(j))))';
$b->stepEndBack; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
stepEnd($parent)
Make the next sibling of the specified parent the parents last child and return the parent. In effect this moves the end of the parent one step forwards.
Parameter Description
1 $parent Parent
Example:
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$d->step;
is_deeply $a->brackets, 'a(b(c)y(x)y(x)ed(fgh(i(j))))';
$d->stepBack;
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$b->stepEnd; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(cy(x))y(x)d(efgh(i(j))))';
$b->stepEndBack; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
stepBack()
Make the previous sibling of the specified parent the parents first child and return the parent. In effect this moves the start of the parent one step backwards.
Example:
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$d->step;
is_deeply $a->brackets, 'a(b(c)y(x)y(x)ed(fgh(i(j))))';
$d->stepBack; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$b->stepEnd;
is_deeply $a->brackets, 'a(b(cy(x))y(x)d(efgh(i(j))))';
$b->stepEndBack;
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
stepEndBack()
Make the last child of the specified parent the parents next sibling and return the parent. In effect this moves the end of the parent one step backwards.
Example:
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$d->step;
is_deeply $a->brackets, 'a(b(c)y(x)y(x)ed(fgh(i(j))))';
$d->stepBack;
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$b->stepEnd;
is_deeply $a->brackets, 'a(b(cy(x))y(x)d(efgh(i(j))))';
$b->stepEndBack; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
Edit
Edit a tree in situ.
cut($child)
Cut out a child and all its content and children, return it ready for reinsertion else where.
Parameter Description
1 $child Child
Example:
is_deeply $a->brackets, 'a(b(c)y(x)z(st)d(efgh(i(j))))';
is_deeply [map {$_->user} $x->context], [qw(x y a)];
is_deeply join(' ', $a->by(sub{$_[0]->user})), "c b x y s t z e f g j i h d a";
is_deeply join(' ', map{$_->user} $a->by), "c b x y s t z e f g j i h d a";
$z->cut; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->unwrap;
is_deeply $a->brackets, 'a(b(c)xd(efgh(i(j))))';
$y = $x->wrap('y');
is_deeply $y->brackets, 'y(x)';
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->putNext($y->dup);
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
dup($parent)
Duplicate a parent and all its descendants.
Parameter Description
1 $parent Parent
Example:
is_deeply $a->brackets, 'a(b(c)y(x)z(st)d(efgh(i(j))))';
is_deeply [map {$_->user} $x->context], [qw(x y a)];
is_deeply join(' ', $a->by(sub{$_[0]->user})), "c b x y s t z e f g j i h d a";
is_deeply join(' ', map{$_->user} $a->by), "c b x y s t z e f g j i h d a";
$z->cut;
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->unwrap;
is_deeply $a->brackets, 'a(b(c)xd(efgh(i(j))))';
$y = $x->wrap('y');
is_deeply $y->brackets, 'y(x)';
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->putNext($y->dup); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
unwrap($child)
Unwrap the specified child and return that child.
Parameter Description
1 $child Child
Example:
is_deeply $a->brackets, 'a(b(c)y(x)z(st)d(efgh(i(j))))';
is_deeply [map {$_->user} $x->context], [qw(x y a)];
is_deeply join(' ', $a->by(sub{$_[0]->user})), "c b x y s t z e f g j i h d a";
is_deeply join(' ', map{$_->user} $a->by), "c b x y s t z e f g j i h d a";
$z->cut;
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->unwrap; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)xd(efgh(i(j))))';
$y = $x->wrap('y');
is_deeply $y->brackets, 'y(x)';
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->putNext($y->dup);
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
wrap($child, $user)
Wrap the specified child with a new parent and return the new parent.
Parameter Description
1 $child Child to wrap
2 $user User data for new wrapping parent
Example:
is_deeply $a->brackets, 'a(b(c)y(x)z(st)d(efgh(i(j))))';
is_deeply [map {$_->user} $x->context], [qw(x y a)];
is_deeply join(' ', $a->by(sub{$_[0]->user})), "c b x y s t z e f g j i h d a";
is_deeply join(' ', map{$_->user} $a->by), "c b x y s t z e f g j i h d a";
$z->cut;
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->unwrap; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->brackets, 'a(b(c)xd(efgh(i(j))))';
$y = $x->wrap('y'); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $y->brackets, 'y(x)';
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->putNext($y->dup);
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
merge($parent)
Merge the children of the specified parent with those of the surrounding parents if the user data of those parents smartmatch that of the specified parent. Merged parents are unwrapped. Returns the specified parent regardless. From a proposal made by Micaela Monroe.
Parameter Description
1 $parent Merging parent
Example:
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$d->split;
is_deeply $d->brackets, 'd(d(e)d(f)d(g)d(h(i(j))))';
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(d(e)d(f)d(g)d(h(i(j)))))';
$d->first->merge; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $d->brackets, 'd(d(efgh(i(j))))';
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(d(efgh(i(j)))))';
$d->first->unwrap;
is_deeply $d->brackets, 'd(efgh(i(j)))';
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
split($parent)
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. Return the specified parent.
Parameter Description
1 $parent Parent to make into a grand parent
Example:
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
$d->split; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $d->brackets, 'd(d(e)d(f)d(g)d(h(i(j))))';
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(d(e)d(f)d(g)d(h(i(j)))))';
$d->first->merge;
is_deeply $d->brackets, 'd(d(efgh(i(j))))';
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(d(efgh(i(j)))))';
$d->first->unwrap;
is_deeply $d->brackets, 'd(efgh(i(j)))';
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
Traverse
Traverse a tree.
by($tree, $sub)
Traverse a tree in 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 children are returned in tree order.
Parameter Description
1 $tree Tree
2 $sub Optional sub to process each child
Example:
is_deeply $a->brackets, 'a(b(c)y(x)z(st)d(efgh(i(j))))';
is_deeply [map {$_->user} $x->context], [qw(x y a)];
is_deeply join(' ', $a->by(sub{$_[0]->user})), "c b x y s t z e f g j i h d a"; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply join(' ', map{$_->user} $a->by), "c b x y s t z e f g j i h d a"; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
$z->cut;
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->unwrap;
is_deeply $a->brackets, 'a(b(c)xd(efgh(i(j))))';
$y = $x->wrap('y');
is_deeply $y->brackets, 'y(x)';
is_deeply $a->brackets, 'a(b(c)y(x)d(efgh(i(j))))';
$y->putNext($y->dup);
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))';
select($tree, $select)
Select matching children in a tree. A child can be selected via named value, array of values, a hash of values, a regular expression or a sub reference.
Parameter Description
1 $tree Tree
2 $select Method to select a child
Example:
if (1)
{my $t = Tree::Ops::new 'a';
for(1..2)
{$t->open ('b');
$t->single('c');
$t->close;
}
$t->single ('d');
is_deeply $t->print, <<END;
a
b
c
b
c
d
END
is_deeply [map {$_->user} $t->select('b')], ['b', 'b']; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
}
Print a tree.
print($tree, $print)
String representation as a horizontal tree.
Parameter Description
1 $tree Tree
2 $print Optional print method
Example:
if (1)
{my $t = Tree::Ops::new 'a';
for(1..2)
{$t->open ('b');
$t->single('c');
$t->close;
}
$t->single ('d');
is_deeply $t->print, <<END; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
a
b
c
b
c
d
END
is_deeply [map {$_->user} $t->select('b')], ['b', 'b'];
}
brackets($tree, $print, $separator)
Bracketed string representation of a tree.
Parameter Description
1 $tree Tree
2 $print Print method
3 $separator Child separator
Example:
is_deeply $a->brackets, 'a(b(c)y(x)y(x)d(efgh(i(j))))'; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a->print(sub{@_}), <<END;
a
b
c
y
x
y
x
d
e
f
g
h
i
j
END
is_deeply $a->firstMost->brackets, 'c'; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
is_deeply $a-> lastMost->brackets, 'j'; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Data Structures
Data structures use by this package.
Tree::Ops Definition
Child in the tree.
Output fields
children - Children of this child.
lastChild - Last active child chain - enables us to find the currently open scope from the start if the tree.
parent - Parent for this child.
user - User data for this child.
Private Methods
activeScope($tree)
Locate the active scope in a tree.
Parameter Description
1 $tree Tree
setParentOfChild($child, $parent)
Set the parent of a child and return the child.
Parameter Description
1 $child Child
2 $parent Parent
indexOfChildInParent($child)
Get the index of a child within the specified parent.
Parameter Description
1 $child Child
Index
1 activeScope - Locate the active scope in a tree.
2 brackets - Bracketed string representation of a tree.
3 by - Traverse a tree in order to process each child with the specified sub and return an array of the results of processing each child.
4 close - Close the current scope returning to the previous scope.
5 context - Get the context of the current child.
6 cut - Cut out a child and all its content and children, return it ready for reinsertion else where.
7 dup - Duplicate a parent and all its descendants.
8 first - Get the first child under the specified parent.
9 firstMost - Return the first most descendant child in the tree starting at this parent or else return undef if this parent has no children.
10 fromLetters - Create a tree from a string of letters - useful for testing.
11 indexOfChildInParent - Get the index of a child within the specified parent.
12 isFirst - Return the specified child if that child is first under its parent, else return undef.
13 isLast - Return the specified child if that child is last under its parent, else return undef.
14 last - Get the last child under the specified parent.
15 lastMost - Return the last most descendant child in the tree starting at this parent or else return undef if this parent has no children.
16 merge - Merge the children of the specified parent with those of the surrounding parents if the user data of those parents smartmatch that of the specified parent.
17 new - Create a new child recording the specified user data.
18 next - Get the next sibling following the specified child.
19 open - Add a child and make it the currently active scope into which new children will be added.
20 prev - Get the previous sibling of the specified child.
21 print - String representation as a horizontal tree.
22 putFirst - Place a new child first under the specified parent and return the child.
23 putLast - Place a new child last under the specified parent and return the child.
24 putNext - Place a new child after the specified child.
25 putPrev - Place a new child before the specified child.
26 select - Select matching children in a tree.
27 setParentOfChild - Set the parent of a child and return the child.
28 single - Add one child in the current scope.
29 singleChildOfParent - Return the only child of this parent if the parent has an only child, else undef
30 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.
31 step - Make the first child of the specified parent the parents previous sibling and return the parent.
32 stepBack - Make the previous sibling of the specified parent the parents first child and return the parent.
33 stepEnd - Make the next sibling of the specified parent the parents last child and return the parent.
34 stepEndBack - Make the last child of the specified parent the parents next sibling and return the parent.
35 unwrap - Unwrap the specified child and return that child.
36 wrap - Wrap the specified child with a new parent and return the new parent.
Installation
This module is written in 100% Pure Perl and, thus, it is easy to read, comprehend, use, modify and install via cpan:
sudo cpan install Tree::Ops
Author
Copyright
Copyright (c) 2016-2019 Philip R Brenan.
This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.