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) SEE ALSO Mojo::Collection, List::UtilsBy