NAME
Data::Bucketeer - sort data into buckets based on thresholds
VERSION
version 0.006
OVERVIEW
Data::Bucketeer lets you easily map values in ranges to results. It's for doing table lookups where you're looking for the key in a range, not a list of fixed values.
For example, you sell widgets with prices based on quantity:
YOU ORDER | YOU PAY, EACH
-------------+---------------
1 - 100 | 10 USD
101 - 200 | 5 USD
201 - 500 | 4 USD
501 - 1000 | 3 USD
1001+ | 2 USD
This can be easily turned into a bucketeer:
use Data::Bucketeer;
my $buck = Data::Bucketeer->new({
0 => 10,
100 => 5,
200 => 4,
500 => 3,
1000 => 2,
});
my $cost = $buck->result_for( 701 ); # cost is 3
By default, the values exclusive minima. For example, above, you end up with a result of 3
by having an input strictly greater than
500, and less than or equal to
500. If you want to use a different operator, you can specify it like this:
my $buck = Data::Bucketeer->new( '>=', {
1 => 10,
101 => 5,
201 => 4,
501 => 3,
1001 => 2,
});
my $cost = $buck->result_for( 701 ); # cost is 3
This distinction can be useful when dealing with non-integers. The understood operators are:
>
>=
<=
<
If the result value is a code reference, it will be invoked with $_
set to the input. This can be used for dynamically generating results, or to throw exceptions. Here is a contrived example of exception-throwing:
my $greeting = Data::Bucketeer->new( '>=', {
'-Inf' => sub { die "secs-into-day must be between 0 and 86399; got $_" },
0 => "Good evening.",
28_800 => "Good morning.",
43_200 => "Good afternoon.",
61_200 => "Good evening.",
86_400 => sub { die "secs-into-day must be between 0 and 86399; got $_" },
});
PERL VERSION
This library should run on perls released even a long time ago. It should work on any version of perl released in the last five years.
Although it may work on older versions of perl, no guarantee is made that the minimum required version will not be increased. The version may be increased for any reason, and there is no promise that patches will be accepted to lower the minimum required perl.
METHODS
result_for
my $result = $buck->result_for( $input );
This returns the result for the given input, as described above.
bound_and_result_for
my ($bound, $result) = $buck->bound_and_result_for( $input );
This returns two values: the boundary key whose result was used, and the result itself.
Using the item quantity price above, for example:
my $buck = Data::Bucketeer->new({
0 => 10,
100 => 5,
200 => 4,
500 => 3,
1000 => 2,
});
my ($bound, $cost) = $buck->bound_and_result_for( 701 );
# $bound is 500
# $cost is 3
AUTHOR
Ricardo Signes <cpan@semiotic.systems>
CONTRIBUTORS
Graham Knop <haarg@haarg.org>
Ricardo Signes <rjbs@semiotic.systems>
Ricardo Signes <rjbs@users.noreply.github.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2011 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.