File Coverage

blib/lib/Iterator/Flex/Map.pm
Criterion Covered Total %
statement 57 57 100.0
branch 6 10 60.0
condition 1 3 33.3
subroutine 14 14 100.0
pod 1 2 50.0
total 79 86 91.8


line stmt bran cond sub pod time code
1             package Iterator::Flex::Map;
2              
3             # ABSTRACT: Map Iterator Class
4              
5 5     5   170346 use v5.28;
  5         15  
6 5     5   19 use strict;
  5         8  
  5         95  
7 5     5   15 use warnings;
  5         6  
  5         192  
8 5     5   416 use experimental 'signatures';
  5         1136  
  5         23  
9              
10             our $VERSION = '0.34';
11              
12 5     5   1035 use Iterator::Flex::Utils qw( STATE THROW EXHAUSTION :IterAttrs :IterStates throw_failure );
  5         12  
  5         829  
13 5     5   486 use Iterator::Flex::Factory 'to_iterator';
  5         59  
  5         209  
14 5     5   19 use Ref::Util;
  5         9  
  5         179  
15 5     5   19 use parent 'Iterator::Flex::Base';
  5         6  
  5         35  
16              
17 5     5   334 use namespace::clean;
  5         7  
  5         22  
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              
47              
48 10     10 1 12 sub new ( $class, $code, $iterable, $pars = {} ) {
  10         15  
  10         11  
  10         13  
  10         13  
  10         13  
49 10 50       22 throw_failure( parameter => q{'code' parameter is not a coderef} )
50             unless Ref::Util::is_coderef( $code );
51              
52 10         39 $class->SUPER::new( { code => $code, src => $iterable }, $pars );
53             }
54              
55 10     10 0 12 sub construct ( $class, $state ) {
  10         12  
  10         12  
  10         10  
56              
57 10 50       20 throw_failure( parameter => q{'state' parameter must be a HASH reference} )
58             unless Ref::Util::is_hashref( $state );
59              
60 10         12 my ( $code, $src ) = @{$state}{qw[ code src ]};
  10         20  
61              
62 10         37 $src
63             = to_iterator( $src, { ( +EXHAUSTION ) => THROW } );
64              
65 10         30 my @values;
66             my $self;
67 10         0 my $iterator_state;
68              
69             return {
70             ( +_NAME ) => 'imap',
71              
72             ( +_SELF ) => \$self,
73              
74             ( +STATE ) => \$iterator_state,
75              
76             ( +NEXT ) => sub {
77 109 50   109   138 return $self->signal_exhaustion if $iterator_state == IterState_EXHAUSTED;
78              
79 109         137 while ( !@values ) {
80             eval {
81 71         173 my $value = $src->();
82 58         94 local $_ = $value;
83 58         89 @values = $code->();
84 58         229 1;
85 71 100       98 } or do {
86 13 50 33     643 die $@
87             unless Ref::Util::is_blessed_ref( $@ )
88             && $@->isa( 'Iterator::Flex::Failure::Exhausted' );
89 13         34 return $self->signal_exhaustion;
90             };
91             }
92 96         137 return shift @values;
93             },
94              
95 2     2   4 ( +RESET ) => sub { @values = () },
96 1     1   3 ( +REWIND ) => sub { @values = () },
97 10         109 ( +_DEPENDS ) => $src,
98             };
99             }
100              
101              
102             __PACKAGE__->_add_roles( qw[
103             State::Closure
104             Next::ClosedSelf
105             Reset::Closure
106             Rewind::Closure
107             ] );
108              
109             1;
110              
111             #
112             # This file is part of Iterator-Flex
113             #
114             # This software is Copyright (c) 2018 by Smithsonian Astrophysical Observatory.
115             #
116             # This is free software, licensed under:
117             #
118             # The GNU General Public License, Version 3, June 2007
119             #
120              
121             __END__