NAME
Mojo::Collection::Role::UtilsBy - List::UtilsBy methods for Mojo::Collection
SYNOPSIS
use Mojo::Collection 'c';
my $c = c(1..12)->with_roles('+UtilsBy');
say 'Reverse lexical order: ', $c->rev_sort_by(sub { $_ })->join(',');
use List::Util 'product';
say "Product of 3 elements: $_" for $c->bundle_by(sub { product(@_) }, 3)->each;
my $partitions = $c->partition_by(sub { $_ % 4 });
# { 0 => c(4,8,12), 1 => c(1,5,9), 2 => c(2,6,10), 3 => c(3,7,11) }
my $halves_and_remainders = $c->unzip_by(sub { (int($_ / 2), $_ % 2) });
# c(c(0,1,1,2,2,3,3,4,4,5,5,6), c(1,0,1,0,1,0,1,0,1,0,1,0))
my $transposed = $halves_and_remainders->zip_by(sub { c(@_) });
# c(c(0,1), c(1,0), c(1,1), c(2,0), c(2,1), c(3,0), c(3,1), c(4,0), c(4,1), c(5,0), c(5,1), c(6,0))
my $evens = $c->extract_by(sub { $_ % 2 == 0 }); # $c now contains only odd numbers
DESCRIPTION
A role to augment Mojo::Collection with methods that call functions from List::UtilsBy. With the exception of "bundle_by" and "zip_by" which pass multiple elements in @_
, all passed callbacks will be called with both $_
and $_[0]
set to the current element in the iteration.
METHODS
Mojo::Collection::Role::UtilsBy composes the following methods.
all_max_by
my $collection = $c->all_max_by(sub { $_->num });
Return a new collection containing all of the elements that share the numerically largest result from the passed function, using "max_by" in List::UtilsBy.
all_min_by
my $collection = $c->all_min_by(sub { $_->num });
Return a new collection containing all of the elements that share the numerically smallest result from the passed function, using "min_by" in List::UtilsBy.
bundle_by
my $collection = $c->bundle_by(sub { c(@_) }, $n);
Return a new collection containing the results from the passed function, given input elements in bundles of (up to) $n
at a time, using "bundle_by" in List::UtilsBy. The passed function will receive each bundle of inputs in @_
, and will receive less than $n
if not enough elements remain.
count_by
my $hashref = $c->count_by(sub { $_->name });
Return a hashref where the values are the number of times each key was returned from the passed function, using "count_by" in List::UtilsBy.
extract_by
my $collection = $c->extract_by(sub { $_->num > 5 });
Remove elements from the collection that return true from the passed function, and return a new collection containing the removed elements, using "extract_by" in List::UtilsBy.
extract_first_by
my $element = $c->extract_first_by(sub { $_->name eq 'Fred' });
Remove and return the first element from the collection that returns true from the passed function, using "extract_first_by" in List::UtilsBy.
max_by
my $element = $c->max_by(sub { $_->num });
Return the (first) element from the collection that returns the numerically largest result from the passed function, using "max_by" in List::UtilsBy.
min_by
my $element = $c->min_by(sub { $_->num });
Return the (first) element from the collection that returns the numerically smallest result from the passed function, using "min_by" in List::UtilsBy.
nsort_by
my $collection = $c->nsort_by(sub { $_->num });
Return a new collection containing the elements sorted numerically by the results from the passed function, using "nsort_by" in List::UtilsBy.
partition_by
my $hashref = $c->partition_by(sub { $_->name });
Return a hashref where the values are collections of the elements that returned that key from the passed function, using "partition_by" in List::UtilsBy.
rev_nsort_by
my $collection = $c->rev_nsort_by(sub { $_->num });
Return a new collection containing the elements sorted numerically in reverse by the results from the passed function, using "rev_nsort_by" in List::UtilsBy.
rev_sort_by
my $collection = $c->rev_sort_by(sub { $_->name });
Return a new collection containing the elements sorted lexically in reverse by the results from the passed function, using "rev_sort_by" in List::UtilsBy.
sort_by
my $collection = $c->sort_by(sub { $_->name });
Return a new collection containing the elements sorted lexically by the results from the passed function, using "sort_by" in List::UtilsBy.
uniq_by
my $collection = $c->uniq_by(sub { $_->name });
Return a new collection containing the elements that return stringwise unique values from the passed function, using "uniq_by" in List::UtilsBy.
unzip_by
my $collection = $c->unzip_by(sub { ($_->name, $_->num) });
my ($names, $nums) = @$collection_of_collections;
Return a collection of collections where each collection contains the results at the corresponding position from the lists returned by the passed function, using "unzip_by" in List::UtilsBy. If the lists are uneven, the collections will contain undef
in the positions without a corresponding value.
weighted_shuffle_by
my $collection = $c->weighted_shuffle_by(sub { $_->num });
Return a new collection containing the elements shuffled with weighting according to the results from the passed function, using "weighted_shuffle_by" in List::UtilsBy.
zip_by
my $collection = $c->zip_by(sub { c(@_) });
Return a new collection containing the results from the passed function when invoked with values from the corresponding position across all inner arrays, using "zip_by" in List::UtilsBy. This method must be called on a collection that only contains array references or collection objects. The passed function will receive each list of elements in @_
. If the arrays are uneven, undef
will be passed in the positions without a corresponding value.
BUGS
Report any issues on the public bugtracker.
AUTHOR
Dan Book <dbook@cpan.org>
COPYRIGHT AND LICENSE
This software is Copyright (c) 2017 by Dan Book.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)