File Coverage

blib/lib/Math/Basic.pm
Criterion Covered Total %
statement 51 51 100.0
branch 6 8 75.0
condition 4 6 66.6
subroutine 10 10 100.0
pod 6 6 100.0
total 77 81 95.0


line stmt bran cond sub pod time code
1             package Math::Basic;
2              
3 2     2   324680 use 5.006;
  2         9  
4 2     2   14 use strict;
  2         15  
  2         71  
5 2     2   14 use warnings;
  2         3  
  2         200  
6             our $VERSION = '1.01';
7              
8 2     2   24 use base qw/Import::Export/;
  2         7  
  2         1289  
9              
10             our %EX = (
11             sum => [qw/all/],
12             min => [qw/all/],
13             max => [qw/all/],
14             mean => [qw/all/],
15             median => [qw/all/],
16             mode => [qw/all/],
17             );
18              
19             sub sum (&@) {
20 2     2 1 248253 my ($cb, @params) = @_;
21 2         6 my $sum = 0;
22 2         5 for (@params) {
23 9         31 $sum += $cb->($_);
24             }
25 2         10 return $sum;
26             }
27              
28             sub min (&@) {
29 2     2 1 1730 my ($cb, @params) = @_;
30 2         5 my $min;
31 2         6 for (@params) {
32 9         20 my $val = $cb->($_);
33 9 100 66     58 $min = $val if (! defined $min || $val < $min);
34             }
35 2         8 return $min;
36             }
37              
38             sub max (&@) {
39 2     2 1 1774 my ($cb, @params) = @_;
40 2         5 my $max;
41 2         6 for (@params) {
42 9         21 my $val = $cb->($_);
43 9 50 66     52 $max = $val if (! defined $max || $val > $max);
44             }
45 2         6 return $max;
46             }
47              
48             sub mean (&@) {
49 2     2 1 2189 my ($cb, @params) = @_;
50 2         5 my $sum;
51 2         6 for (@params) {
52 9         33 $sum += $cb->($_);
53             }
54 2         11 return $sum / scalar @params;
55             }
56              
57             sub median (&@) {
58 2     2 1 1759 my ($cb, @params) = @_;
59 2         5 my @median;
60 2         4 for (@params) {
61 9         33 push @median, $cb->($_);
62             }
63 2         15 @median = sort @median;
64 2         9 my $m = int(scalar @median / 2);
65 2 50       9 $m++ if ($m % 2 != 0);
66 2         10 return $median[$m];
67             }
68              
69             sub mode (&@) {
70 2     2 1 1729 my ($cb, @params) = @_;
71 2         13 my %map;
72 2         6 for (@params) {
73 9         40 $map{$cb->($_)}++;
74             }
75 2         9 my ($mode, $max) = ('', 0);
76 2         8 for my $k ( keys %map ) {
77 7 100       19 if ($map{$k} > $max) {
78 3         6 $mode = $k;
79 3         7 $max = $map{$k};
80             }
81             }
82 2         11 return $mode;
83             }
84              
85             1;
86              
87             __END__