File Coverage

blib/lib/Bootylicious/Iterator.pm
Criterion Covered Total %
statement 57 57 100.0
branch 26 26 100.0
condition n/a
subroutine 16 16 100.0
pod 1 13 7.6
total 100 112 89.2


line stmt bran cond sub pod time code
1             package Bootylicious::Iterator;
2              
3 18     18   31008 use strict;
  18         48  
  18         443  
4 18     18   58 use warnings;
  18         20  
  18         367  
5              
6 18     18   63 use base 'Mojo::Base';
  18         25  
  18         8617  
7              
8             __PACKAGE__->attr('elements');
9              
10             sub new {
11 129     129 1 3499 my $self = shift->SUPER::new(@_);
12              
13 129         670 $self->rewind;
14              
15 129         408 return $self;
16             }
17              
18 260     260 0 1073 sub rewind { shift->{index} = 0 }
19              
20             sub reverse {
21 2     2 0 3 my $self = shift;
22              
23 2         3 $self->{elements} = [reverse @{$self->{elements}}];
  2         6  
24              
25 2         8 return $self;
26             }
27              
28 272 100   272 0 11682 sub size { scalar @{shift->{elements} || []} }
  272         1219  
29              
30 14     14 0 60 sub first { shift->{elements}->[0] }
31 19     19 0 54 sub last { shift->{elements}->[-1] }
32              
33             sub current {
34 3     3 0 3 my $self = shift;
35              
36 3         3 my $index = $self->{index};
37 3 100       7 $index-- if $index;
38              
39 3         8 return $self->{elements}->[$index];
40             }
41              
42             sub take_next {
43 9     9 0 11 my $self = shift;
44              
45 9 100       15 return unless $self->has_next;
46              
47 2         5 return $self->{elements}->[$self->{index}];
48             }
49              
50             sub take_prev {
51 9     9 0 14 my $self = shift;
52              
53 9 100       26 return if $self->{index} < 2;
54              
55 2         5 return $self->{elements}->[$self->{index} - 2];
56             }
57              
58             sub has_next {
59 223     223 0 170 my $self = shift;
60              
61 223 100       342 return $self->{index} < $self->size ? 1 : 0;
62             }
63              
64             sub has_prev {
65 28     28 0 36 my $self = shift;
66              
67 28 100       99 return $self->{index} > 0 ? 1 : 0;
68             }
69              
70             sub next {
71 232     232 0 14924 my $self = shift;
72 232         208 my $length = shift;
73              
74 232 100       356 if (!$length) {
75 214 100       293 return unless $self->has_next;
76              
77 138         427 return $self->{elements}->[$self->{index}++];
78             }
79              
80 18         19 my @elements;
81 18         35 while (my $element = $self->next) {
82 24         20 push @elements, $element;
83              
84 24 100       46 last if --$length <= 0;
85             }
86              
87 18         38 return $self->new(elements => [@elements]);
88             }
89              
90             sub prev {
91 38     38 0 46 my $self = shift;
92 38         37 my $length = shift;
93              
94 38 100       61 if (!$length) {
95 28 100       50 return unless $self->has_prev;
96              
97 8         17 return $self->{elements}->[--$self->{index}];
98             }
99              
100 10 100       23 return $self->new(elements => []) if $self->{index} == 0;
101              
102 7         8 $self->{index}--;
103              
104 7         8 my @elements;
105 7         15 while (my $element = $self->prev) {
106 7         7 push @elements, $element;
107              
108 7 100       14 last if --$length <= 0;
109             }
110              
111 7         18 return $self->new(elements => [@elements]);
112             }
113              
114             1;