Commit | Line | Data |
5f654d8e |
1 | package Moose::Autobox::Array; |
2 | use Moose::Role 'with'; |
252ab1a2 |
3 | use autobox; |
5f654d8e |
4 | |
5 | our $VERSION = '0.01'; |
6 | |
e6bb88b0 |
7 | with 'Moose::Autobox::Ref', |
8 | 'Moose::Autobox::List'; |
6cf5bcf2 |
9 | |
10 | ## Array Interface |
11 | |
12 | sub pop { |
13 | my ($array) = @_; |
14 | CORE::pop @$array; |
15 | } |
16 | |
17 | sub push { |
18 | my ($array, @rest) = @_; |
19 | CORE::push @$array, @rest; |
20 | $array; |
21 | } |
22 | |
23 | sub unshift { |
24 | my ($array, @rest) = @_; |
25 | CORE::unshift @$array, @rest; |
26 | $array; |
27 | } |
5f654d8e |
28 | |
6cf5bcf2 |
29 | sub delete { |
30 | my ($array, $index) = @_; |
31 | CORE::delete $array->[$index]; |
32 | } |
33 | |
34 | sub shift { |
35 | my ($array) = @_; |
36 | CORE::shift @$array; |
37 | } |
38 | |
39 | # NOTE: |
40 | # sprintf args need to be reversed, |
41 | # because the invocant is the array |
42 | sub sprintf { CORE::sprintf $_[1], @{$_[0]} } |
43 | |
44 | ## ::List interface implementation |
45 | |
46 | sub head { $_[0]->[0] } |
47 | sub tail { [ @{$_[0]}[ 1 .. $#{$_[0]} ] ] } |
e6bb88b0 |
48 | |
5f654d8e |
49 | sub length { |
50 | my ($array) = @_; |
51 | CORE::scalar @$array; |
52 | } |
53 | |
54 | sub grep { |
55 | my ($array, $sub) = @_; |
56 | [ CORE::grep { $sub->($_) } @$array ]; |
57 | } |
58 | |
59 | sub map { |
60 | my ($array, $sub) = @_; |
61 | [ CORE::map { $sub->($_) } @$array ]; |
62 | } |
63 | |
64 | sub join { |
feffe00c |
65 | my ($array, $sep) = @_; |
66 | $sep ||= ''; |
5f654d8e |
67 | CORE::join $sep, @$array; |
68 | } |
69 | |
70 | sub reverse { |
71 | my ($array) = @_; |
e6bb88b0 |
72 | [ CORE::reverse @$array ]; |
5f654d8e |
73 | } |
74 | |
75 | sub sort { |
76 | my ($array, $sub) = @_; |
77 | $sub ||= sub { $a cmp $b }; |
78 | [ CORE::sort { $sub->($a, $b) } @$array ]; |
5dc78481 |
79 | } |
80 | |
6cf5bcf2 |
81 | # ::Value requirement |
5dc78481 |
82 | |
6cf5bcf2 |
83 | sub print { CORE::print @{$_[0]} } |
5dc78481 |
84 | |
6cf5bcf2 |
85 | ## ::Indexed implementation |
5dc78481 |
86 | |
6cf5bcf2 |
87 | sub exists { |
88 | my ($array, $index) = @_; |
89 | CORE::exists $array->[$index]; |
90 | } |
5dc78481 |
91 | |
92 | sub keys { |
93 | my ($array) = @_; |
94 | [ 0 .. $#{$array} ]; |
95 | } |
96 | |
97 | sub values { |
98 | my ($array) = @_; |
99 | [ @$array ]; |
100 | } |
101 | |
102 | sub kv { |
103 | my ($array) = @_; |
feffe00c |
104 | $array->keys->map(sub { [ $_, $array->[$_] ] }); |
5dc78481 |
105 | } |
e6bb88b0 |
106 | |
5f654d8e |
107 | 1; |