File Coverage

blib/lib/Math/Prime/Util/PrimeIterator.pm
Criterion Covered Total %
statement 67 72 93.0
branch 9 10 90.0
condition 2 3 66.6
subroutine 26 28 92.8
pod 21 21 100.0
total 125 134 93.2


line stmt bran cond sub pod time code
1             package Math::Prime::Util::PrimeIterator;
2 1     1   9 use strict;
  1         3  
  1         50  
3 1     1   6 use warnings;
  1         3  
  1         134  
4              
5             BEGIN {
6 1     1   4 $Math::Prime::Util::PrimeIterator::AUTHORITY = 'cpan:DANAJ';
7 1         32 $Math::Prime::Util::PrimeIterator::VERSION = '0.74';
8             }
9              
10 1     1   8 use base qw( Exporter );
  1         2  
  1         209  
11             our @EXPORT_OK = qw( );
12             our %EXPORT_TAGS = (all => [ @EXPORT_OK ]);
13              
14              
15 1     1   8 use Math::Prime::Util qw/next_prime prev_prime is_prime prime_count nth_prime/;
  1         2  
  1         16  
16              
17             # We're going to use a scalar rather than a hash because there is currently
18             # only one data object (the current value) and this makes it little faster.
19              
20             sub new {
21 11     11 1 32 my ($class, $start) = @_;
22 11         18 my $p = 2;
23 11         28 my $self = bless \$p, $class;
24 11 100       52 $self->rewind($start) if defined $start;
25 8         25 return $self;
26             }
27              
28             # To make Iterator::Simple happy.
29             sub __iter__ {
30 0     0   0 my $self = shift;
31 0         0 require Iterator::Simple;
32 0     0   0 return Iterator::Simple::iterator(sub { $self->iterate });
  0         0  
33 0         0 $self;
34             }
35              
36 11     11 1 39 sub value { ${$_[0]}; }
  11         69  
37             sub next {
38             #my $self = shift; $$self = next_prime($$self); return $self;
39 114     114 1 378 ${$_[0]} = next_prime(${$_[0]});
  114         189  
  114         377  
40 114         227 return $_[0];
41             }
42             sub prev {
43 3     3 1 1027 my $self = shift;
44 3         7 my $p = $$self;
45 3 50       22 $$self = ($p <= 2) ? 2 : prev_prime($p);
46 3         13 return $self;
47             }
48             sub iterate {
49             #my $self = shift; my $p = $$self; $$self = next_prime($p); return $p;
50 32     32 1 125 my $p = ${$_[0]};
  32         58  
51 32         52 ${$_[0]} = next_prime(${$_[0]});
  32         113  
  32         83  
52 32         122 return $p;
53             }
54              
55             sub rewind {
56 17     17 1 3594 my ($self, $start) = @_;
57 17         41 $$self = 2;
58 17 100 66     100 if (defined $start && $start ne '2') {
59 15         108 Math::Prime::Util::_validate_integer_nonneg($start);
60 12 100       191 $$self = next_prime($start-1) if $start > 2;
61             }
62 14         48 return $self;
63             }
64              
65             sub peek {
66 1     1 1 4 return next_prime(${$_[0]});
  1         10  
67             }
68              
69             # Some methods to match Math::NumSeq
70             sub tell_i {
71 1     1 1 8 return prime_count(${$_[0]});
  1         38  
72             }
73             sub pred {
74 1     1 1 4 my($self, $n) = @_;
75 1         12 return is_prime($n);
76             }
77             sub ith {
78 1     1 1 4 my($self, $n) = @_;
79 1         22 return nth_prime($n);
80             }
81             sub seek_to_i {
82 1     1 1 4 my($self, $n) = @_;
83 1         57 $self->rewind( nth_prime($n) );
84             }
85             sub seek_to_value {
86 1     1 1 3 my($self, $n) = @_;
87 1         4 $self->rewind($n);
88             }
89             sub value_to_i {
90 2     2 1 7 my($self, $n) = @_;
91 2 100       17 return unless is_prime($n);
92 1         11 return prime_count($n);
93             }
94             sub value_to_i_ceil {
95 1     1 1 4 my($self, $n) = @_;
96 1         16 return prime_count(next_prime($n-1));
97             }
98             sub value_to_i_floor {
99 1     1 1 4 my($self, $n) = @_;
100 1         12 return prime_count($n);
101             }
102             sub value_to_i_estimate {
103 1     1 1 5 my($self, $n) = @_;
104 1         125 return Math::Prime::Util::prime_count_approx($n);
105             }
106 1     1 1 6 sub i_start { 1 }
107 1     1 1 13 sub description { "The prime numbers 2, 3, 5, 7, 11, 13, 17, etc." }
108 1     1 1 6 sub values_min { 2 }
109 1     1 1 6 sub values_max { undef }
110 1     1 1 6 sub oeis_anum { "A000040" }
111             1;
112              
113             __END__