File Coverage

blib/lib/Acme/Globule/Range.pm
Criterion Covered Total %
statement 32 32 100.0
branch 14 14 100.0
condition n/a
subroutine 7 7 100.0
pod 1 1 100.0
total 54 54 100.0


line stmt bran cond sub pod time code
1             package Acme::Globule::Range;
2             BEGIN {
3 4     4   2446 $Acme::Globule::Range::DIST = 'Acme-Globule';
4             }
5             BEGIN {
6 4     4   72 $Acme::Globule::Range::VERSION = '0.004';
7             }
8             # ABSTRACT: Alternative range operator
9 4     4   4051 use Regexp::Common;
  4         38914  
  4         21  
10 4     4   359730 use warnings;
  4         12  
  4         98  
11 4     4   23 use strict;
  4         17  
  4         1563  
12              
13             my $num = $RE{num}{int};
14              
15             sub _range {
16 25     25   55 my($first, $last, $step) = @_;
17             #warn "$first..$last (step $step)\n";
18 25         31 my @range;
19 25 100       64 if ($step > 0) {
    100          
20 15         55 while ($first <= $last) {
21 58         99 push @range, $first;
22 58         14454 $first += $step;
23             }
24             } elsif ($step < 0) {
25 9         25 while ($first >= $last) {
26 36         41 push @range, $first;
27 36         70 $first += $step;
28             }
29             } else {
30 1         6 return [ $first ];
31             }
32 24         120 return \@range;
33             }
34              
35             sub globule {
36 27     27 1 38 my($self, $pattern) = @_;
37 27         42 local $_ = $pattern;
38 27 100       194 if (/^($num)\.\.($num)$/) {
    100          
    100          
39 5 100       1299 if ($1 < $2) {
    100          
40 2         7 return _range($1, $2, 1);
41             } elsif ($1 > $2) {
42 2         5 return _range($1, $2, -1);
43             } else {
44 1         4 return [ $1 ];
45             }
46             } elsif (/^($num),($num)\.\.($num)$/) {
47 14         4807 return _range($1, $3, $2-$1);
48             } elsif (/^($num)\.\.($num),($num)$/) {
49 7         3825 return _range($1, $3, $3-$2);
50             } else {
51 1         677 return;
52             }
53             }
54              
55              
56             1;
57              
58             __END__