File Coverage

blib/lib/Iterator/Flex/Grep.pm
Criterion Covered Total %
statement 53 54 98.1
branch 8 12 66.6
condition 1 3 33.3
subroutine 13 13 100.0
pod 1 2 50.0
total 76 84 90.4


line stmt bran cond sub pod time code
1             package Iterator::Flex::Grep;
2              
3             # ABSTRACT: Grep Iterator Class
4              
5 5     5   176824 use v5.28;
  5         16  
6 5     5   18 use strict;
  5         6  
  5         83  
7 5     5   14 use warnings;
  5         9  
  5         211  
8 5     5   459 use experimental 'signatures';
  5         1242  
  5         36  
9              
10             our $VERSION = '0.34';
11              
12 5     5   1168 use Iterator::Flex::Factory 'to_iterator';
  5         14  
  5         318  
13 5     5   68 use Iterator::Flex::Utils qw[ THROW STATE EXHAUSTION :IterAttrs :IterStates throw_failure ];
  5         9  
  5         796  
14 5     5   24 use Ref::Util;
  5         8  
  5         165  
15 5     5   20 use parent 'Iterator::Flex::Base';
  5         7  
  5         29  
16              
17 5     5   279 use namespace::clean;
  5         7  
  5         25  
18              
19              
20              
21              
22              
23              
24              
25              
26              
27              
28              
29              
30              
31              
32              
33              
34              
35              
36              
37              
38              
39              
40              
41              
42              
43              
44              
45              
46 8     8 1 9 sub new ( $class, $code, $iterable, $pars = {} ) {
  8         13  
  8         10  
  8         8  
  8         10  
  8         8  
47 8 50       21 throw_failure( parameter => q{'code' parameter is not a coderef} )
48             unless Ref::Util::is_coderef( $code );
49              
50 8         34 $class->SUPER::new( { code => $code, src => $iterable }, $pars );
51             }
52              
53              
54 8     8 0 10 sub construct ( $class, $state ) {
  8         12  
  8         8  
  8         9  
55              
56 8 50       17 throw_failure( parameter => q{'state' parameter must be a HASH reference} )
57             unless Ref::Util::is_hashref( $state );
58              
59 8         9 my ( $code, $src ) = @{$state}{qw[ code src ]};
  8         17  
60              
61 8         30 $src
62             = to_iterator( $src, { ( +EXHAUSTION ) => THROW } );
63              
64 8         16 my $self;
65             my $iterator_state;
66              
67             return {
68             ( +_NAME ) => 'igrep',
69              
70             ( +_SELF ) => \$self,
71              
72             ( +STATE ) => \$iterator_state,
73              
74             ( +NEXT ) => sub {
75 28 50   28   69 return $self->signal_exhaustion
76             if $iterator_state == IterState_EXHAUSTED;
77              
78 28         31 my $rv;
79             eval {
80 28         28 while ( 1 ) {
81 39         119 local $_ = $rv = $src->();
82 31 100       46 return !!1 if $code->();
83             }
84 0         0 !!1;
85 28 100       43 } or do {
86 8 50 33     365 die $@
87             unless Ref::Util::is_blessed_ref( $@ )
88             && $@->isa( 'Iterator::Flex::Failure::Exhausted' );
89 8         20 return $self->signal_exhaustion;
90             };
91 20         83 return $rv;
92             },
93       2     ( +RESET ) => sub { },
94 8         86 ( +_DEPENDS ) => $src,
95             };
96             }
97              
98             __PACKAGE__->_add_roles( qw[
99             State::Closure
100             Next::ClosedSelf
101             Rewind::Closure
102             Reset::Closure
103             Current::Closure
104             ] );
105              
106             1;
107              
108             #
109             # This file is part of Iterator-Flex
110             #
111             # This software is Copyright (c) 2018 by Smithsonian Astrophysical Observatory.
112             #
113             # This is free software, licensed under:
114             #
115             # The GNU General Public License, Version 3, June 2007
116             #
117              
118             __END__