File Coverage

lib/Keyword/TreeFold.pm
Criterion Covered Total %
statement 23 23 100.0
branch 2 4 50.0
condition 2 4 50.0
subroutine 8 8 100.0
pod 0 3 0.0
total 35 42 83.3


line stmt bran cond sub pod time code
1             ########################################################################
2             # housekeeping
3             ########################################################################
4              
5             package Keyword::TreeFold v0.1.1;
6 3     3   42780 use v5.20;
  3         8  
7              
8 3     3   1799 use Keyword::Declare;
  3         358218  
  3         14  
9              
10             ########################################################################
11             # package variables
12             ########################################################################
13             ########################################################################
14             # utility subs
15             ########################################################################
16              
17             sub simple_code
18             {
19 2     2 0 117840 my $list_op = shift;
20 2         4 my $size = @_;
21              
22 2         8 qq|\@_ = \ndo $list_op;\n|
23             }
24              
25             sub lexical_code
26             {
27 2     2 0 63581 my ( $list_op, @varz ) = @_;
28              
29 2         4 my $count = @varz;
30 2         4 my $offset = $count - 1;
31 2         5 my $lexical = join ',' => @varz;
32              
33             qq
34 2         20 |
35             my \$last
36             = \@_ % $count
37             ? int( \@_ / $count )
38             : int( \@_ / $count ) - 1
39             ;
40              
41             \@_
42             = map
43             {
44             my ( $lexical ) = \@_[ \$_ .. \$_ + $offset ];
45              
46             do
47             ######
48             $list_op
49             ######
50             }
51             map
52             {
53             \$_ * $count
54             }
55             ( 0 .. \$last );
56             |
57              
58             }
59              
60             sub boilerplate
61             {
62 4     4 0 7 my ( $name, $guts ) = @_;
63              
64             <<"SUBDEF"
65             sub $name
66             {
67             use Carp qw( croak );
68              
69             \@_ > 1 or return \$_[0];
70              
71             my \$size = \@_;
72              
73             $guts
74              
75             croak "Stack not shrinking: \$size elements."
76             unless \@_ < \$size;
77              
78             goto __SUB__
79             }
80             SUBDEF
81 4         11 }
82              
83             ########################################################################
84             # delcare keywords
85             ########################################################################
86              
87             sub import
88 3     3   20 {
89 3 50 50 3   91098 keyword tree_fold( Ident $name, List $argz, Block $list_op )
  3         36  
  3         12  
90             {
91             my @varz
92             = map
93             {
94             $_->isa( 'PPI::Token::Symbol' )
95             ? $_->{ content }
96             : ()
97             }
98             map
99             {
100             $_->isa( 'PPI::Statement::Expression' )
101             ? @{ $_->{ children } }
102             : ()
103             }
104             @{ $argz->{ children } };
105              
106             if( @varz > 1 )
107             {
108             boilerplate $name, lexical_code "$list_op", @varz
109             }
110             elsif( @varz )
111             {
112             die
113             "Bogus tree_fold: '$name' with single variable '$varz[0]'.";
114             }
115             else
116             {
117             boilerplate $name, simple_code "$list_op"
118             }
119             }
120 3         104  
121 3 50 50 3   23465 keyword tree_fold( Ident $name, Block $list_op )
  3         27  
  3         8  
122             {
123             boilerplate $name, simple_code "$list_op";
124             }
125             }
126              
127             1
128             __END__