File Coverage

blib/lib/Moose/Autobox/Array.pm
Criterion Covered Total %
statement 110 117 94.0
branch 6 6 100.0
condition 7 7 100.0
subroutine 44 47 93.6
pod 35 35 100.0
total 202 212 95.2


line stmt bran cond sub pod time code
1             package Moose::Autobox::Array;
2             # ABSTRACT: the Array role
3 14     14   55 use Moose::Role 'with';
  14         16  
  14         90  
4 14     14   42054 use Moose::Autobox;
  14         22  
  14         93  
5 14     14   14515 use List::MoreUtils 0.07 ();
  14         114826  
  14         345  
6              
7 14     14   6675 use Syntax::Keyword::Junction::All ();
  14         24608  
  14         229  
8 14     14   5655 use Syntax::Keyword::Junction::Any ();
  14         12395  
  14         222  
9 14     14   5789 use Syntax::Keyword::Junction::None ();
  14         12744  
  14         249  
10 14     14   5766 use Syntax::Keyword::Junction::One ();
  14         15008  
  14         271  
11 14     14   80 use namespace::autoclean;
  14         18  
  14         140  
12              
13             our $VERSION = '0.16';
14              
15             with 'Moose::Autobox::Ref',
16             'Moose::Autobox::List',
17             'Moose::Autobox::Indexed';
18              
19             ## Array Interface
20              
21             sub pop {
22 1     1 1 2 my ($array) = @_;
23 1         3 CORE::pop @$array;
24             }
25              
26             sub push {
27 3     3 1 868 my ($array, @rest) = @_;
28 3         6 CORE::push @$array, @rest;
29 3         14 $array;
30             }
31              
32             sub unshift {
33 2     2 1 5 my ($array, @rest) = @_;
34 2         4 CORE::unshift @$array, @rest;
35 2         7 $array;
36             }
37              
38             sub delete {
39 1     1 1 3 my ($array, $index) = @_;
40 1         3 CORE::delete $array->[$index];
41             }
42              
43             sub shift {
44 1     1 1 2 my ($array) = @_;
45 1         3 CORE::shift @$array;
46             }
47              
48             sub slice {
49 1     1 1 2 my ($array, $indicies) = @_;
50 1         1 [ @{$array}[ @{$indicies} ] ];
  1         5  
  1         2  
51             }
52              
53             # NOTE:
54             # sprintf args need to be reversed,
55             # because the invocant is the array
56 2     2 1 3 sub sprintf { CORE::sprintf $_[1], @{$_[0]} }
  2         86  
