`antipairs`

antipairs (키와 값을 뒤집어 Pair의 Seq로)

pairs는 값을 키로, 인덱스를 값으로 넣어주죠. 그 반대 방향이 필요할 때가 있어요. 컬렉션의 값을 키로, 그 위치나 무게를 값으로 갖는 Pair 목록을 얻고 싶다면 antipairs를 쓰면 돼요.

출처: Raku Documentation — routine antipairs

본문

List

method antipairs(List:D: --> Seq:D)

각 값을 키로, 인덱스를 값으로 갖는 Pair의 Seq를 돌려줘요. 말 그대로 pairs와 정반대예요.

say <a b c>.antipairs;  # OUTPUT: «(a => 0 b => 1 c => 2)␤»

Map

method antipairs(Map:D: --> Seq:D)

모든 키와 값을 서로 바꾼 Pair의 Seq를 돌려줘요. 즉 pairs 메서드의 반대죠. 단 invert 메서드와 달리, 리스트 값을 여러 개의 Pair로 펼치려는 시도는 하지 않아요.

my $m = Map.new('a' => (2, 3), 'b' => 17);
say $m.antipairs;                        # OUTPUT: «((2 3) => a 17 => b)␤»

Any

multi method antipairs(Any:U:)
multi method antipairs(Any:D:)

인보컨트가 타입 객체라면 빈 List를 돌려줘요.

Range.antipairs.say; # OUTPUT: «()␤»

값 객체라면 그 값을 Pair 목록으로 바꾼 뒤 뒤집어서 돌려줘요. 값은 키가 되고 키는 값이 되죠.

%(s => 1, t=> 2, u => 3).antipairs.say ;# OUTPUT: «(2 => t 1 => s 3 => u)␤»

role Setty

multi method antipairs(Setty:D: --> Seq:D)

집합의 모든 원소와 True를 Pair의 Seq로 돌려줘요. 여기서 원소 자체가 값이 되고, pairs 메서드의 반대예요.

my $s = Set.new(1, 2, 3, 1);
say $s.antipairs.sort;                            # OUTPUT: «(True => 1 True => 2 True => 3)␤»

Capture

multi method antipairs(Capture:D: --> Seq:D)

Capture를 위치 인자 다음에 이름 인자 순서로 모두 꺼내, 키와 값이 맞바뀐 Pair의 Seq로 돌려줘요. 값은 키가, 키는 값이 되죠. 이것도 pairs 메서드와 반대되는 동작이에요.

my $capture = \(2, 3, apples => (red => 2));
say $capture.antipairs; # OUTPUT: «(2 => 0 3 => 1 (red => 2) => apples)␤»

role Baggy

method antipairs(Baggy:D: --> Seq:D)

모든 원소와 그 무게를 Pair의 Seq로 돌려줘요. 원소 자체가 값, 그 원소의 무게가 키가 되는, 역시 pairs의 반대예요.

my $breakfast = bag <bacon eggs bacon>;
my $seq = $breakfast.antipairs;
say $seq.sort;                                    # OUTPUT: «(1 => eggs 2 => bacon)␤»

Pair

multi method antipairs(Pair:D:)

인보컨트의 antipair를 담은 List를 돌려줘요.

my $p = (d => 'Raku').antipairs;
say $p.^name;                                     # OUTPUT: «List␤»
say $p.first;                                     # OUTPUT: «Raku => d␤»
say $p.first.^name;                               # OUTPUT: «Pair␤»