The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

package Math::Basic;
use 5.006;
use strict;
our $VERSION = '1.00';
our %EX = (
sum => [qw/all/],
min => [qw/all/],
max => [qw/all/],
mean => [qw/all/],
median => [qw/all/],
mode => [qw/all/],
);
sub sum (&@) {
my ($cb, @params) = @_;
my $sum = 0;
for (@params) {
$sum += $cb->($_);
}
return $sum;
}
sub min (&@) {
my ($cb, @params) = @_;
my $min;
for (@params) {
my $val = $cb->($_);
$min = $val if (! defined $min || $val < $min);
}
return $min;
}
sub max (&@) {
my ($cb, @params) = @_;
my $max;
for (@params) {
my $val = $cb->($_);
$max = $val if (! defined $max || $val > $max);
}
return $max;
}
sub mean (&@) {
my ($cb, @params) = @_;
my $sum;
for (@params) {
$sum += $cb->($_);
}
return $sum / scalar @params;
}
sub median (&@) {
my ($cb, @params) = @_;
my @median;
for (@params) {
push @median, $cb->($_);
}
@median = sort @median;
my $m = int(scalar @median / 2);
$m++ if ($m % 2 != 0);
return $median[$m];
}
sub mode (&@) {
my ($cb, @params) = @_;
my %map;
for (@params) {
$map{$cb->($_)}++;
}
my ($mode, $max) = ('', 0);
for my $k ( keys %map ) {
if ($map{$k} > $max) {
$mode = $k;
$max = $map{$k};
}
}
return $mode;
}
1;
__END__
=head1 NAME
Math::Basic - basic math
=head1 VERSION
Version 1.00
=cut
=head1 SYNOPSIS
use Math::Basic qw/all/;
my $sum = sum { $_->value } @objects;
=head1 EXPORT
=head2 min
my $min = min { $_ } @numbers;
=cut
=head2 max
my $max = max { $_ } @numbers;
=cut
=head2 sum
my $sum = sum { $_ } @numbers;
=cut
=head2 mean
my $mean = mean { $_ } @numbers;
=cut
=head2 median
my $median = median { $_ } @numbers;
=cut
=head2 mode
my $mode = mode { $_ } @numbers;
=cut
=head1 AUTHOR
LNATION, C<< <email at lnation.org> >>
=head1 BUGS
Please report any bugs or feature requests to C<bug-math-basic at rt.cpan.org>, or through
the web interface at L<https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Math-Basic>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Math::Basic
You can also look for information at:
=over 4
=item * RT: CPAN's request tracker (report bugs here)
=item * CPAN Ratings
=item * Search CPAN
=back
=head1 ACKNOWLEDGEMENTS
=head1 LICENSE AND COPYRIGHT
This software is Copyright (c) 2025 by LNATION.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)
=cut
1; # End of Math::Basic