File Coverage

blib/lib/Data/Enumerator/Deeply.pm
Criterion Covered Total %
statement 15 57 26.3
branch 0 2 0.0
condition 0 3 0.0
subroutine 5 21 23.8
pod 0 2 0.0
total 20 85 23.5


line stmt bran cond sub pod time code
1             package Data::Enumerator::Deeply;
2 2     2   6 use strict;
  2         2  
  2         41  
3 2     2   6 use warnings;
  2         2  
  2         41  
4 2     2   6 use Data::Enumerator::Base;
  2         1  
  2         33  
5 2     2   765 use Data::Visitor::Lite;
  2         12096  
  2         320  
6             {
7             package Data::Enumerator::Deeply::_Swap;
8             sub new {
9 0     0     my ( $class,$id ) = @_;
10 0           return bless \$id , $class;
11             }
12             sub value {
13 0     0     my ( $self,$value ) = @_;
14 0           return $value->[$self->id];
15             }
16             sub id{
17 0     0     my ( $self ) = @_;
18 0           $$self;
19             }
20             }
21             {
22             package Data::Enumerator::Deeply::_Fixed;
23 2     2   10 use base qw/Data::Enumerator::Deeply::_Swap/;
  2         2  
  2         1892  
24             sub new {
25 0     0     my ( $class,$generator ) = @_;
26 0           return bless { generator => $generator } , $class;
27             }
28             sub _generator{
29 0     0     shift->{generator};
30             }
31             sub value {
32 0     0     my $value = shift->_iterator->();
33 0 0         return if Data::Enumerator::Base->is_last($value);
34 0           return $value;
35             }
36             sub _iterator {
37 0     0     my ($self ) = @_;
38 0   0       return $self->{_iterator} ||= $self->_generator->iterator;
39             }
40             }
41             sub independ {
42 0     0 0   return Data::Enumerator::Deeply::_Fixed->new($_[0]);
43             }
44              
45             sub __swapper {
46 0     0     my ( $id ) = @_;
47 0           return Data::Enumerator::Deeply::_Swap->new($id);
48             }
49              
50             sub __product_all {
51 0     0     my ( @generators ) = @_;
52 0           my $result = shift @generators;
53 0           while( my $gen = shift @generators ) {
54 0           $result = $result->product($gen);
55             }
56 0           return $result;
57             }
58              
59             sub compose {
60 0     0 0   my ( $class, $struct ) = @_;
61 0           my ( $template, $object ) = __get_template_and_generator($struct);
62             return $object->select(sub{
63 0     0     my $value = shift;
64 0           __convert_by_template( $template,$value );
65 0           });
66             }
67              
68             sub __get_template_and_generator{
69 0     0     my ( $struct ) = @_;
70 0           my @generators;
71 0           my $count = 0;
72             my $v = Data::Visitor::Lite->new(
73             ['-instance' => 'Data::Enumerator::Base'=> sub {
74 0     0     my ($obj) = @_;
75 0           push @generators,$obj;
76 0           return __swapper( $count++);
77 0           }]
78             );
79 0           my $template = $v->visit( $struct );
80 0           my $producted = __product_all(@generators);
81 0           return ($template,$producted);
82             }
83              
84             sub __convert_by_template {
85 0     0     my ( $template, $value ) = @_;
86             my $v = Data::Visitor::Lite->new(
87             [ -instance => 'Data::Enumerator::Deeply::_Swap' => sub {
88 0     0     my ($obj ) = @_;
89 0           return $obj->value($value);
90             }
91 0           ]
92             );
93 0           return $v->visit($template);
94             }
95              
96             1;