57              
58             ## ::List interface implementation
59              
60 1     1 1 3 sub head { $_[0]->[0] }
61 1     1 1 1 sub tail { [ @{$_[0]}[ 1 .. $#{$_[0]} ] ] }
  1         5  
  1         3  
62              
63             sub length {
64 7     7 1 409 my ($array) = @_;
65 7         26 CORE::scalar @$array;
66             }
67              
68             sub grep {
69 1     1 1 3 my ($array, $sub) = @_;
70 1         2 [ CORE::grep { $sub->($_) } @$array ];
  7         14  
71             }
72              
73             sub map {
74 13     13 1 13697 my ($array, $sub) = @_;
75 13         23 [ CORE::map { $sub->($_) } @$array ];
  87         155  
76             }
77              
78             sub join {
79 3     3 1 837 my ($array, $sep) = @_;
80 3   100     14 $sep ||= '';
81 3         14 CORE::join $sep, @$array;
82             }
83              
84             sub reverse {
85 2     2 1 397 my ($array) = @_;
86 2         9 [ CORE::reverse @$array ];
87             }
88              
89             sub sort {
90 4     4 1 7 my ($array, $sub) = @_;
91 4   100 6   18 $sub ||= sub { $a cmp $b };
  6         19  
92 4         14 [ CORE::sort { $sub->($a, $b) } @$array ];
  43         56  
93             }
94              
95             sub first {
96 1     1 1 4 $_[0]->[0];
97             }
98              
99             sub last {
100 1     1 1 2 $_[0]->[$#{$_[0]}];
  1         4  
101             }
102              
103             ## ::Indexed implementation
104              
105             sub at {
106 32     32 1 21 my ($array, $index) = @_;
107 32         76 $array->[$index];
108             }
109              
110             sub put {
111 1     1 1 2 my ($array, $index, $value) = @_;
112 1         3 $array->[$index] = $value;
113             }
114              
115             sub exists {
116 2     2 1 3 my ($array, $index) = @_;
117 2         6 CORE::exists $array->[$index];
118             }
119              
120             sub keys {
121 6     6 1 8 my ($array) = @_;
122 6         8 [ 0 .. $#{$array} ];
  6         65  
123             }
124              
125             sub values {
126 2     2 1 3 my ($array) = @_;
127 2         9 [ @$array ];
128             }
129              
130             sub kv {
131 1     1 1 2 my ($array) = @_;
132 1     13   3 $array->keys->map(sub { [ $_, $array->[$_] ] });
  13         27  
133             }
134              
135             sub each {
136 0     0 1 0 my ($array, $sub) = @_;
137 0         0 for my $i (0 .. $#$array) {
138 0         0 $sub->($i, $array->[ $i ]);
139             }
140             }
141              
142             sub each_key {
143 2     2 1 1707 my ($array, $sub) = @_;
144 2         11 $sub->($_) for (0 .. $#$array);
145             }
146              
147             sub each_value {
148 2     2 1 1244 my ($array, $sub) = @_;
149 2         9 $sub->($_) for @$array;
150             }
151              
152             sub each_n_values {
153 2     2 1 707 my ($array, $n, $sub) = @_;
154 2         23 my $it = List::MoreUtils::natatime($n, @$array);
155              
156 2         15 while (my @vals = $it->()) {
157 26         93 $sub->(@vals);
158             }
159              
160 2         15 return;
161             }
162              
163             # end indexed
164              
165             sub flatten {
166 1     1 1 104 @{$_[0]}
  1         9  
167             }
168              
169             sub _flatten_deep {
170 22     22   30 my @array = @_;
171 22         18 my $depth = CORE::pop @array;
172 22 100       33 --$depth if (defined($depth));
173              
174             CORE::map {
175 22 100 100     37 (ref eq 'ARRAY')
  54 100       171  
176             ? (defined($depth) && $depth == -1) ? $_ : _flatten_deep( @$_, $depth )
177             : $_
178             } @array;
179              
180             }
181              
182             sub flatten_deep {
183 5     5 1 11 my ($array, $depth) = @_;
184 5         9 [ _flatten_deep(@$array, $depth) ];
185             }
186              
187             ## Junctions
188              
189             sub all {
190 1     1 1 494 my ($array) = @_;
191 1         9 return Syntax::Keyword::Junction::All->new(@$array);
192             }
193              
194             sub any {
195 1     1 1 463 my ($array) = @_;
196 1         19 return Syntax::Keyword::Junction::Any->new(@$array);
197             }
198              
199             sub none {
200 1     1 1 478 my ($array) = @_;
201 1         10 return Syntax::Keyword::Junction::None->new(@$array);
202             }
203              
204             sub one {
205 1     1 1 482 my ($array) = @_;
206 1         10 return Syntax::Keyword::Junction::One->new(@$array);
207             }
208              
209             ## Print
210              
211 0     0 1   sub print { CORE::print @{$_[0]} }
  0            
212 0     0 1   sub say { CORE::print @{$_[0]}, "\n" }
  0            
213              
214 14     14   17223 no Moose::Role;
  14         26  
  14         128  
215              
216             1;
217              
218             __END__
219              
220             =pod
221              
222             =encoding UTF-8
223              
224             =head1 NAME
225              
226             Moose::Autobox::Array - the Array role
227              
228             =head1 VERSION
229              
230             version 0.16
231              
232             =head1 SYNOPSIS
233              
234             use Moose::Autobox;
235              
236             [ 1..5 ]->isa('ARRAY'); # true
237             [ a..z ]->does('Moose::Autobox::Array'); # true
238             [ 0..2 ]->does('Moose::Autobox::List'); # true
239              
240             print "Squares: " . [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', ');
241              
242             print [ 1, 'number' ]->sprintf('%d is the loneliest %s');
243              
244             print ([ 1 .. 5 ]->any == 3) ? 'true' : 'false'; # prints 'true'
245              
246             =head1 DESCRIPTION
247              
248             This is a role to describe operations on the Array type.
249              
250             =head1 METHODS
251              
252             =over 4
253              
254             =item C<pop>
255              
256             =item C<push ($value)>
257              
258             =item C<shift>
259              
260             =item C<unshift ($value)>
261              
262             =item C<delete ($index)>
263              
264             =item C<sprintf ($format_string)>
265              
266             =item C<slice (@indices)>
267              
268             =item C<flatten>
269              
270             =item C<flatten_deep ($depth)>
271              
272             =item C<first>
273              
274             =item C<last>
275              
276             =back
277              
278             =head2 Indexed implementation
279              
280             =over 4
281              
282             =item C<at ($index)>
283              
284             =item C<put ($index, $value)>
285              
286             =item C<exists ($index)>
287              
288             =item C<keys>
289              
290             =item C<values>
291              
292             =item C<kv>
293              
294             =item C<each>
295              
296             =item C<each_key>
297              
298             =item C<each_value>
299              
300             =item C<each_n_values ($n, $callback)>
301              
302             =back
303              
304             =head2 List implementation
305              
306             =over 4
307              
308             =item C<head>
309              
310             =item C<tail>
311              
312             =item C<join (?$seperator)>
313              
314             =item C<length>
315              
316             =item C<map (\&block)>
317              
318             =item C<grep (\&block)>
319              
320             Note that, in both the above, $_ is in scope within the code block, as well as
321             being passed as $_[0]. As per CORE::map and CORE::grep, $_ is an alias to
322             the list value, so can be used to modify the list, viz:
323              
324             use Moose::Autobox;
325              
326             my $foo = [1, 2, 3];
327             $foo->map( sub {$_++} );
328             print $foo->dump;
329              
330             yields
331              
332             $VAR1 = [
333             2,
334             3,
335             4
336             ];
337              
338             =item C<reverse>
339              
340             =item C<sort (?\&block)>
341              
342             =back
343              
344             =head2 Junctions
345              
346             =over 4
347              
348             =item C<all>
349              
350             =item C<any>
351              
352             =item C<none>
353              
354             =item C<one>
355              
356             =back
357              
358             =over 4
359              
360             =item C<meta>
361              
362             =item C<print>
363              
364             =item C<say>
365              
366             =back
367              
368             =head1 SUPPORT
369              
370             Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=Moose-Autobox>
371             (or L<bug-Moose-Autobox@rt.cpan.org|mailto:bug-Moose-Autobox@rt.cpan.org>).
372              
373             There is also a mailing list available for users of this distribution, at
374             L<http://lists.perl.org/list/moose.html>.
375              
376             There is also an irc channel available for users of this distribution, at
377             L<C<#moose> on C<irc.perl.org>|irc://irc.perl.org/#moose>.
378              
379             =head1 AUTHOR
380              
381             Stevan Little <stevan.little@iinteractive.com>
382              
383             =head1 COPYRIGHT AND LICENSE
384              
385             This software is copyright (c) 2006 by Infinity Interactive, Inc.
386              
387             This is free software; you can redistribute it and/or modify it under
388             the same terms as the Perl 5 programming language system itself.
389              
390             =cut