File Coverage

blib/lib/Data/Enumerator/Base.pm
Criterion Covered Total %
statement 15 73 20.5
branch 0 14 0.0
condition 0 6 0.0
subroutine 5 26 19.2
pod 0 17 0.0
total 20 136 14.7


line stmt bran cond sub pod time code
1             package Data::Enumerator::Base;
2 3     3   11 use strict;
  3         3  
  3         62  
3 3     3   8 use warnings;
  3         3  
  3         96  
4 3     3   9 use Scalar::Util qw/blessed/;
  3         3  
  3         238  
5 3     3   10 use constant LAST => bless {},'Data::Enumerator::Base::LAST';
  3         4  
  3         239  
6 3     3   13 use constant NEXT => bless {},'Data::Enumerator::Base::NEXT';
  3         3  
  3         1834  
7              
8             sub new {
9 0     0 0   my ( $class,$object) = @_;
10 0           return bless {
11             object => $object,
12             },$class;
13             }
14              
15             sub object {
16             shift->{object}
17 0     0 0   }
18              
19             sub is_last {
20 0   0 0 0   return (ref $_[1] and ref $_[1] eq 'Data::Enumerator::Base::LAST');
21             }
22             sub is_next {
23 0   0 0 0   return (ref $_[1] and ref $_[1] eq 'Data::Enumerator::Base::NEXT');
24             }
25              
26             sub iterator {
27 0     0 0   my ( $self ) = @_;
28 0           my $count = 0;
29             return sub{
30 0 0   0     return LAST if ($count >= scalar( @{$self->object}));
  0            
31 0           $self->object->[$count++];
32 0           };
33             }
34              
35             sub each {
36 0     0 0   my ( $self,$f) = @_;
37 0           my $iter = $self->iterator;
38 0           while(1){
39 0           my $result = $iter->();
40 0 0         last if( $self->is_last( $result ));
41 0           my $value = $f->( $result );
42 0 0         last if( $self->is_last( $value ));
43             }
44             }
45              
46             sub select {
47 0     0 0   my ( $self,$mapper ) = @_;
48 0           require Data::Enumerator::Mapper;
49 0           return Data::Enumerator::Mapper->new([$self,$mapper]);
50             }
51              
52             sub where {
53 0     0 0   my ( $self,$predicate ) = @_;
54 0           require Data::Enumerator::Where;
55 0           return Data::Enumerator::Where->new([$self,$predicate]);
56             }
57              
58             sub take {
59 0     0 0   my ( $self,$num ) = @_;
60 0           return $self->limit(0,$num);
61             }
62              
63             sub take_while {
64 0     0 0   my ( $self, $predicate ) = @_;
65 0           my $flag = 1;
66             return $self->where(
67             sub {
68 0 0   0     return $self->LAST unless $flag;
69 0           my $result = $predicate->(@_);
70 0 0         $flag = 0 unless $result;
71 0           return $result;
72             }
73 0           );
74             }
75              
76             sub skip_while {
77 0     0 0   my ( $self, $predicate ) = @_;
78 0           my $flag = 1;
79             return $self->where(
80             sub {
81 0 0   0     return 1 unless $flag;
82 0           my $result = not $predicate->(@_);
83 0 0         $flag = 0 if $result;
84 0           return $result;
85             }
86 0           );
87             }
88             sub repeat {
89 0     0 0   my ($self) = @_;
90 0           require Data::Enumerator::Repeat;
91 0           return Data::Enumerator::Repeat->new($self);
92             }
93              
94             sub to_array {
95 0     0 0   return [ shift->list ];
96             }
97              
98             sub limit {
99 0     0 0   my ( $self,$offset,$limit ) = @_;
100 0           require Data::Enumerator::Limit;
101 0           return Data::Enumerator::Limit->new([$self,$offset,$limit]);
102             }
103              
104             sub add {
105 0     0 0   my ( $self ,$generator ) = @_;
106 0           require Data::Enumerator::Add;
107 0           return Data::Enumerator::Add->new([$self,$generator]);
108             }
109              
110             sub product {
111 0     0 0   my ( $self,$generator) = @_;
112 0           require Data::Enumerator::Product;
113 0           return Data::Enumerator::Product->new([$self,$generator]);
114             }
115              
116             sub list {
117 0     0 0   my ( $self ) = @_;
118 0           my @list;
119             $self->each(sub{
120 0     0     push @list ,shift;
121 0           });
122 0           return @list;
123             }
124              
125             1;