NAME
Data::Bucketeer - sort data into buckets based on threshholds
VERSION
version 0.001
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 $_" },
});
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 <rjbs@cpan.org>
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.