File Coverage

blib/lib/Statistics/Swoop.pm
Criterion Covered Total %
statement 42 42 100.0
branch 11 12 91.6
condition n/a
subroutine 10 10 100.0
pod 5 5 100.0
total 68 69 98.5


line stmt bran cond sub pod time code
1             package Statistics::Swoop;
2 4     4   80652 use strict;
  4         9  
  4         110  
3 4     4   17 use warnings;
  4         9  
  4         122  
4 4     4   20 use Carp qw/croak/;
  4         9  
  4         374  
5             use Class::Accessor::Lite (
6 4         27 rw => [qw/list/],
7             ro => [qw/count max min range sum avg/],
8 4     4   2998 );
  4         4349  
9              
10             our $VERSION = '0.03';
11              
12             sub new {
13 9     9 1 11190 my ($class, $list) = @_;
14              
15 9 100       198 croak "first arg is required as array ref" unless ref($list) eq 'ARRAY';
16              
17             my $self = bless +{
18             list => $list,
19 8         13 count => scalar @{$list},
  8         29  
20             } => $class;
21              
22 8 100       34 $self->_calc if $self->count;
23 8         29 return $self;
24             }
25              
26             sub _calc {
27 7     7   56 my $self = shift;
28              
29 7         12 my $sum;
30 7         20 my $max = $self->list->[0];
31 7         40 my $min = $self->list->[0];
32 7         25 my $range;
33             my $avg;
34              
35 7         10 for my $i (@{$self->list}) {
  7         15  
36 24         47 $sum += $i;
37 24 100       60 if ($max < $i) {
    100          
38 15         23 $max = $i;
39             }
40             elsif ($min > $i) {
41 2         5 $min = $i;
42             }
43             }
44              
45 7 100       21 if ($self->count == 1) {
    50          
46 2         16 $self->{range} = $max;
47 2         5 $self->{avg} = $max;
48             }
49             elsif ($self->count > 1) {
50 5         63 $self->{range} = $max - $min;
51 5         13 $self->{avg} = $sum / $self->count;
52             }
53 7         34 $self->{sum} = $sum;
54 7         13 $self->{max} = $max;
55 7         17 $self->{min} = $min;
56             }
57              
58 4     4 1 22 sub maximum { $_[0]->max }
59 4     4 1 3693 sub minimum { $_[0]->min }
60 4     4 1 5310 sub average { $_[0]->avg }
61              
62             sub result {
63 1     1 1 10 my $self = shift;
64              
65             return +{
66 1         3 count => $self->count,
67             max => $self->max,
68             min => $self->min,
69             range => $self->range,
70             sum => $self->sum,
71             avg => $self->avg,
72             };
73             }
74              
75             1;
76              
77             __END__