raku-type-predictiveiterator

PredictiveIterator는 특별한 종류의 Iterator예요. 값을 실제로 만들어 내지 않고도, 자기 자신이 앞으로(여전히) 몇 개의 값을 만들어 낼 수 있는지를 미리 알 수 있는 이터레이터죠.

Iterator 역할의 API에 추가된 핵심은 count-only 메서드예요. 이 메서드는 이터레이터가 여전히 만들어 낼 수 있는 값의 개수를 돌려줘야 해요.

또 하나 추가된 건 bool-only 메서드인데, 이터레이터가 아직 값을 만들어 낼 수 있는지(즉 소진되지 않았는지)를 나타내는 Bool을 돌려줘요. 기본값은 count-only 메서드 호출 결과를 불리언으로 바꾼 값이에요.

Methods

method count-only

method count-only(--> Int:D) { ... }

이 메서드는 이터레이터가 값을 실제로 만들지 않고 여전히 만들어 낼 수 있는 값의 개수를 돌려줄 것으로 기대돼요. 그리고 이미 끌어낸 항목만큼 반환값이 스스로 조정되어야 해요. 그래야 부분적으로 소비된 Iterator에서도 이 메서드를 호출할 수 있죠.

이터레이터의 값 개수만 필요할 때, 예를 들어 .elems 메서드를 부를 때처럼 쓰여요.

중요한 점은, 이 메서드를 구현한 Iterator값을 만들어 내지 않고도 그 개수를 돌려줄 수 있어야 한다는 거예요. 다시 말해 이 메서드를 호출한 뒤에도 여전히 pull-one을 할 수 있어서, 결국 이 메서드가 돌려준 개수만큼의 값을 받을 수 있어야 해요.

method bool-only

기본적으로 count-only 메서드 호출 결과를 불리언으로 만든 값이에요. 이터레이터가 값을 만들 수 있는지 더 빠르게 알아낼 방법이 있다면 그걸 구현하면 돼요.

method bool-only(--> Bool:D) { self.count-only.Bool }