`antipairs`
antipairs (키와 값을 뒤집어 Pair의 Seq로)
pairs는 값을 키로, 인덱스를 값으로 넣어주죠. 그 반대 방향이 필요할 때가 있어요. 컬렉션의 값을 키로, 그 위치나 무게를 값으로 갖는 Pair 목록을 얻고 싶다면 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»