Raku의 batch — 리스트·공급을 묶음으로 나누기
Raku의 batch — 리스트·공급을 묶음으로 나누기
큰 리스트나 흐르는 값을 일정한 크기로 묶어 다루고 싶을 때가 있어요. batch 메서드는 리스트(List)와 공급(Supply)에서 값들을 묶음(batch)으로 나눠 줘요. 리스트에서는 개수 기준으로, 공급에서는 개수나 시간 기준으로 묶을 수 있어요.
본문
In List
multi method batch(Int:D $batch --> Seq)
multi method batch(Int:D :$elems --> Seq)
리스트의 시퀀스(sequence)를 돌려주는데, 마지막 목록을 제외한 각 목록은 $batch 또는 $elems로 지정한 묶음 크기만큼의 원소를 갖는 게 보장돼요. 원소 수가 묶음 크기의 정수 배수가 아니면, 마지막 목록에 남은 원소들이 담겨서 $batch/$elems보다 적은 원소를 갖게 돼요. 즉 .batch($batch)는 .rotor($batch, :partial)의 줄임말이에요.
In Any
multi method batch(Int:D $batch)
multi method batch(Int:D :$elems!)
호출한 객체를 .list 메서드로 리스트로 강제한 뒤 그 리스트에 List.batch를 적용해요. 어떤 객체든 우선 리스트로 바꾸어 batch를 쓸 수 있게 해 주는 거예요.
In Supply
method batch(Supply:D: :$elems, :$seconds, :$emit-timed --> Supply:D)
주어진 공급의 값들을 묶음 개수(:elems)나 시간(:seconds), 또는 둘 다로 묶는 새 공급을 만들어요. 공급이 끝나면 남은 값들이 마지막 묶음으로 내보내져요.
:emit-timed를 지정하면 타이머가 돌면서, 지정한 :seconds마다 그 묶음 안에 값이 있으면 현재 담긴 값을 내보내요.
한 가지 기억할 점이 있어요. Rakudo 2020.12 릴리스부터 :seconds 인자는 밀리초 단위까지 가질 수 있어요. 예를 들어 1밀리초는 :seconds(0.001)로 지정할 수 있죠. 그 이전 릴리스에서는 초 단위였어요.