Let's say I want all permutations of 2 letters out of a, b and c.
I can do:
my @perm = <a b c>.combinations(2)».permutations;
say @perm;
# [((a b) (b a)) ((a c) (c a)) ((b c) (c b))]
which is close, but not exactly what I need. How do I “flatten” this so that I get:
# [(a b) (b a) (a c) (c a) (b c) (c b)]
?
See also "a better way to accomplish what I (OP) wanted".
See also "Some possible solutions" answer to "How can I completely flatten a Perl 6 list (of lists (of lists) … )" question.
Add a subscript
Notes
I used a non-sigil'd variable because I think it's a bit clearer what's going on for those who don't know Perl 6.
I didn't append the subscript to the original expression but I could have:
Ultimately, you are building your list the wrong way to begin with. You can
slip
your permutations into the outer list like this.Which yields the following list
According to the Bench module, this is about 300% faster than doing
However, you may be better of to destructure the LoL when you use it later in the program. A map on a long list can take a jolly long time.
By inserting slips as appropriate, eg via
or
Invoking
.Array
in the first example is unnecessary if you're fine with aSeq
, and can be replaced with calls to.list
or.cache
(supplied by PositionalBindFailover) if mutability is not needed.In the second example, the prefix
|
operator could be used instead of theslip
sub.