tee3

한 번의 순회로 세 개의 폴드를 굴립니다 — 리덕션이 하나 더 붙은 tee.

typedef Fold<A, R> = ({R seed, R Function(R acc, A a) step}); (R1, R2, R3) tee3<A, R1, R2, R3>(Iterable<A> iterable, Fold<A, R1> first, Fold<A, R2> second, Fold<A, R3> third)

강의

tee3는 폴드가 하나 더 붙은 tee입니다. tee 페이지가 설명하는 내용은 그대로 적용됩니다 — 다음 원소를 당기기 전에 각 원소가 모든 누산기를 전진시키므로 소스는 정확히 한 번만 순회되고 버퍼링도 없으며, 누산기들은 서로 독립적이고 타입이 같을 필요도 없고, 리더는 파이프라인이 아니라 폴드여야 합니다. 그 이유와, fork가 더 나은 선택인 경우는 그 페이지를 먼저 읽어 보세요.

Dart에는 가변 제네릭이 없어서 각 항수(arity)가 별도의 함수가 됩니다 — zip 옆에 zip3가 있는 것과 같은 이유입니다. 이름을 붙일 만한 경우는 둘과 셋까지이고, 그 이상이라면 직접 만든 작은 레코드나 클래스로 접으면서 평범한 fold를 쓰세요.

데모 · 한 번 읽어서 얻는 합계, 최댓값, 개수

sensor()는 자기가 내놓은 값의 수를 셉니다. 따로 세 번 순회했다면 reads는 18이 되지만, tee3는 6에서 멈춥니다:

관련 항목: tee — 두 폴드 버전, 그리고 전체 설명 · fork — 버퍼를 대가로 한 독립 리더 · fold — 폴드 하나