File Coverage

blib/lib/Directory/Scanner/StreamBuilder/Transformer.pm
Criterion Covered Total %
statement 43 45 95.5
branch 6 10 60.0
condition 2 5 40.0
subroutine 15 16 93.7
pod 1 7 14.2
total 67 83 80.7


line stmt bran cond sub pod time code
1             package Directory::Scanner::StreamBuilder::Transformer;
2             # ABSTRACT: Fmap a streaming directory iterator
3              
4 8     8   42 use strict;
  8         13  
  8         179  
5 8     8   31 use warnings;
  8         15  
  8         155  
6              
7 8     8   33 use Carp ();
  8         15  
  8         100  
8 8     8   29 use Scalar::Util ();
  8         16  
  8         103  
9              
10 8     8   30 use UNIVERSAL::Object;
  8         14  
  8         139  
11 8     8   33 use Directory::Scanner::API::Stream;
  8         17  
  8         364  
12              
13             our $VERSION = '0.01';
14             our $AUTHORITY = 'cpan:STEVAN';
15              
16 8   50 8   38 use constant DEBUG => $ENV{DIR_SCANNER_STREAM_TRANSFORMER_DEBUG} // 0;
  8         12  
  8         595  
17              
18             ## ...
19              
20 8     8   509 our @ISA; BEGIN { @ISA = ('UNIVERSAL::Object', 'Directory::Scanner::API::Stream') }
21             our %HAS; BEGIN {
22             %HAS = (
23             stream => sub {},
24             transformer => sub {},
25             # internal state ...
26             _head => sub {},
27             )
28 8     8   2276 }
29              
30             ## ...
31              
32             sub BUILD {
33 2     2 1 54 my $self = $_[0];
34 2         5 my $stream = $self->{stream};
35 2         3 my $f = $self->{transformer};
36              
37 2 50 33     17 (Scalar::Util::blessed($stream) && $stream->DOES('Directory::Scanner::API::Stream'))
38             || Carp::confess 'You must supply a directory stream';
39              
40 2 50       5 (defined $f)
41             || Carp::confess 'You must supply a `transformer` value';
42              
43 2 50       7 (ref $f eq 'CODE')
44             || Carp::confess 'The `transformer` value supplied must be a CODE reference';
45             }
46              
47             sub clone {
48 0     0 0 0 my ($self, $dir) = @_;
49             return $self->new(
50             stream => $self->{stream}->clone( $dir ),
51             transformer => $self->{transformer}
52 0         0 );
53             }
54              
55             ## delegate
56              
57 9     9 0 938 sub head { $_[0]->{_head} }
58 4     4 0 3207 sub is_done { $_[0]->{stream}->is_done }
59 6     6 0 845 sub is_closed { $_[0]->{stream}->is_closed }
60 2     2 0 198 sub close { $_[0]->{stream}->close }
61              
62             sub next {
63 12     12 0 2928 my $self = $_[0];
64              
65             # skip out early if possible
66 12 50       43 return if $self->{stream}->is_done;
67              
68 12         26 $self->_log('... calling next on underlying stream') if DEBUG;
69 12         36 my $next = $self->{stream}->next;
70              
71             # this means the stream is likely exhausted
72 12 100       25 unless ( defined $next ) {
73 2         3 $self->{_head} = undef;
74 2         6 return;
75             }
76              
77 10         15 $self->_log('got value from stream'.$next.', transforming it now') if DEBUG;
78              
79             # return the result of the Fmap
80 10         14 local $_ = $next;
81 10         23 return $self->{_head} = $self->{transformer}->( $next );
82             }
83              
84             1;
85              
86             __END__