File Coverage

blib/lib/ArrayDataRole/Source/LinesInFile.pm
Criterion Covered Total %
statement 38 42 90.4
branch 17 18 94.4
condition n/a
subroutine 9 11 81.8
pod 2 8 25.0
total 66 79 83.5


line stmt bran cond sub pod time code
1             package ArrayDataRole::Source::LinesInFile;
2              
3 4     4   337950 use strict;
  4         11  
  4         272  
4 4     4   421 use Role::Tiny;
  4         6113  
  4         36  
5 4     4   1452 use Role::Tiny::With;
  4         226  
  4         4540  
6             with 'ArrayDataRole::Spec::Basic';
7              
8             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
9             our $DATE = '2024-05-06'; # DATE
10             our $DIST = 'ArrayDataRoles-Standard'; # DIST
11             our $VERSION = '0.010'; # VERSION
12              
13             sub new {
14 3     3 1 522446 my ($class, %args) = @_;
15              
16 3         10 my $fh;
17 3 100       26 unless (defined($fh = delete $args{fh})) {
18 2         7 my $filename = delete $args{filename};
19 2 50       9 defined $filename or die "Please specify fh or filename";
20 2         105 open $fh, "<", $filename;
21             }
22              
23             bless {
24 3         46 fh => $fh,
25             pos => 0, # iterator
26             }, $class;
27             }
28              
29             sub get_next_item {
30 23     23 0 1515 my $self = shift;
31 23 100       234 die "StopIteration" if eof($self->{fh});
32 21         73 chomp(my $elem = readline($self->{fh}));
33 21         41 $self->{pos}++;
34 21         121 $elem;
35             }
36              
37             sub has_next_item {
38 16     16 0 31 my $self = shift;
39 16         147 !eof($self->{fh});
40             }
41              
42             sub get_iterator_pos {
43 0     0 0 0 my $self = shift;
44 0         0 $self->{pos};
45             }
46              
47             sub reset_iterator {
48 8     8 0 3170 my $self = shift;
49 8         75 seek $self->{fh}, 0, 0;
50 8         35 $self->{pos} = 0;
51             }
52              
53             sub get_item_at_pos {
54 6     6 0 104 my ($self, $pos) = @_;
55 6 100       32 $self->reset_iterator if $self->{pos} > $pos;
56 6         12 while (1) {
57 10 100       25 die "Out of range" unless $self->has_next_item;
58 8         22 my $item = $self->get_next_item;
59 8 100       37 return $item if $self->{pos} > $pos;
60             }
61             }
62              
63             sub has_item_at_pos {
64 6     6 0 17 my ($self, $pos) = @_;
65 6 100       32 return 1 if $self->{pos} > $pos;
66 4         8 while (1) {
67 6 100       16 return 0 unless $self->has_next_item;
68 4         14 $self->get_next_item;
69 4 100       19 return 1 if $self->{pos} > $pos;
70             }
71             }
72              
73             sub fh {
74 0     0 1   my $self = shift;
75 0           $self->{fh};
76             }
77              
78             1;
79             # ABSTRACT: Role to access array data from a file/filehandle, one line per element
80              
81             __END__