method categorize-list
Documentation for method categorize-list assembled from the following types:
class Hash
From Hash
(Hash) method categorize-list
Defined as:
multi method categorize-list(&mapper, *@list, :&as --> Hash:D) multi method categorize-list(%mapper, *@list, :&as --> Hash:D) multi method categorize-list(@mapper, *@list, :&as --> Hash:D)
Populates a Hash by classifying the possibly-empty @list of values using the given mapper, optionally altering the values using the :&as Callable. The @list cannot be lazy.
The mapper can be a Callable that takes a single argument, an Associative, or an Iterable. With Associative and an Iterable mappers, the values in the @list represent the key and index of the mapper's value respectively. A Callable mapper will be executed once per each item in the @list, with that item as the argument and its return value will be used as the mapper's value.
Simple categorization
The mapper's value is expected to be a possibly empty list of non-Iterables that represent categories to place the value into:
say % .categorize-list: {
gather {
take 'prime' if .is-prime;
take 'largish' if $_ > 5;
take $_ %% 2 ?? 'even' !! 'odd';
}
}, ^10;
# OUTPUT:
# {
# prime => [2 3 5 7]
# even => [0 2 4 6 8],
# odd => [1 3 5 7 9],
# largish => [6 7 8 9],
# }
Notice how some items, e.g. 6 and 7, are present in several categories.
Multi-level categorization
In multi-level categorization, the categories produced by the mapper are Iterables and categorization combines features of classify, by producing nested hashes of classifications for each category.
say % .categorize-list: {
[
$_ > 5 ?? 'largish' !! 'smallish',
.is-prime ?? 'prime' !! 'non-prime',
],
}, ^10;
# OUTPUT:
# {
# largish => {
# non-prime => [6 8 9],
# prime => [7]
# },
# smallish => {
# non-prime => [0 1 4],
# prime => [2 3 5]
# }
# }
The mapper in the snippet above produces a single-item list (note the significant trailing comma) with a two-item Array in it. The first item in that array indicates the first level of classification: the largish/smallish categories the routine produces. The second item in that array indicates further levels of classification, in our case the classification into prime/non-prime inside of each category.
NOTE:: every Iterables category must have the same number of elements, or the method will throw an exception. This restriction exists to avoid conflicts when the same key is a leaf of one value's classification but a node of another value's classification.
:&as value modifier
If :&as Callable argument is specified, it will be called once per each item of @list, with the value as the argument, and its return value will be used instead of the original @list's item:
say % .categorize-list: :as{"Value is $_"}, { $_ %% 2 ?? 'even' !! 'odd' }, ^5;
# OUTPUT (slightly altered manually, for clarity):
# {
# even => ['Value is 0', 'Value is 2', 'Value is 4'],
# odd => ['Value is 1', 'Value is 3']
# }
role Baggy
From Baggy
(Baggy) method categorize-list
Defined as:
multi method categorize-list(&mapper, *@list --> Baggy:D) multi method categorize-list(%mapper, *@list --> Baggy:D) multi method categorize-list(@mapper, *@list --> Baggy:D)
Populates a mutable Baggy by categorizing the possibly-empty @list of values using the given mapper. The @list cannot be lazy.
say BagHash.new.categorize-list: {
gather {
take 'largish' if $_ > 5;
take .is-prime ?? 'prime' !! 'non-prime';
take $_ %% 2 ?? 'even' !! 'odd';
}
}, ^10;
# OUTPUT: BagHash.new(largish(4), even(5), non-prime(6), prime(4), odd(5))
my %mapper = :sugar<sweet white>, :lemon<sour>, :cake('sweet', 'is a lie');
say MixHash.new.categorize-list: %mapper, <sugar lemon cake>;
# OUTPUT: MixHash.new(is a lie, sour, white, sweet(2))
The mapper can be a Callable that takes a single argument, an Associative, or an Iterable. With Associative and an Iterable mappers, the values in the @list represent the key and index of the mapper's value respectively. A Callable mapper will be executed once per each item in the @list, with that item as the argument and its return value will be used as the mapper's value.
The mapper's value is used as a possibly-empty list of keys of the Baggy that will be incremented by 1.
Note: unlike the Hash's .categorize-list, returning a list of Iterables as mapper's value will throw, as Baggy types do not support nested categorization. For the same reason, Baggy's .categorize-list does not accept :&as parameter.