File Coverage

blib/lib/Algorithm/Odometer/Tiny.pm
Criterion Covered Total %
statement 37 37 100.0
branch 16 16 100.0
condition n/a
subroutine 8 8 100.0
pod 0 2 0.0
total 61 63 96.8


line stmt bran cond sub pod time code
1             #!perl
2 1     1   108632 use warnings;
  1         2  
  1         36  
3 1     1   8 use strict;
  1         4  
  1         47  
4              
5             # SEE THE END OF THIS FILE FOR AUTHOR, COPYRIGHT AND LICENSE INFORMATION
6              
7             { package Algorithm::Odometer::Tiny;
8             our $VERSION = "0.04";
9 1     1   6 use Carp;
  1         36  
  1         145  
10             use overload '<>' => sub {
11 1123     1123   4896 my $self = shift;
12 1123 100       2658 return $self->() unless wantarray;
13 1         3 my @all;
14 1         4 while (defined( my $x = $self->() ))
15 6         19 { push @all, $x }
16 1         11 return @all;
17 1     1   1301 };
  1         1114  
  1         11  
18             sub new { ## no critic (RequireArgUnpacking)
19 9     9 0 28448 my $class = shift;
20 9         25 return bless odometer(@_), $class;
21             }
22             sub odometer { ## no critic (RequireArgUnpacking)
23 9 100   9 0 234 croak "no wheels specified" unless @_;
24 8 100       18 my @w = map { [ 1, ref eq 'ARRAY' ? @$_ : $_ ] } @_;
  22         96  
25 8         15 my $done;
26             return sub {
27 1152 100   1152   2952 if ($done) { $done=0; return }
  8         14  
  8         24  
28 1144         1766 my @cur = map {$$_[$$_[0]]} @w;
  3518         5971  
29 1144         2431 for(my $i=$#w;$i>=0;$i--) {
30 1281 100       1838 last if ++$w[$i][0]<@{$w[$i]};
  1281         2429  
31 145         212 $w[$i][0]=1;
32 145 100       320 $done=1 unless $i;
33             }
34 1144 100       2172 return wantarray ? @cur : join '', map {defined()?$_:''} @cur;
  3484 100       8808  
35 8         48 };
36             }
37             }
38              
39             # Possible To-Do for Later: Generate regexes based on the wheels?
40              
41             1;
42             __END__