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'; |
5f654d8e |
9 | |
e6bb88b0 |
10 | ## List interface |
11 | |
5f654d8e |
12 | sub length { |
13 | my ($array) = @_; |
14 | CORE::scalar @$array; |
15 | } |
16 | |
17 | sub grep { |
18 | my ($array, $sub) = @_; |
19 | [ CORE::grep { $sub->($_) } @$array ]; |
20 | } |
21 | |
22 | sub map { |
23 | my ($array, $sub) = @_; |
24 | [ CORE::map { $sub->($_) } @$array ]; |
25 | } |
26 | |
27 | sub join { |
feffe00c |
28 | my ($array, $sep) = @_; |
29 | $sep ||= ''; |
5f654d8e |
30 | CORE::join $sep, @$array; |
31 | } |
32 | |
33 | sub reverse { |
34 | my ($array) = @_; |
e6bb88b0 |
35 | [ CORE::reverse @$array ]; |
5f654d8e |
36 | } |
37 | |
38 | sub sort { |
39 | my ($array, $sub) = @_; |
40 | $sub ||= sub { $a cmp $b }; |
41 | [ CORE::sort { $sub->($a, $b) } @$array ]; |
5dc78481 |
42 | } |
43 | |
44 | # ... |
45 | |
46 | sub reduce { |
47 | my ($array, $func) = @_; |
252ab1a2 |
48 | my $a = $array->values; |
49 | my $acc = $a->shift; |
50 | $a->map(sub { $acc = $func->($acc, $_) }); |
5dc78481 |
51 | return $acc; |
52 | } |
53 | |
54 | sub zip { |
55 | my ($array, $other) = @_; |
252ab1a2 |
56 | ($array->length < $other->length |
57 | ? $other |
58 | : $array) |
59 | ->keys |
60 | ->map(sub { |
61 | [ $array->[$_], $other->[$_] ] |
62 | }); |
63 | } |
5dc78481 |
64 | |
65 | ## |
66 | |
67 | sub keys { |
68 | my ($array) = @_; |
69 | [ 0 .. $#{$array} ]; |
70 | } |
71 | |
72 | sub values { |
73 | my ($array) = @_; |
74 | [ @$array ]; |
75 | } |
76 | |
77 | sub kv { |
78 | my ($array) = @_; |
feffe00c |
79 | $array->keys->map(sub { [ $_, $array->[$_] ] }); |
5dc78481 |
80 | } |
e6bb88b0 |
81 | |
82 | ## Array Interface |
5f654d8e |
83 | |
84 | sub pop { |
85 | my ($array) = @_; |
e6bb88b0 |
86 | CORE::pop @$array; |
5f654d8e |
87 | } |
88 | |
89 | sub push { |
90 | my ($array, @rest) = @_; |
91 | CORE::push @$array, @rest; |
92 | $array; |
93 | } |
94 | |
95 | sub unshift { |
96 | my ($array, @rest) = @_; |
e6bb88b0 |
97 | CORE::unshift @$array, @rest; |
5f654d8e |
98 | $array; |
99 | } |
100 | sub exists { |
101 | my ($array, $index) = @_; |
102 | CORE::exists $array->[$index]; |
103 | } |
104 | |
105 | sub delete { |
106 | my ($array, $index) = @_; |
107 | CORE::delete $array->[$index]; |
108 | } |
109 | |
110 | sub shift { |
111 | my ($array) = @_; |
112 | CORE::shift @$array; |
113 | } |
114 | |
115 | 1; |