File Coverage

blib/lib/ArrayDataRole/Source/LinesInDATA.pm
Criterion Covered Total %
statement 46 53 86.7
branch 16 16 100.0
condition n/a
subroutine 10 14 71.4
pod 3 10 30.0
total 75 93 80.6


line stmt bran cond sub pod time code
1             package ArrayDataRole::Source::LinesInDATA;
2              
3 5     5   455184 use strict;
  5         10  
  5         199  
4 5     5   640 use Role::Tiny;
  5         7596  
  5         37  
5 5     5   1769 use Role::Tiny::With;
  5         394  
  5         608  
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 5     5   31 no strict 'refs'; ## no critic: TestingAndDebugging::RequireUseStrict
  5         12  
  5         2901  
15              
16 3     3 0 636054 my $class = shift;
17              
18 3         7 my $fh = \*{"$class\::DATA"};
  3         23  
19 3         8 my $fhpos_data_begin;
20 3 100       6 if (defined ${"$class\::_ArrayData_fhpos_data_begin_cache"}) {
  3         30  
21 1         4 $fhpos_data_begin = ${"$class\::_ArrayData_fhpos_data_begin_cache"};
  1         5  
22 1         11 seek $fh, $fhpos_data_begin, 0;
23             } else {
24 2         9 $fhpos_data_begin = ${"$class\::_ArrayData_fhpos_data_begin_cache"} = tell $fh;
  2         10  
25             }
26              
27 3         32 bless {
28             fh => $fh,
29             fhpos_data_begin => $fhpos_data_begin,
30             pos => 0, # iterator
31             }, $class;
32             }
33              
34             sub get_next_item {
35 23     23 0 134 my $self = shift;
36 23 100       142 die "StopIteration" if eof($self->{fh});
37 22         73 chomp(my $elem = readline($self->{fh}));
38 22         42 $self->{pos}++;
39 22         79 $elem;
40             }
41              
42             sub has_next_item {
43 18     18 0 149 my $self = shift;
44 18         161 !eof($self->{fh});
45             }
46              
47             sub get_iterator_pos {
48 0     0 0 0 my $self = shift;
49 0         0 $self->{pos};
50             }
51              
52             sub reset_iterator {
53 5     5 0 2600 my $self = shift;
54 5         76 seek $self->{fh}, $self->{fhpos_data_begin}, 0;
55 5         15 $self->{pos} = 0;
56             }
57              
58             sub get_item_at_pos {
59 3     3 0 59 my ($self, $pos) = @_;
60 3 100       46 $self->reset_iterator if $self->{pos} > $pos;
61 3         7 while (1) {
62 7 100       18 die "Out of range" unless $self->has_next_item;
63 6         17 my $item = $self->get_next_item;
64 6 100       28 return $item if $self->{pos} > $pos;
65             }
66             }
67              
68             sub has_item_at_pos {
69 3     3 0 12 my ($self, $pos) = @_;
70 3 100       19 return 1 if $self->{pos} > $pos;
71 2         5 while (1) {
72 5 100       12 return 0 unless $self->has_next_item;
73 4         11 $self->get_next_item;
74 4 100       17 return 1 if $self->{pos} > $pos;
75             }
76             }
77              
78             sub fh {
79 0     0 1   my $self = shift;
80 0           $self->{fh};
81             }
82              
83             sub fh_min_offset {
84 0     0 1   my $self = shift;
85 0           $self->{fhpos_data_begin};
86             }
87              
88 0     0 1   sub fh_max_offset { undef }
89              
90             1;
91             # ABSTRACT: Role to access array data from DATA section, one line per element
92              
93             __END__