File Coverage

blib/lib/Data/Range/Compare/Stream/Iterator/Consolidate.pm
Criterion Covered Total %
statement 45 45 100.0
branch 11 12 91.6
condition n/a
subroutine 8 8 100.0
pod 1 3 33.3
total 65 68 95.5


line stmt bran cond sub pod time code
1             package Data::Range::Compare::Stream::Iterator::Consolidate;
2              
3 8     8   58721 use strict;
  8         16  
  8         365  
4 8     8   42 use warnings;
  8         27  
  8         472  
5              
6 8     8   45 use base qw(Data::Range::Compare::Stream::Iterator::Base);
  8         14  
  8         1659  
7 8     8   48 use constant RESULT_CLASS=>'Data::Range::Compare::Stream::Iterator::Consolidate::Result';
  8         15  
  8         575  
8 8     8   2430 use Data::Range::Compare::Stream::Iterator::Consolidate::Result;
  8         17  
  8         5654  
9              
10             sub new {
11 140     140 0 776 my ($class,$iterator,%args)=@_;
12 140         666 my $self=$class->SUPER::new(iterator=>$iterator,%args);
13 140         497 return $self;
14             }
15              
16             sub has_next {
17 1637     1637 0 6466 my ($self)=@_;
18 1637 100       5778 return 1 if $self->{iterator}->has_next;
19 1257 100       4811 return 1 if defined($self->{last_range});
20 934         3054 return undef;
21             }
22              
23              
24             sub get_next {
25 251     251 1 5111 my ($self)=@_;
26              
27 251 100       705 unless(defined($self->{last_range})) {
28 99 100       388 return undef unless $self->{iterator}->has_next;
29 96         390 $self->{last_range}=$self->{iterator}->get_next;
30             }
31              
32 248         502 my $start_range=$self->{last_range};
33 248 50       520 return undef unless defined($start_range);
34              
35 248         363 my $overlapping_range=$start_range;
36 248         307 my $end_range=$start_range;
37 248         325 my $did_overlap=0;
38              
39 248         825 while($self->{iterator}->has_next) {
40 182         647 my $next_range=$self->{iterator}->get_next;
41 182 100       2937 if($overlapping_range->get_common->overlap($next_range->get_common)) {
42              
43 30         38 $did_overlap=1;
44 30         122 my $new_range=$overlapping_range->get_overlapping_range([$overlapping_range->get_common,$next_range->get_common]);
45 30         109 $self->on_consolidate($new_range->get_common,$overlapping_range->get_common,$next_range->get_common);
46 30         107 $overlapping_range=$new_range->get_common;
47              
48              
49 30         88 ($start_range,$end_range)=$overlapping_range->get_common->find_smallest_outer_ranges([$start_range->get_common,$end_range->get_common,$next_range->get_common]);
50             } else {
51 152         283 $self->{last_range}=$next_range;
52 152         1790 my ($start,$end)=$start_range->get_common->find_smallest_outer_ranges([$start_range->get_common,$end_range->get_common]);
53 152         768 return $self->RESULT_CLASS->new($overlapping_range->get_common,$start->get_common,$end->get_common,0,$did_overlap);
54             }
55              
56            
57             }
58 96         243 $self->{last_range}=undef;
59 96         383 my ($start,$end)=$start_range->get_common->find_smallest_outer_ranges([$start_range->get_common,$end_range->get_common]);
60 96         630 return $self->RESULT_CLASS->new($overlapping_range->get_common,$start->get_common,$end->get_common,0,$did_overlap);
61             }
62              
63             1;
64