| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package App::dategrep::Iterator; | 
| 2 | 8 |  |  | 8 |  | 3025 | use strict; | 
|  | 8 |  |  |  |  | 9 |  | 
|  | 8 |  |  |  |  | 183 |  | 
| 3 | 8 |  |  | 8 |  | 24 | use warnings; | 
|  | 8 |  |  |  |  | 7 |  | 
|  | 8 |  |  |  |  | 139 |  | 
| 4 | 8 |  |  | 8 |  | 25 | use Moo; | 
|  | 8 |  |  |  |  | 9 |  | 
|  | 8 |  |  |  |  | 30 |  | 
| 5 | 8 |  |  | 8 |  | 1385 | use App::dategrep::Date qw(date_to_epoch); | 
|  | 8 |  |  |  |  | 14 |  | 
|  | 8 |  |  |  |  | 2352 |  | 
| 6 |  |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | has 'multiline' => ( is => 'ro', default => sub { 0 } ); | 
| 8 |  |  |  |  |  |  | has 'start'  => ( is => 'rw', required => 1 ); | 
| 9 |  |  |  |  |  |  | has 'end'    => ( is => 'rw', required => 1 ); | 
| 10 |  |  |  |  |  |  | has 'format' => ( is => 'rw', required => 1 ); | 
| 11 |  |  |  |  |  |  | has 'fh'     => ( is => 'lazy' ); | 
| 12 |  |  |  |  |  |  | has 'skip_unparsable' => ( is => 'ro', default => sub { 0 } ); | 
| 13 |  |  |  |  |  |  |  | 
| 14 |  |  |  |  |  |  | has 'next_line' => ( | 
| 15 |  |  |  |  |  |  | is      => 'rw', | 
| 16 |  |  |  |  |  |  | clearer => 1, | 
| 17 |  |  |  |  |  |  | ); | 
| 18 |  |  |  |  |  |  |  | 
| 19 |  |  |  |  |  |  | has 'next_entry' => ( | 
| 20 |  |  |  |  |  |  | is      => 'rw', | 
| 21 |  |  |  |  |  |  | clearer => 1, | 
| 22 |  |  |  |  |  |  | ); | 
| 23 |  |  |  |  |  |  |  | 
| 24 |  |  |  |  |  |  | sub peek_line { | 
| 25 | 15 |  |  | 15 | 0 | 12 | my $self = shift; | 
| 26 | 15 | 50 |  |  |  | 38 | if ( not defined $self->next_line ) { | 
| 27 | 15 |  |  |  |  | 221 | $self->next_line( $self->fh->getline ); | 
| 28 |  |  |  |  |  |  | } | 
| 29 | 15 |  |  |  |  | 312 | return $self->next_line; | 
| 30 |  |  |  |  |  |  | } | 
| 31 |  |  |  |  |  |  |  | 
| 32 |  |  |  |  |  |  | sub peek_entry { | 
| 33 | 20 |  |  | 20 | 0 | 15 | my $self = shift; | 
| 34 | 20 | 100 |  |  |  | 50 | if ( not defined $self->next_entry ) { | 
| 35 | 11 |  |  |  |  | 28 | $self->next_entry( $self->get_entry_unbuffered ); | 
| 36 |  |  |  |  |  |  | } | 
| 37 | 20 |  |  |  |  | 41 | return $self->next_entry; | 
| 38 |  |  |  |  |  |  | } | 
| 39 |  |  |  |  |  |  |  | 
| 40 |  |  |  |  |  |  | sub next_line_has_date { | 
| 41 | 15 |  |  | 15 | 0 | 132 | my $self = shift; | 
| 42 | 15 |  |  |  |  | 24 | my ($epoch) = $self->to_epoch( $self->peek_line ); | 
| 43 | 15 |  |  |  |  | 917 | return defined $epoch; | 
| 44 |  |  |  |  |  |  | } | 
| 45 |  |  |  |  |  |  |  | 
| 46 |  |  |  |  |  |  | sub to_epoch { | 
| 47 | 195 |  |  | 195 | 0 | 221 | my ( $self, $line ) = @_; | 
| 48 | 195 |  |  |  |  | 577 | return date_to_epoch( $line, $self->format ); | 
| 49 |  |  |  |  |  |  | } | 
| 50 |  |  |  |  |  |  |  | 
| 51 |  |  |  |  |  |  | sub get_entry { | 
| 52 | 105 |  |  | 105 | 0 | 101 | my $self       = shift; | 
| 53 | 105 |  |  |  |  | 174 | my $next_entry = $self->next_entry(); | 
| 54 | 105 | 100 |  |  |  | 174 | if ( defined $next_entry ) { | 
| 55 | 8 |  |  |  |  | 137 | $self->clear_next_entry(); | 
| 56 | 8 |  |  |  |  | 848 | return $next_entry; | 
| 57 |  |  |  |  |  |  | } | 
| 58 | 97 |  |  |  |  | 202 | return $self->get_entry_unbuffered; | 
| 59 |  |  |  |  |  |  | } | 
| 60 |  |  |  |  |  |  |  | 
| 61 |  |  |  |  |  |  | sub getline { | 
| 62 | 130 |  |  | 130 | 0 | 109 | my $self      = shift; | 
| 63 | 130 |  |  |  |  | 169 | my $next_line = $self->next_line(); | 
| 64 | 130 | 100 |  |  |  | 190 | if ( defined $next_line ) { | 
| 65 | 15 |  |  |  |  | 281 | $self->clear_next_line(); | 
| 66 | 15 |  |  |  |  | 496 | return $next_line; | 
| 67 |  |  |  |  |  |  | } | 
| 68 | 115 |  |  |  |  | 1903 | return $self->fh->getline; | 
| 69 |  |  |  |  |  |  | } | 
| 70 |  |  |  |  |  |  |  | 
| 71 |  |  |  |  |  |  | 1; |