File Coverage

blib/lib/Data/Range/Compare/Stream/Iterator/Compare/LayerCake.pm
Criterion Covered Total %
statement 58 60 96.6
branch 25 28 89.2
condition 4 6 66.6
subroutine 7 7 100.0
pod 1 4 25.0
total 95 105 90.4


line stmt bran cond sub pod time code
1             package Data::Range::Compare::Stream::Iterator::Compare::LayerCake;
2              
3              
4 1     1   1250 use strict;
  1         2  
  1         41  
5 1     1   6 use warnings;
  1         2  
  1         31  
6              
7 1     1   5 use base qw(Data::Range::Compare::Stream::Iterator::Compare::Asc);
  1         2  
  1         760  
8              
9             sub new {
10 18     18 0 8506 my ($class,%args)=@_;
11 18         73 %args=(ignore_empty=>0,,%args);
12 18         117 my $self=$class->SUPER::new(%args);
13              
14 18         71 return $self;
15             }
16              
17             sub get_next {
18 94     94 1 64485 my ($self)=@_;
19              
20 94 100       362 if(defined($self->{filter})) {
21 2         4 my $result=$self->{next_result};
22 2         6 delete $self->{next_result};
23 2         6 return $result;
24             }
25              
26 92 100       235 if($self->{ignore_full}) {
27 4         9 my $result=$self->{next_result};
28 4         10 delete $self->{next_result};
29 4         12 return $result;
30             }
31              
32 88 100 66     881 return $self->SUPER::get_next unless $self->{ignore_empty} or $self->{empty_only};
33              
34              
35              
36 12         58 my $result=$self->SUPER::get_next;
37              
38 12   66     50 while($result->is_empty and $self->has_next) {
39 2         9 $result=$self->SUPER::get_next;
40             }
41              
42 12         40 return $result;
43              
44             }
45              
46             sub prepare {
47 44     44 0 75 my ($self)=@_;
48              
49 44 100       136 return if $self->prepared;
50              
51 17         93 $self->SUPER::prepare;
52 17 100       59 if(defined($self->{filter})) {
53 1         2 my $filter=$self->{filter};
54              
55              
56 1         5 while($self->SUPER::has_next) {
57 1         4 my $result=$self->SUPER::get_next;
58 1 50       5 if($filter->($result)) {
59 1         3 $self->{next_result}=$result;
60 1         2 return 1;
61             }
62             }
63 0         0 delete $self->{next_result};
64 0         0 return 0;
65              
66             }
67              
68             }
69              
70             sub has_next {
71 43     43 0 18459 my ($self)=@_;
72              
73 43         120 $self->prepare;
74            
75 43 100       182 if(defined($self->{filter})) {
    100          
76 3         5 my $filter=$self->{filter};
77              
78 3 100       12 return 1 if defined($self->{next_result});
79              
80              
81 2         11 while($self->SUPER::has_next) {
82 4         15 my $result=$self->SUPER::get_next;
83 4 100       14 if($filter->($result)) {
84 1         3 $self->{next_result}=$result;
85 1         6 return 1;
86             }
87             }
88 1         4 delete $self->{next_result};
89 1         7 return 0;
90              
91             } elsif($self->{ignore_full}) {
92 6 50       20 return 1 if defined($self->{next_result});
93              
94 6 100       24 return 0 unless $self->SUPER::has_next;
95              
96 5         20 my $result=$self->SUPER::get_next;
97 5         21 while($result->is_full) {
98              
99 4 100       15 return 0 unless $self->SUPER::has_next;
100 3         9 $result=$self->SUPER::get_next;
101              
102             }
103              
104 4         1433 $self->{next_result}=$result;
105 4 50       375 return defined($result) ? 1 : 0;
106              
107             } else {
108            
109             # back off and use the parrent class internals
110 34         152 return $self->SUPER::has_next;
111             }
112              
113              
114             }
115              
116             1;