File Coverage

blib/lib/Language/P/Toy/Value/Array.pm
Criterion Covered Total %
statement 58 72 80.5
branch 5 10 50.0
condition 5 7 71.4
subroutine 17 23 73.9
pod 1 13 7.6
total 86 125 68.8


line stmt bran cond sub pod time code
1             package Language::P::Toy::Value::Array;
2              
3 100     100   575 use strict;
  100         224  
  100         3755  
4 100     100   532 use warnings;
  100         195  
  100         2732  
5 100     100   529 use base qw(Language::P::Toy::Value::Any);
  100         212  
  100         81671  
6              
7             __PACKAGE__->mk_ro_accessors( qw(array) );
8              
9 0     0 0 0 sub type { 2 }
10              
11             sub new {
12 11143     11143 1 15381 my( $class, $args ) = @_;
13 11143         33341 my $self = $class->SUPER::new( $args );
14              
15 11143   100     134325 $self->{array} ||= [];
16              
17 11143         24440 return $self;
18             }
19              
20             sub clone {
21 2650     2650 0 3389 my( $self, $level ) = @_;
22              
23 2650         3887 my $clone = ref( $self )->new( { array => [ @{$self->{array}} ],
  2650         19265  
24             } );
25              
26 2650 50       8440 if( $level > 0 ) {
27 2650         2701 foreach my $entry ( @{$clone->{array}} ) {
  2650         5101  
28 2656         8485 $entry = $entry->clone( $level - 1 );
29             }
30             }
31              
32 2650         36577 return $clone;
33             }
34              
35             sub localize {
36 0     0 0 0 my( $self ) = @_;
37              
38 0         0 return __PACKAGE__->new;
39             }
40              
41             sub assign {
42 4     4 0 9 my( $self, $other ) = @_;
43              
44             # FIXME multiple dispatch
45 4 50       51 if( $other->isa( 'Language::P::Toy::Value::Scalar' ) ) {
46 0         0 $self->{array} = [ $other->clone( 1 ) ];
47             } else {
48             # FIXME optimize: don't do it unless necessary
49 4         23 my $oiter = $other->clone( 1 )->iterator;
50 4         51 $self->assign_iterator( $oiter );
51             }
52             }
53              
54             sub assign_iterator {
55 4     4 0 7 my( $self, $iter ) = @_;
56              
57 4         17 $self->{array} = [];
58 4         13 while( $iter->next ) {
59 6         8 push @{$self->{array}}, $iter->item;
  6         19  
60             }
61             }
62              
63             sub push {
64 0     0 0 0 my( $self, @values ) = @_;
65              
66 0         0 push @{$self->{array}}, @values;
  0         0  
67              
68 0         0 return;
69             }
70              
71             sub iterator {
72 5304     5304 0 6947 my( $self ) = @_;
73              
74 5304         13105 return Language::P::Toy::Value::Array::Iterator->new( $self );
75             }
76              
77             sub iterator_from {
78 111     111 0 282 my( $self, $index ) = @_;
79              
80 111         411 return Language::P::Toy::Value::Array::Iterator->new( $self, $index );
81             }
82              
83             sub get_item {
84 8733     8733 0 11291 my( $self, $index ) = @_;
85              
86 0         0 Carp::confess "Array index out of range ($index > $#{$self->{array}})"
  8733         32511  
87 8733 50 33     18937 if $index < 0 || $index > $#{$self->{array}};
88              
89 8733         31325 return $self->{array}->[$index];
90             }
91              
92             sub get_count {
93 13858     13858 0 17115 my( $self ) = @_;
94              
95 13858         14220 return scalar @{$self->{array}};
  13858         57936  
96             }
97              
98             sub as_scalar {
99 0     0 0 0 my( $self ) = @_;
100              
101 0         0 return Language::P::Toy::Value::StringNumber->new( { integer => $self->get_count } );
102             }
103              
104             sub as_boolean_int {
105 0     0 0 0 my( $self ) = @_;
106              
107 0 0       0 return $self->get_count ? 1 : 0;
108             }
109              
110             package Language::P::Toy::Value::Array::Iterator;
111              
112 100     100   636 use strict;
  100         330  
  100         3777  
113 100     100   596 use warnings;
  100         250  
  100         3303  
114 100     100   570 use base qw(Language::P::Toy::Value::Any);
  100         215  
  100         26707  
115              
116             __PACKAGE__->mk_ro_accessors( qw(array index) );
117              
118 0     0   0 sub type { 3 }
119              
120             sub new {
121 5415     5415   19326 my( $class, $array, $index ) = @_;
122 5415   100     37807 my $self = $class->SUPER::new( { array => $array,
123             index => ( $index || 0 ) - 1,
124             } );
125             }
126              
127             sub next {
128 8201     8201   39730 my( $self ) = @_;
129 8201 100       18488 return 0 if $self->{index} >= $self->{array}->get_count - 1;
130              
131 5433         7650 ++$self->{index};
132              
133 5433         15492 return 1;
134             }
135              
136             sub item {
137 5433     5433   6825 my( $self ) = @_;
138              
139 5433         12245 return $self->{array}->get_item( $self->{index} );
140             }
141              
142             1;