method duckmap
Documentation for method duckmap
assembled from the following types:
class Any
From Any
(Any) method duckmap
Defined as:
method duckmap() is rw is nodal
duckmap
will apply &block
on each element that behaves in such a way that &block
can be applied. If it fails, it will descend recursively if possible, or otherwise return the item without any transformation.
<a b c d e f g>.duckmap(-> where <c d e>.any ).say;# OUTPUT: «(a b C D E f g)»(('d', 'e'), 'f').duckmap(-> where <e f>.any ).say;# OUTPUT: «((d E) F)»
In the first case, it is applied to c
, d
and e
which are the ones that meet the conditions for the block ({ .uc }
) to be applied; the rest are returned as is.
In the second case, the first item is a list that does not meet the condition, so it's visited; that flat list will behave in the same way as the first one. In this case:
say [[1,2,3],[[4,5],6,7]].duckmap( *² ); # OUTPUT: «[9 9]»
You can square anything as long as it behaves like a number. In this case, there are two arrays with 3 elements each; these arrays will be converted into the number 3 and squared. In the next case, however
say [[1,2,3],[[4,5],6.1,7.2]].duckmap( -> Rat );# OUTPUT: «[[1 2 3] [[4 5] 37.21 51.84]]»
3-item lists are not Rat
, so it descends recursively, but eventually only applies the operation to those that walk (or slither, as the case may be) like a Rat
.
Although on the surface (and name), duckmap
might look similar to deepmap
, the latter is applied recursively regardless of the type of the item.