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   30852 use strict;
  18         42  
  18         464  
4 18     18   76 use warnings;
  18         31  
  18         432  
5              
6 18     18   77 use base 'Mojo::Base';
  18         41  
  18         8251  
7              
8             __PACKAGE__->attr('elements');
9              
10             sub new {
11 129     129 1 3654 my $self = shift->SUPER::new(@_);
12              
13 129         979 $self->rewind;
14              
15 129         562 return $self;
16             }
17              
18 260     260 0 1095 sub rewind { shift->{index} = 0 }
19              
20             sub reverse {
21 2     2 0 5 my $self = shift;
22              
23 2         4 $self->{elements} = [reverse @{$self->{elements}}];
  2         5  
24              
25 2         10 return $self;
26             }
27              
28 272 100   272 0 12513 sub size { scalar @{shift->{elements} || []} }
  272         1426  
29              
30 14     14 0 65 sub first { shift->{elements}->[0] }
31 19     19 0 75 sub last { shift->{elements}->[-1] }
32              
33             sub current {
34 3     3 0 6 my $self = shift;
35              
36 3         6 my $index = $self->{index};
37 3 100       9 $index-- if $index;
38              
39 3         10 return $self->{elements}->[$index];
40             }
41              
42             sub take_next {
43 9     9 0 43 my $self = shift;
44              
45 9 100       22 return unless $self->has_next;
46              
47 2         7 return $self->{elements}->[$self->{index}];
48             }
49              
50             sub take_prev {
51 9     9 0 20 my $self = shift;
52              
53 9 100       36 return if $self->{index} < 2;
54              
55 2         7 return $self->{elements}->[$self->{index} - 2];
56             }
57              
58             sub has_next {
59 223     223 0 338 my $self = shift;
60              
61 223 100       484 return $self->{index} < $self->size ? 1 : 0;
62             }
63              
64             sub has_prev {
65 28     28 0 43 my $self = shift;
66              
67 28 100       140 return $self->{index} > 0 ? 1 : 0;
68             }
69              
70             sub next {
71 232     232 0 19643 my $self = shift;
72 232         354 my $length = shift;
73              
74 232 100       556 if (!$length) {
75 214 100       457 return unless $self->has_next;
76              
77 138         521 return $self->{elements}->[$self->{index}++];
78             }
79              
80 18         30 my @elements;
81 18         63 while (my $element = $self->next) {
82 24         45 push @elements, $element;
83              
84 24 100       73 last if --$length <= 0;
85             }
86              
87 18         62 return $self->new(elements => [@elements]);
88             }
89              
90             sub prev {
91 38     38 0 87 my $self = shift;
92 38         57 my $length = shift;
93              
94 38 100       96 if (!$length) {
95 28 100       73 return unless $self->has_prev;
96              
97 8         23 return $self->{elements}->[--$self->{index}];
98             }
99              
100 10 100       37 return $self->new(elements => []) if $self->{index} == 0;
101              
102 7         15 $self->{index}--;
103              
104 7         12 my @elements;
105 7         22 while (my $element = $self->prev) {
106 7         14 push @elements, $element;
107              
108 7 100       19 last if --$length <= 0;
109             }
110              
111 7         25 return $self->new(elements => [@elements]);
112             }
113              
114             1;