File Coverage

blib/lib/immutable/seq.pm
Criterion Covered Total %
statement 54 62 87.1
branch 4 6 66.6
condition n/a
subroutine 19 27 70.3
pod 0 8 0.0
total 77 103 74.7


line stmt bran cond sub pod time code
1 1     1   8 use strict; use warnings;
  1     1   2  
  1         29  
  1         5  
  1         1  
  1         61  
2             package immutable::seq;
3              
4             sub import {
5 0     0   0 die "Don't 'use immutable::seq' directly";
6             }
7              
8              
9              
10             package immutable::seq::tied;
11 1     1   495 use Tie::Array;
  1         1227  
  1         33  
12 1     1   6 use base 'Tie::StdArray';
  1         14  
  1         359  
13 1     1   766 use immutable::tied;
  1         3  
  1         255  
14              
15              
16             # Prevent tied changes to immutable::seq.
17             # Mutation operations must use method calls which will return a new seq.
18              
19 1     1   570 sub STORE { err 'set a value on', '->set($index, $val)' }
20 1     1   290 sub PUSH { err 'push values onto', '->push($val, ...)' }
21 1     1   5 sub POP { err 'pop a value from', '->pop()' }
22 0     0   0 sub UNSHIFT { err 'unshift values onto', '->unshift($val, ...)' }
23 0     0   0 sub SHIFT { err 'shift a value from', '->shift()' }
24 0     0   0 sub SPLICE { err 'splice values from', '->splice(...)' }
25              
26 0     0   0 sub DELETE { err }
27 0     0   0 sub STORESIZE { err }
28 0     0   0 sub CLEAR { err }
29 0     0   0 sub EXTEND { err }
30              
31              
32              
33             package immutable::seq;
34 1     1   407 use immutable::base;
  1         2  
  1         27  
35 1     1   5 use base 'immutable::base';
  1         3  
  1         468  
36              
37             sub new {
38 7     7 0 38 my ($class, @data) = @_;
39 7 100       22 $class = ref($class) if ref($class);
40 7         29 tie my @array, 'immutable::seq::tied';
41 7         30 push @{tied(@array)}, @data;
  7         20  
42 7         23 bless \@array, $class;
43             }
44              
45             sub get {
46 3     3 0 844 tied(@{$_[0]})->[$_[1]];
  3         18  
47             }
48              
49             sub set {
50 1     1 0 5 my ($self, $index, $value) = @_;
51 1         4 my @data = @$self;
52 1         5 $data[$index] = $value;
53 1         3 $self->new(@data);
54             }
55              
56             sub push {
57 1     1 0 575 my ($self, @data) = @_;
58 1         4 $self->new(@$self, @data);
59             }
60              
61             sub pop {
62 1     1 0 565 my ($self) = @_;
63 1         3 my @data = @$self;
64 1         15 my $val = pop @data;
65 1         3 my $new = $self->new(@data);
66 1 50       4 wantarray ? ($new, $val) : $new;
67             }
68              
69             sub shift {
70 1     1 0 541 my ($self) = @_;
71 1         3 my @data = @$self;
72 1         16 my $val = shift @data;
73 1         3 my $new = $self->new(@data);
74 1 50       6 wantarray ? ($new, $val) : $new;
75             }
76              
77             sub unshift {
78 1     1 0 1060 my ($self, @data) = @_;
79 1         4 $self->new(@data, @$self);
80             }
81              
82             sub size {
83 9     9 0 557 0 + @{$_[0]};
  9         63  
84             }
85              
86             sub DESTROY {
87 7     7   1204 untie(@{$_[0]});
  7         156  
88             }
89              
90             1;